blob: 034bb07b05bcdd110949515793d061c382f89706 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000024#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000025#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000026#include "llvm/ADT/Triple.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000027#include "llvm/IR/Type.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000030#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000031#include <memory>
Chris Lattner5ba61f02006-10-14 07:39:34 +000032using namespace clang;
33
Chris Lattner5ba61f02006-10-14 07:39:34 +000034//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000035// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000036//===----------------------------------------------------------------------===//
37
Chris Lattner1e1c0b92009-03-20 16:06:38 +000038/// DefineStd - Define a macro name and standard variants. For example if
39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000041static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000042 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000044
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46 // in the user's namespace.
47 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000048 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055}
56
Benjamin Kramere3b442d2012-01-10 11:50:09 +000057static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58 bool Tuning = true) {
59 Builder.defineMacro("__" + CPUName);
60 Builder.defineMacro("__" + CPUName + "__");
61 if (Tuning)
62 Builder.defineMacro("__tune_" + CPUName + "__");
63}
64
Chris Lattner09d98f52008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000068
Torok Edwinb2b37c62009-06-30 17:10:35 +000069namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000072protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000074 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000075public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000076 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000077 void getTargetDefines(const LangOptions &Opts,
78 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000079 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000081 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000082
83};
Chris Lattner859c37a2009-08-12 06:24:27 +000084} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000085
Chris Lattner30ba6742009-08-10 19:03:04 +000086
Daniel Dunbard86666f2010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000091 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000092 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000094 // AddressSanitizer doesn't play well with source fortification, which is on
95 // by default on Darwin.
Will Dietzf54319c2013-01-18 11:30:38 +000096 if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000097
John McCall5d36a8c2011-06-16 00:03:19 +000098 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +000099 // __weak is always defined, for use in blocks and with objc pointers.
100 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000101
John McCall31168b02011-06-15 23:02:42 +0000102 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000103 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000104 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
105 else
106 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000107
John McCall31168b02011-06-15 23:02:42 +0000108 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
109 // allow this in C, since one might have block pointers in structs that
110 // are used in pure C code and in Objective-C ARC.
111 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000112 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000113
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000114 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000115 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000116 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000118
119 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000121
Daniel Dunbarecf13562011-04-19 21:40:34 +0000122 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000123 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000124 if (Triple.isMacOSX()) {
125 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000126 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000127 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000128 Triple.getOSVersion(Maj, Min, Rev);
129 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000130 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000131
Sebastian Pop422377c2012-01-20 22:01:23 +0000132 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000133 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000134 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
135 if (PlatformName == "win32") {
136 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
137 return;
138 }
139
Evan Cheng31dd9a62014-01-26 23:12:43 +0000140 // Set the appropriate OS version define.
141 if (Triple.isiOS()) {
142 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
143 char Str[6];
144 Str[0] = '0' + Maj;
145 Str[1] = '0' + (Min / 10);
146 Str[2] = '0' + (Min % 10);
147 Str[3] = '0' + (Rev / 10);
148 Str[4] = '0' + (Rev % 10);
149 Str[5] = '\0';
150 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
151 Str);
152 } else if (Triple.isMacOSX()) {
153 // Note that the Driver allows versions which aren't representable in the
154 // define (because we only get a single digit for the minor and micro
155 // revision numbers). So, we limit them to the maximum representable
156 // version.
157 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
158 char Str[5];
159 Str[0] = '0' + (Maj / 10);
160 Str[1] = '0' + (Maj % 10);
161 Str[2] = '0' + std::min(Min, 9U);
162 Str[3] = '0' + std::min(Rev, 9U);
163 Str[4] = '\0';
164 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000165 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000166
Tim Northover157d9112014-01-16 08:48:16 +0000167 // Tell users about the kernel if there is one.
168 if (Triple.isOSDarwin())
169 Builder.defineMacro("__MACH__");
170
Daniel Dunbarecf13562011-04-19 21:40:34 +0000171 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000172}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000173
Chris Lattner30ba6742009-08-10 19:03:04 +0000174namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000175template<typename Target>
176class DarwinTargetInfo : public OSTargetInfo<Target> {
177protected:
Craig Topper3164f332014-03-11 03:39:26 +0000178 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
179 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000180 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000181 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000182 }
Mike Stump11289f42009-09-09 15:08:12 +0000183
Torok Edwinb2b37c62009-06-30 17:10:35 +0000184public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000185 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
186 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
187 this->MCountName = "\01mcount";
188 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000189
Craig Topper3164f332014-03-11 03:39:26 +0000190 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000191 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000192 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000193 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000194 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000195 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000196 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000197 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000198
Craig Topper3164f332014-03-11 03:39:26 +0000199 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000200 // FIXME: We should return 0 when building kexts.
201 return "__TEXT,__StaticInit,regular,pure_instructions";
202 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000203
John McCalleed64c72012-01-29 01:20:30 +0000204 /// Darwin does not support protected visibility. Darwin's "default"
205 /// is very similar to ELF's "protected"; Darwin requires a "weak"
206 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000207 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000208 return false;
209 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000210};
211
Chris Lattner30ba6742009-08-10 19:03:04 +0000212
Torok Edwinb2b37c62009-06-30 17:10:35 +0000213// DragonFlyBSD Target
214template<typename Target>
215class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
216protected:
Craig Topper3164f332014-03-11 03:39:26 +0000217 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
218 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000219 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000220 Builder.defineMacro("__DragonFly__");
221 Builder.defineMacro("__DragonFly_cc_version", "100001");
222 Builder.defineMacro("__ELF__");
223 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
224 Builder.defineMacro("__tune_i386__");
225 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000226 }
227public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000228 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
229 : OSTargetInfo<Target>(Triple) {
230 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000231
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000232 switch (Triple.getArch()) {
233 default:
234 case llvm::Triple::x86:
235 case llvm::Triple::x86_64:
236 this->MCountName = ".mcount";
237 break;
238 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000239 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000240};
241
242// FreeBSD Target
243template<typename Target>
244class FreeBSDTargetInfo : public OSTargetInfo<Target> {
245protected:
Craig Topper3164f332014-03-11 03:39:26 +0000246 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
247 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000248 // FreeBSD defines; list based off of gcc output
249
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000250 unsigned Release = Triple.getOSMajorVersion();
251 if (Release == 0U)
252 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000254 Builder.defineMacro("__FreeBSD__", Twine(Release));
255 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000256 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
257 DefineStd(Builder, "unix", Opts);
258 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000259
260 // On FreeBSD, wchar_t contains the number of the code point as
261 // used by the character set of the locale. These character sets are
262 // not necessarily a superset of ASCII.
263 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000264 }
265public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000266 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
267 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000268
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000269 switch (Triple.getArch()) {
270 default:
271 case llvm::Triple::x86:
272 case llvm::Triple::x86_64:
273 this->MCountName = ".mcount";
274 break;
275 case llvm::Triple::mips:
276 case llvm::Triple::mipsel:
277 case llvm::Triple::ppc:
278 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000279 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000280 this->MCountName = "_mcount";
281 break;
282 case llvm::Triple::arm:
283 this->MCountName = "__mcount";
284 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000285 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000286 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000287};
288
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000289// GNU/kFreeBSD Target
290template<typename Target>
291class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
292protected:
Craig Topper3164f332014-03-11 03:39:26 +0000293 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
294 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000295 // GNU/kFreeBSD defines; list based off of gcc output
296
297 DefineStd(Builder, "unix", Opts);
298 Builder.defineMacro("__FreeBSD_kernel__");
299 Builder.defineMacro("__GLIBC__");
300 Builder.defineMacro("__ELF__");
301 if (Opts.POSIXThreads)
302 Builder.defineMacro("_REENTRANT");
303 if (Opts.CPlusPlus)
304 Builder.defineMacro("_GNU_SOURCE");
305 }
306public:
Sylvestre Ledru15832282013-09-05 13:58:07 +0000307 KFreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000308 this->UserLabelPrefix = "";
309 }
310};
311
Chris Lattner3e2ee142010-07-07 16:01:42 +0000312// Minix Target
313template<typename Target>
314class MinixTargetInfo : public OSTargetInfo<Target> {
315protected:
Craig Topper3164f332014-03-11 03:39:26 +0000316 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
317 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000318 // Minix defines
319
320 Builder.defineMacro("__minix", "3");
321 Builder.defineMacro("_EM_WSIZE", "4");
322 Builder.defineMacro("_EM_PSIZE", "4");
323 Builder.defineMacro("_EM_SSIZE", "2");
324 Builder.defineMacro("_EM_LSIZE", "4");
325 Builder.defineMacro("_EM_FSIZE", "4");
326 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000327 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000328 DefineStd(Builder, "unix", Opts);
329 }
330public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000331 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
332 this->UserLabelPrefix = "";
333 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000334};
335
Torok Edwinb2b37c62009-06-30 17:10:35 +0000336// Linux target
337template<typename Target>
338class LinuxTargetInfo : public OSTargetInfo<Target> {
339protected:
Craig Topper3164f332014-03-11 03:39:26 +0000340 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
341 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000343 DefineStd(Builder, "unix", Opts);
344 DefineStd(Builder, "linux", Opts);
345 Builder.defineMacro("__gnu_linux__");
346 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000347 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000348 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000349 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000350 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000351 if (Opts.CPlusPlus)
352 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000353 }
354public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000355 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000356 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000357 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000358
359 switch (Triple.getArch()) {
360 default:
361 break;
362 case llvm::Triple::ppc:
363 case llvm::Triple::ppc64:
364 case llvm::Triple::ppc64le:
365 this->MCountName = "_mcount";
366 break;
367 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000368 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000369
Craig Topper3164f332014-03-11 03:39:26 +0000370 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000371 return ".text.startup";
372 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000373};
374
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000375// NetBSD Target
376template<typename Target>
377class NetBSDTargetInfo : public OSTargetInfo<Target> {
378protected:
Craig Topper3164f332014-03-11 03:39:26 +0000379 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
380 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000381 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000382 Builder.defineMacro("__NetBSD__");
383 Builder.defineMacro("__unix__");
384 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000385 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000386 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000387
388 switch (Triple.getArch()) {
389 default:
390 break;
391 case llvm::Triple::arm:
392 case llvm::Triple::armeb:
393 case llvm::Triple::thumb:
394 case llvm::Triple::thumbeb:
395 Builder.defineMacro("__ARM_DWARF_EH__");
396 break;
397 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000398 }
399public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000400 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
401 this->UserLabelPrefix = "";
402 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000403};
404
Torok Edwinb2b37c62009-06-30 17:10:35 +0000405// OpenBSD Target
406template<typename Target>
407class OpenBSDTargetInfo : public OSTargetInfo<Target> {
408protected:
Craig Topper3164f332014-03-11 03:39:26 +0000409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000411 // OpenBSD defines; list based off of gcc output
412
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000413 Builder.defineMacro("__OpenBSD__");
414 DefineStd(Builder, "unix", Opts);
415 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000416 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000417 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000418 }
419public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000420 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
421 this->UserLabelPrefix = "";
422 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000423
Eli Friedman3715d1f2011-12-15 02:15:56 +0000424 switch (Triple.getArch()) {
425 default:
426 case llvm::Triple::x86:
427 case llvm::Triple::x86_64:
428 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000429 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000430 this->MCountName = "__mcount";
431 break;
432 case llvm::Triple::mips64:
433 case llvm::Triple::mips64el:
434 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000435 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000436 this->MCountName = "_mcount";
437 break;
438 }
439 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000440};
441
Eli Friedman9fa28852012-08-08 23:57:20 +0000442// Bitrig Target
443template<typename Target>
444class BitrigTargetInfo : public OSTargetInfo<Target> {
445protected:
Craig Topper3164f332014-03-11 03:39:26 +0000446 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
447 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000448 // Bitrig defines; list based off of gcc output
449
450 Builder.defineMacro("__Bitrig__");
451 DefineStd(Builder, "unix", Opts);
452 Builder.defineMacro("__ELF__");
453 if (Opts.POSIXThreads)
454 Builder.defineMacro("_REENTRANT");
455 }
456public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000457 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
458 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000459 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000460 }
461};
462
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000463// PSP Target
464template<typename Target>
465class PSPTargetInfo : public OSTargetInfo<Target> {
466protected:
Craig Topper3164f332014-03-11 03:39:26 +0000467 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
468 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000469 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000470 Builder.defineMacro("PSP");
471 Builder.defineMacro("_PSP");
472 Builder.defineMacro("__psp__");
473 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000474 }
475public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000476 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000477 this->UserLabelPrefix = "";
478 }
479};
480
John Thompsone467e192009-11-19 17:18:50 +0000481// PS3 PPU Target
482template<typename Target>
483class PS3PPUTargetInfo : public OSTargetInfo<Target> {
484protected:
Craig Topper3164f332014-03-11 03:39:26 +0000485 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
486 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000487 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000488 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000489 Builder.defineMacro("__PPU__");
490 Builder.defineMacro("__CELLOS_LV2__");
491 Builder.defineMacro("__ELF__");
492 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000493 Builder.defineMacro("_ARCH_PPC64");
494 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000495 }
496public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000497 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000498 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000499 this->LongWidth = this->LongAlign = 32;
500 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000501 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000502 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000503 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000504 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000505 }
506};
507
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000508// AuroraUX target
509template<typename Target>
510class AuroraUXTargetInfo : public OSTargetInfo<Target> {
511protected:
Craig Topper3164f332014-03-11 03:39:26 +0000512 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
513 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000514 DefineStd(Builder, "sun", Opts);
515 DefineStd(Builder, "unix", Opts);
516 Builder.defineMacro("__ELF__");
517 Builder.defineMacro("__svr4__");
518 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000519 }
520public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000521 AuroraUXTargetInfo(const llvm::Triple &Triple)
522 : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000523 this->UserLabelPrefix = "";
524 this->WCharType = this->SignedLong;
525 // FIXME: WIntType should be SignedLong
526 }
527};
528
Torok Edwinb2b37c62009-06-30 17:10:35 +0000529// Solaris target
530template<typename Target>
531class SolarisTargetInfo : public OSTargetInfo<Target> {
532protected:
Craig Topper3164f332014-03-11 03:39:26 +0000533 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
534 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000535 DefineStd(Builder, "sun", Opts);
536 DefineStd(Builder, "unix", Opts);
537 Builder.defineMacro("__ELF__");
538 Builder.defineMacro("__svr4__");
539 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000540 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
541 // newer, but to 500 for everything else. feature_test.h has a check to
542 // ensure that you are not using C99 with an old version of X/Open or C89
543 // with a new version.
544 if (Opts.C99 || Opts.C11)
545 Builder.defineMacro("_XOPEN_SOURCE", "600");
546 else
547 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000548 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000549 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000550 Builder.defineMacro("_LARGEFILE_SOURCE");
551 Builder.defineMacro("_LARGEFILE64_SOURCE");
552 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000553 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000554 }
555public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000556 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000557 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000558 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000559 // FIXME: WIntType should be SignedLong
560 }
561};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000562
563// Windows target
564template<typename Target>
565class WindowsTargetInfo : public OSTargetInfo<Target> {
566protected:
Craig Topper3164f332014-03-11 03:39:26 +0000567 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
568 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000569 Builder.defineMacro("_WIN32");
570 }
571 void getVisualStudioDefines(const LangOptions &Opts,
572 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000573 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000574 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000575 Builder.defineMacro("_CPPRTTI");
576
577 if (Opts.Exceptions)
578 Builder.defineMacro("_CPPUNWIND");
579 }
580
581 if (!Opts.CharIsSigned)
582 Builder.defineMacro("_CHAR_UNSIGNED");
583
584 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
585 // but it works for now.
586 if (Opts.POSIXThreads)
587 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000588
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000589 if (Opts.MSCompatibilityVersion) {
590 Builder.defineMacro("_MSC_VER",
591 Twine(Opts.MSCompatibilityVersion / 100000));
592 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000593 // FIXME We cannot encode the revision information into 32-bits
594 Builder.defineMacro("_MSC_BUILD", Twine(1));
595 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000596
597 if (Opts.MicrosoftExt) {
598 Builder.defineMacro("_MSC_EXTENSIONS");
599
600 if (Opts.CPlusPlus11) {
601 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
602 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
603 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
604 }
605 }
606
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000607 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000608 }
609
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000610public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000611 WindowsTargetInfo(const llvm::Triple &Triple)
612 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000613};
614
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000615template <typename Target>
616class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000617protected:
Craig Topper3164f332014-03-11 03:39:26 +0000618 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
619 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000620 if (Opts.POSIXThreads)
621 Builder.defineMacro("_REENTRANT");
622 if (Opts.CPlusPlus)
623 Builder.defineMacro("_GNU_SOURCE");
624
625 DefineStd(Builder, "unix", Opts);
626 Builder.defineMacro("__ELF__");
627 Builder.defineMacro("__native_client__");
628 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000629
630public:
631 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000632 this->UserLabelPrefix = "";
633 this->LongAlign = 32;
634 this->LongWidth = 32;
635 this->PointerAlign = 32;
636 this->PointerWidth = 32;
637 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000638 this->Int64Type = TargetInfo::SignedLongLong;
639 this->DoubleAlign = 64;
640 this->LongDoubleWidth = 64;
641 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000642 this->LongLongWidth = 64;
643 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000644 this->SizeType = TargetInfo::UnsignedInt;
645 this->PtrDiffType = TargetInfo::SignedInt;
646 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000647 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000648 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000649 if (Triple.getArch() == llvm::Triple::arm) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000650 this->DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000651 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000652 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000653 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000654 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000655 } else if (Triple.getArch() == llvm::Triple::mipsel) {
656 // Handled on mips' setDescriptionString.
657 } else {
658 assert(Triple.getArch() == llvm::Triple::le32);
659 this->DescriptionString = "e-p:32:32-i64:64";
660 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000661 }
Craig Topper3164f332014-03-11 03:39:26 +0000662 typename Target::CallingConvCheckResult checkCallingConvention(
663 CallingConv CC) const override {
Derek Schuffa2020962012-10-16 22:30:41 +0000664 return CC == CC_PnaclCall ? Target::CCCR_OK :
665 Target::checkCallingConvention(CC);
666 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000667};
Mike Stump11289f42009-09-09 15:08:12 +0000668} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000669
Chris Lattner09d98f52008-10-05 21:50:58 +0000670//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000671// Specific target implementations.
672//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000673
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000674namespace {
675// PPC abstract base class
676class PPCTargetInfo : public TargetInfo {
677 static const Builtin::Info BuiltinInfo[];
678 static const char * const GCCRegNames[];
679 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000680 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000681
682 // Target cpu features.
683 bool HasVSX;
684
Ulrich Weigand8afad612014-07-28 13:17:52 +0000685protected:
686 std::string ABI;
687
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000688public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000689 PPCTargetInfo(const llvm::Triple &Triple)
690 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000691 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000692 LongDoubleWidth = LongDoubleAlign = 128;
693 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
694 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000695
Hal Finkel6b984f02012-07-03 16:51:04 +0000696 /// \brief Flags for architecture specific defines.
697 typedef enum {
698 ArchDefineNone = 0,
699 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
700 ArchDefinePpcgr = 1 << 1,
701 ArchDefinePpcsq = 1 << 2,
702 ArchDefine440 = 1 << 3,
703 ArchDefine603 = 1 << 4,
704 ArchDefine604 = 1 << 5,
705 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000706 ArchDefinePwr5 = 1 << 7,
707 ArchDefinePwr5x = 1 << 8,
708 ArchDefinePwr6 = 1 << 9,
709 ArchDefinePwr6x = 1 << 10,
710 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000711 ArchDefinePwr8 = 1 << 12,
712 ArchDefineA2 = 1 << 13,
713 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000714 } ArchDefineTypes;
715
Bill Schmidt38378a02013-02-01 20:23:10 +0000716 // Note: GCC recognizes the following additional cpus:
717 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
718 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
719 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000720 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000721 bool CPUKnown = llvm::StringSwitch<bool>(Name)
722 .Case("generic", true)
723 .Case("440", true)
724 .Case("450", true)
725 .Case("601", true)
726 .Case("602", true)
727 .Case("603", true)
728 .Case("603e", true)
729 .Case("603ev", true)
730 .Case("604", true)
731 .Case("604e", true)
732 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000733 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000734 .Case("g3", true)
735 .Case("7400", true)
736 .Case("g4", true)
737 .Case("7450", true)
738 .Case("g4+", true)
739 .Case("750", true)
740 .Case("970", true)
741 .Case("g5", true)
742 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000743 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000744 .Case("e500mc", true)
745 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000746 .Case("power3", true)
747 .Case("pwr3", true)
748 .Case("power4", true)
749 .Case("pwr4", true)
750 .Case("power5", true)
751 .Case("pwr5", true)
752 .Case("power5x", true)
753 .Case("pwr5x", true)
754 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000755 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000756 .Case("power6x", true)
757 .Case("pwr6x", true)
758 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000759 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000760 .Case("power8", true)
761 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000762 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000763 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000764 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000765 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000766 .Case("powerpc64le", true)
767 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000768 .Default(false);
769
770 if (CPUKnown)
771 CPU = Name;
772
773 return CPUKnown;
774 }
775
Ulrich Weigand8afad612014-07-28 13:17:52 +0000776
777 StringRef getABI() const override { return ABI; }
778
Craig Topper3164f332014-03-11 03:39:26 +0000779 void getTargetBuiltins(const Builtin::Info *&Records,
780 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000781 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000782 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000783 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000784
Craig Topper3164f332014-03-11 03:39:26 +0000785 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000786
Craig Topper3164f332014-03-11 03:39:26 +0000787 void getTargetDefines(const LangOptions &Opts,
788 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000789
Craig Topper3164f332014-03-11 03:39:26 +0000790 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000791
Craig Topper3164f332014-03-11 03:39:26 +0000792 bool handleTargetFeatures(std::vector<std::string> &Features,
793 DiagnosticsEngine &Diags) override;
794 bool hasFeature(StringRef Feature) const override;
795
796 void getGCCRegNames(const char * const *&Names,
797 unsigned &NumNames) const override;
798 void getGCCRegAliases(const GCCRegAlias *&Aliases,
799 unsigned &NumAliases) const override;
800 bool validateAsmConstraint(const char *&Name,
801 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000802 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000803 default: return false;
804 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000805 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000806 case 'b': // Base register
807 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000808 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000809 break;
810 // FIXME: The following are added to allow parsing.
811 // I just took a guess at what the actions should be.
812 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000813 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000814 case 'v': // Altivec vector register
815 Info.setAllowsRegister();
816 break;
817 case 'w':
818 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000819 case 'd':// VSX vector register to hold vector double data
820 case 'f':// VSX vector register to hold vector float data
821 case 's':// VSX vector register to hold scalar float data
822 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000823 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000824 break;
825 default:
826 return false;
827 }
828 Info.setAllowsRegister();
829 Name++; // Skip over 'w'.
830 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000831 case 'h': // `MQ', `CTR', or `LINK' register
832 case 'q': // `MQ' register
833 case 'c': // `CTR' register
834 case 'l': // `LINK' register
835 case 'x': // `CR' register (condition register) number 0
836 case 'y': // `CR' register (condition register)
837 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000838 Info.setAllowsRegister();
839 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000840 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000841 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000842 // (use `L' instead for SImode constants)
843 case 'K': // Unsigned 16-bit constant
844 case 'L': // Signed 16-bit constant shifted left 16 bits
845 case 'M': // Constant larger than 31
846 case 'N': // Exact power of 2
847 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000848 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000849 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000850 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000851 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000852 break;
853 case 'm': // Memory operand. Note that on PowerPC targets, m can
854 // include addresses that update the base register. It
855 // is therefore only safe to use `m' in an asm statement
856 // if that asm statement accesses the operand exactly once.
857 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000858 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000859 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000860 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000861 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000862 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
863 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000864 // register to be updated.
865 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000866 if (Name[1] != 's')
867 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000868 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000869 // include any automodification of the base register. Unlike
870 // `m', this constraint can be used in asm statements that
871 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000872 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000873 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000874 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000875 break;
876 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000877 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000878 case 'Z': // Memory operand that is an indexed or indirect from a
879 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000880 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000881 Info.setAllowsMemory();
882 Info.setAllowsRegister();
883 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000884 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000885 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000886 // register (`p' is preferable for asm statements)
887 case 'S': // Constant suitable as a 64-bit mask operand
888 case 'T': // Constant suitable as a 32-bit mask operand
889 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000890 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000891 // instructions
892 case 'W': // Vector constant that does not require memory
893 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000894 break;
895 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000896 }
John Thompson07a61a42010-06-24 22:44:13 +0000897 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000898 }
Craig Topper3164f332014-03-11 03:39:26 +0000899 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000900 std::string R;
901 switch (*Constraint) {
902 case 'e':
903 case 'w':
904 // Two-character constraint; add "^" hint for later parsing.
905 R = std::string("^") + std::string(Constraint, 2);
906 Constraint++;
907 break;
908 default:
909 return TargetInfo::convertConstraint(Constraint);
910 }
911 return R;
912 }
Craig Topper3164f332014-03-11 03:39:26 +0000913 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000914 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000915 }
Craig Topper3164f332014-03-11 03:39:26 +0000916 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000917 if (RegNo == 0) return 3;
918 if (RegNo == 1) return 4;
919 return -1;
920 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000921};
Anders Carlssonf511f642007-11-27 04:11:28 +0000922
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000923const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000924#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000925#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000926 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000927#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000928};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000929
Eric Christopher3ff21b32013-10-16 21:26:26 +0000930 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000931/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000932bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000933 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000934 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
935 // Ignore disabled features.
936 if (Features[i][0] == '-')
937 continue;
938
939 StringRef Feature = StringRef(Features[i]).substr(1);
940
941 if (Feature == "vsx") {
942 HasVSX = true;
943 continue;
944 }
945
946 // TODO: Finish this list and add an assert that we've handled them
947 // all.
948 }
949
950 return true;
951}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000952
Chris Lattnerecd49032009-03-02 22:27:17 +0000953/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
954/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000955void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000956 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000957 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000958 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000959 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000960 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000961 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000962 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000963 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000964 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000965 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000966 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000967 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000968 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000969
Chris Lattnerecd49032009-03-02 22:27:17 +0000970 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000971 if (getTriple().getArch() == llvm::Triple::ppc64le) {
972 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000973 } else {
974 if (getTriple().getOS() != llvm::Triple::NetBSD &&
975 getTriple().getOS() != llvm::Triple::OpenBSD)
976 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000977 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000978
Ulrich Weigand8afad612014-07-28 13:17:52 +0000979 // ABI options.
980 if (ABI == "elfv1")
981 Builder.defineMacro("_CALL_ELF", "1");
982 if (ABI == "elfv2")
983 Builder.defineMacro("_CALL_ELF", "2");
984
Chris Lattnerecd49032009-03-02 22:27:17 +0000985 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000986 Builder.defineMacro("__NATURAL_ALIGNMENT__");
987 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000988
Chris Lattnerecd49032009-03-02 22:27:17 +0000989 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000990 if (LongDoubleWidth == 128)
991 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000992
John Thompsone467e192009-11-19 17:18:50 +0000993 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000994 Builder.defineMacro("__VEC__", "10206");
995 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000996 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000997
998 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000999 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1000 .Case("440", ArchDefineName)
1001 .Case("450", ArchDefineName | ArchDefine440)
1002 .Case("601", ArchDefineName)
1003 .Case("602", ArchDefineName | ArchDefinePpcgr)
1004 .Case("603", ArchDefineName | ArchDefinePpcgr)
1005 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1006 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1007 .Case("604", ArchDefineName | ArchDefinePpcgr)
1008 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1009 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001010 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001011 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1012 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1013 .Case("750", ArchDefineName | ArchDefinePpcgr)
1014 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1015 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001016 .Case("a2", ArchDefineA2)
1017 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001018 .Case("pwr3", ArchDefinePpcgr)
1019 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1020 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1021 | ArchDefinePpcsq)
1022 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1023 | ArchDefinePpcgr | ArchDefinePpcsq)
1024 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1025 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1026 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1027 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1028 | ArchDefinePpcsq)
1029 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1030 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001031 | ArchDefinePpcgr | ArchDefinePpcsq)
1032 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1033 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1034 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001035 .Case("power3", ArchDefinePpcgr)
1036 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1037 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1038 | ArchDefinePpcsq)
1039 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1040 | ArchDefinePpcgr | ArchDefinePpcsq)
1041 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1042 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1043 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1044 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1045 | ArchDefinePpcsq)
1046 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1047 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001048 | ArchDefinePpcgr | ArchDefinePpcsq)
1049 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1050 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1051 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001052 .Default(ArchDefineNone);
1053
1054 if (defs & ArchDefineName)
1055 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1056 if (defs & ArchDefinePpcgr)
1057 Builder.defineMacro("_ARCH_PPCGR");
1058 if (defs & ArchDefinePpcsq)
1059 Builder.defineMacro("_ARCH_PPCSQ");
1060 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001061 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001062 if (defs & ArchDefine603)
1063 Builder.defineMacro("_ARCH_603");
1064 if (defs & ArchDefine604)
1065 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001066 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001067 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001068 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001069 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001070 if (defs & ArchDefinePwr5x)
1071 Builder.defineMacro("_ARCH_PWR5X");
1072 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001073 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001074 if (defs & ArchDefinePwr6x)
1075 Builder.defineMacro("_ARCH_PWR6X");
1076 if (defs & ArchDefinePwr7)
1077 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001078 if (defs & ArchDefinePwr8)
1079 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001080 if (defs & ArchDefineA2)
1081 Builder.defineMacro("_ARCH_A2");
1082 if (defs & ArchDefineA2q) {
1083 Builder.defineMacro("_ARCH_A2Q");
1084 Builder.defineMacro("_ARCH_QP");
1085 }
1086
1087 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1088 Builder.defineMacro("__bg__");
1089 Builder.defineMacro("__THW_BLUEGENE__");
1090 Builder.defineMacro("__bgq__");
1091 Builder.defineMacro("__TOS_BGQ__");
1092 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001093
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001094 if (HasVSX)
1095 Builder.defineMacro("__VSX__");
1096
Bill Schmidt38378a02013-02-01 20:23:10 +00001097 // FIXME: The following are not yet generated here by Clang, but are
1098 // generated by GCC:
1099 //
1100 // _SOFT_FLOAT_
1101 // __RECIP_PRECISION__
1102 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001103 // __RECIP__
1104 // __RECIPF__
1105 // __RSQRTE__
1106 // __RSQRTEF__
1107 // _SOFT_DOUBLE_
1108 // __NO_LWSYNC__
1109 // __HAVE_BSWAP__
1110 // __LONGDOUBLE128
1111 // __CMODEL_MEDIUM__
1112 // __CMODEL_LARGE__
1113 // _CALL_SYSV
1114 // _CALL_DARWIN
1115 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001116}
1117
1118void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1119 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1120 .Case("7400", true)
1121 .Case("g4", true)
1122 .Case("7450", true)
1123 .Case("g4+", true)
1124 .Case("970", true)
1125 .Case("g5", true)
1126 .Case("pwr6", true)
1127 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001128 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001129 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001130 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001131 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001132
1133 Features["qpx"] = (CPU == "a2q");
Ulrich Weigand8afad612014-07-28 13:17:52 +00001134
1135 if (!ABI.empty())
1136 Features[ABI] = true;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001137}
1138
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001139bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1140 return Feature == "powerpc";
1141}
Chris Lattner17df24e2008-04-21 18:56:49 +00001142
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001143
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001144const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001145 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1146 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1147 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1148 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1149 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1150 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1151 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1152 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001153 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001154 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001155 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001156 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1157 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1158 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1159 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001160 "vrsave", "vscr",
1161 "spe_acc", "spefscr",
1162 "sfp"
1163};
Chris Lattner10a5b382007-01-29 05:24:35 +00001164
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001165void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001166 unsigned &NumNames) const {
1167 Names = GCCRegNames;
1168 NumNames = llvm::array_lengthof(GCCRegNames);
1169}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001170
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001171const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1172 // While some of these aliases do map to different registers
1173 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001174 { { "0" }, "r0" },
1175 { { "1"}, "r1" },
1176 { { "2" }, "r2" },
1177 { { "3" }, "r3" },
1178 { { "4" }, "r4" },
1179 { { "5" }, "r5" },
1180 { { "6" }, "r6" },
1181 { { "7" }, "r7" },
1182 { { "8" }, "r8" },
1183 { { "9" }, "r9" },
1184 { { "10" }, "r10" },
1185 { { "11" }, "r11" },
1186 { { "12" }, "r12" },
1187 { { "13" }, "r13" },
1188 { { "14" }, "r14" },
1189 { { "15" }, "r15" },
1190 { { "16" }, "r16" },
1191 { { "17" }, "r17" },
1192 { { "18" }, "r18" },
1193 { { "19" }, "r19" },
1194 { { "20" }, "r20" },
1195 { { "21" }, "r21" },
1196 { { "22" }, "r22" },
1197 { { "23" }, "r23" },
1198 { { "24" }, "r24" },
1199 { { "25" }, "r25" },
1200 { { "26" }, "r26" },
1201 { { "27" }, "r27" },
1202 { { "28" }, "r28" },
1203 { { "29" }, "r29" },
1204 { { "30" }, "r30" },
1205 { { "31" }, "r31" },
1206 { { "fr0" }, "f0" },
1207 { { "fr1" }, "f1" },
1208 { { "fr2" }, "f2" },
1209 { { "fr3" }, "f3" },
1210 { { "fr4" }, "f4" },
1211 { { "fr5" }, "f5" },
1212 { { "fr6" }, "f6" },
1213 { { "fr7" }, "f7" },
1214 { { "fr8" }, "f8" },
1215 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001216 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001217 { { "fr11" }, "f11" },
1218 { { "fr12" }, "f12" },
1219 { { "fr13" }, "f13" },
1220 { { "fr14" }, "f14" },
1221 { { "fr15" }, "f15" },
1222 { { "fr16" }, "f16" },
1223 { { "fr17" }, "f17" },
1224 { { "fr18" }, "f18" },
1225 { { "fr19" }, "f19" },
1226 { { "fr20" }, "f20" },
1227 { { "fr21" }, "f21" },
1228 { { "fr22" }, "f22" },
1229 { { "fr23" }, "f23" },
1230 { { "fr24" }, "f24" },
1231 { { "fr25" }, "f25" },
1232 { { "fr26" }, "f26" },
1233 { { "fr27" }, "f27" },
1234 { { "fr28" }, "f28" },
1235 { { "fr29" }, "f29" },
1236 { { "fr30" }, "f30" },
1237 { { "fr31" }, "f31" },
1238 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001239};
1240
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001241void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001242 unsigned &NumAliases) const {
1243 Aliases = GCCRegAliases;
1244 NumAliases = llvm::array_lengthof(GCCRegAliases);
1245}
1246} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001247
Chris Lattner5ba61f02006-10-14 07:39:34 +00001248namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001249class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001250public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001251 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001252 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001253
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001254 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001255 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001256 case llvm::Triple::FreeBSD:
1257 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001258 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001259 PtrDiffType = SignedInt;
1260 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001261 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001262 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001263 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001264 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001265
Roman Divacky3ffe7462012-03-13 19:20:17 +00001266 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1267 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001268 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001269 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001270
1271 // PPC32 supports atomics up to 4 bytes.
1272 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001273 }
1274
Craig Topper3164f332014-03-11 03:39:26 +00001275 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001276 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001277 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001278 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001279};
1280} // end anonymous namespace.
1281
Bill Schmidt778d3872013-07-26 01:36:11 +00001282// Note: ABI differences may eventually require us to have a separate
1283// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001284namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001285class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001286public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001287 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001288 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001289 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001290 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001291
Roman Divacky3ffe7462012-03-13 19:20:17 +00001292 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1293 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001294 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001295 DescriptionString = "E-m:e-i64:64-n32:64";
Will Schmidt0c67b7e2014-03-24 15:48:02 +00001296 } else {
1297 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1298 DescriptionString = "e-m:e-i64:64-n32:64";
Ulrich Weigand8afad612014-07-28 13:17:52 +00001299 ABI = "elfv2";
Will Schmidt0c67b7e2014-03-24 15:48:02 +00001300 } else {
1301 DescriptionString = "E-m:e-i64:64-n32:64";
Ulrich Weigand8afad612014-07-28 13:17:52 +00001302 ABI = "elfv1";
Will Schmidt0c67b7e2014-03-24 15:48:02 +00001303 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001304 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001305
1306 // PPC64 supports atomics up to 8 bytes.
1307 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001308 }
Craig Topper3164f332014-03-11 03:39:26 +00001309 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001310 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001311 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001312 // PPC64 Linux-specifc ABI options.
1313 bool setABI(const std::string &Name) override {
1314 if (Name == "elfv1" || Name == "elfv2") {
1315 ABI = Name;
1316 return true;
1317 }
1318 return false;
1319 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001320};
1321} // end anonymous namespace.
1322
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001323
1324namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001325class DarwinPPC32TargetInfo :
1326 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001327public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001328 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1329 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001330 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001331 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherc04fe092013-10-16 21:19:19 +00001332 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001333 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001334 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001335 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001336 }
Craig Topper3164f332014-03-11 03:39:26 +00001337 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001338 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001339 }
1340};
1341
1342class DarwinPPC64TargetInfo :
1343 public DarwinTargetInfo<PPC64TargetInfo> {
1344public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001345 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1346 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001347 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001348 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001349 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001350 }
1351};
1352} // end anonymous namespace.
1353
Chris Lattner5ba61f02006-10-14 07:39:34 +00001354namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001355 static const unsigned NVPTXAddrSpaceMap[] = {
1356 1, // opencl_global
1357 3, // opencl_local
1358 4, // opencl_constant
1359 1, // cuda_device
1360 4, // cuda_constant
1361 3, // cuda_shared
1362 };
1363 class NVPTXTargetInfo : public TargetInfo {
1364 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001365 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001366 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001367 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001368 BigEndian = false;
1369 TLSSupported = false;
1370 LongWidth = LongAlign = 64;
1371 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001372 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001373 // Define available target features
1374 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001375 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001376 }
Craig Topper3164f332014-03-11 03:39:26 +00001377 void getTargetDefines(const LangOptions &Opts,
1378 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001379 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001380 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001381 }
Craig Topper3164f332014-03-11 03:39:26 +00001382 void getTargetBuiltins(const Builtin::Info *&Records,
1383 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001384 Records = BuiltinInfo;
1385 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001386 }
Craig Topper3164f332014-03-11 03:39:26 +00001387 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001388 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001389 }
Craig Topper3164f332014-03-11 03:39:26 +00001390
1391 void getGCCRegNames(const char * const *&Names,
1392 unsigned &NumNames) const override;
1393 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1394 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001395 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001396 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001397 NumAliases = 0;
1398 }
Craig Topper3164f332014-03-11 03:39:26 +00001399 bool validateAsmConstraint(const char *&Name,
1400 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001401 switch (*Name) {
1402 default: return false;
1403 case 'c':
1404 case 'h':
1405 case 'r':
1406 case 'l':
1407 case 'f':
1408 case 'd':
1409 Info.setAllowsRegister();
1410 return true;
1411 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001412 }
Craig Topper3164f332014-03-11 03:39:26 +00001413 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001414 // FIXME: Is this really right?
1415 return "";
1416 }
Craig Topper3164f332014-03-11 03:39:26 +00001417 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001418 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001419 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001420 }
Craig Topper3164f332014-03-11 03:39:26 +00001421 bool setCPU(const std::string &Name) override {
Justin Holewinski91203e82013-03-30 14:38:26 +00001422 bool Valid = llvm::StringSwitch<bool>(Name)
1423 .Case("sm_20", true)
1424 .Case("sm_21", true)
1425 .Case("sm_30", true)
1426 .Case("sm_35", true)
1427 .Default(false);
1428
1429 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001430 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001431 };
1432
1433 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1434#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1435#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1436 ALL_LANGUAGES },
1437#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001438 };
1439
1440 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1441 "r0"
1442 };
1443
1444 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1445 unsigned &NumNames) const {
1446 Names = GCCRegNames;
1447 NumNames = llvm::array_lengthof(GCCRegNames);
1448 }
1449
1450 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1451 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001452 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001453 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001454 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1455 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001456 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001457 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001458 };
1459
1460 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1461 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001462 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001463 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001464 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1465 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001466 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001467 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001468 };
1469}
1470
1471namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001472
1473static const unsigned R600AddrSpaceMap[] = {
1474 1, // opencl_global
1475 3, // opencl_local
1476 2, // opencl_constant
1477 1, // cuda_device
1478 2, // cuda_constant
1479 3 // cuda_shared
1480};
1481
Tom Stellardc74b1e02013-03-04 17:40:53 +00001482static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001483 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1484 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001485
1486static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001487 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1488 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001489
1490static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001491 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001492 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1493 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001494
Eli Friedmand13b41e2012-10-12 23:32:00 +00001495class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001496 static const Builtin::Info BuiltinInfo[];
1497
Tom Stellardc74b1e02013-03-04 17:40:53 +00001498 /// \brief The GPU profiles supported by the R600 target.
1499 enum GPUKind {
1500 GK_NONE,
1501 GK_R600,
1502 GK_R600_DOUBLE_OPS,
1503 GK_R700,
1504 GK_R700_DOUBLE_OPS,
1505 GK_EVERGREEN,
1506 GK_EVERGREEN_DOUBLE_OPS,
1507 GK_NORTHERN_ISLANDS,
1508 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001509 GK_SOUTHERN_ISLANDS,
1510 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001511 } GPU;
1512
Eli Friedmand13b41e2012-10-12 23:32:00 +00001513public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001514 R600TargetInfo(const llvm::Triple &Triple)
1515 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001516 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001517 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001518 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001519 }
1520
Craig Topper3164f332014-03-11 03:39:26 +00001521 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001522 return "";
1523 }
1524
Craig Topper3164f332014-03-11 03:39:26 +00001525 void getGCCRegNames(const char * const *&Names,
1526 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001527 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001528 numNames = 0;
1529 }
1530
Craig Topper3164f332014-03-11 03:39:26 +00001531 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1532 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001533 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001534 NumAliases = 0;
1535 }
1536
Craig Topper3164f332014-03-11 03:39:26 +00001537 bool validateAsmConstraint(const char *&Name,
1538 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001539 return true;
1540 }
1541
Craig Topper3164f332014-03-11 03:39:26 +00001542 void getTargetBuiltins(const Builtin::Info *&Records,
1543 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001544 Records = BuiltinInfo;
1545 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001546 }
1547
Craig Topper3164f332014-03-11 03:39:26 +00001548 void getTargetDefines(const LangOptions &Opts,
1549 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001550 Builder.defineMacro("__R600__");
1551 }
1552
Craig Topper3164f332014-03-11 03:39:26 +00001553 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001554 return TargetInfo::CharPtrBuiltinVaList;
1555 }
1556
Craig Topper3164f332014-03-11 03:39:26 +00001557 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001558 GPU = llvm::StringSwitch<GPUKind>(Name)
1559 .Case("r600" , GK_R600)
1560 .Case("rv610", GK_R600)
1561 .Case("rv620", GK_R600)
1562 .Case("rv630", GK_R600)
1563 .Case("rv635", GK_R600)
1564 .Case("rs780", GK_R600)
1565 .Case("rs880", GK_R600)
1566 .Case("rv670", GK_R600_DOUBLE_OPS)
1567 .Case("rv710", GK_R700)
1568 .Case("rv730", GK_R700)
1569 .Case("rv740", GK_R700_DOUBLE_OPS)
1570 .Case("rv770", GK_R700_DOUBLE_OPS)
1571 .Case("palm", GK_EVERGREEN)
1572 .Case("cedar", GK_EVERGREEN)
1573 .Case("sumo", GK_EVERGREEN)
1574 .Case("sumo2", GK_EVERGREEN)
1575 .Case("redwood", GK_EVERGREEN)
1576 .Case("juniper", GK_EVERGREEN)
1577 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1578 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1579 .Case("barts", GK_NORTHERN_ISLANDS)
1580 .Case("turks", GK_NORTHERN_ISLANDS)
1581 .Case("caicos", GK_NORTHERN_ISLANDS)
1582 .Case("cayman", GK_CAYMAN)
1583 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001584 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001585 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1586 .Case("verde", GK_SOUTHERN_ISLANDS)
1587 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001588 .Case("bonaire", GK_SEA_ISLANDS)
1589 .Case("kabini", GK_SEA_ISLANDS)
1590 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001591 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001592 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001593 .Default(GK_NONE);
1594
1595 if (GPU == GK_NONE) {
1596 return false;
1597 }
1598
1599 // Set the correct data layout
1600 switch (GPU) {
1601 case GK_NONE:
1602 case GK_R600:
1603 case GK_R700:
1604 case GK_EVERGREEN:
1605 case GK_NORTHERN_ISLANDS:
1606 DescriptionString = DescriptionStringR600;
1607 break;
1608 case GK_R600_DOUBLE_OPS:
1609 case GK_R700_DOUBLE_OPS:
1610 case GK_EVERGREEN_DOUBLE_OPS:
1611 case GK_CAYMAN:
1612 DescriptionString = DescriptionStringR600DoubleOps;
1613 break;
1614 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001615 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001616 DescriptionString = DescriptionStringSI;
1617 break;
1618 }
1619
1620 return true;
1621 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001622};
1623
Matt Arsenault56f008d2014-06-24 20:45:01 +00001624const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1625#define BUILTIN(ID, TYPE, ATTRS) \
1626 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1627#include "clang/Basic/BuiltinsR600.def"
1628};
1629
Eli Friedmand13b41e2012-10-12 23:32:00 +00001630} // end anonymous namespace
1631
1632namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001633// Namespace for x86 abstract base class
1634const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001635#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001636#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001637 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001638#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001639};
Eli Friedmanb5366062008-05-20 14:21:01 +00001640
Nuno Lopescfca1f02009-12-23 17:49:57 +00001641static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001642 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1643 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001644 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001645 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1646 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1647 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001648 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001649 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1650 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001651};
1652
Eric Christophercdd36352011-06-21 00:05:20 +00001653const TargetInfo::AddlRegName AddlRegNames[] = {
1654 { { "al", "ah", "eax", "rax" }, 0 },
1655 { { "bl", "bh", "ebx", "rbx" }, 3 },
1656 { { "cl", "ch", "ecx", "rcx" }, 2 },
1657 { { "dl", "dh", "edx", "rdx" }, 1 },
1658 { { "esi", "rsi" }, 4 },
1659 { { "edi", "rdi" }, 5 },
1660 { { "esp", "rsp" }, 7 },
1661 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001662};
1663
1664// X86 target abstract base class; x86-32 and x86-64 are very close, so
1665// most of the implementation can be shared.
1666class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001667 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001668 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001669 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001670 enum MMX3DNowEnum {
1671 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1672 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001673 enum XOPEnum {
1674 NoXOP,
1675 SSE4A,
1676 FMA4,
1677 XOP
1678 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001679
Eric Christophere1ddaf92010-04-02 23:50:19 +00001680 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001681 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001682 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001683 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001684 bool HasBMI;
1685 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001686 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001687 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001688 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001689 bool HasRDSEED;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001690 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001691 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001692 bool HasF16C;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001693 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW, HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001694 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001695 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001696
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001697 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1698 ///
1699 /// Each enumeration represents a particular CPU supported by Clang. These
1700 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1701 enum CPUKind {
1702 CK_Generic,
1703
1704 /// \name i386
1705 /// i386-generation processors.
1706 //@{
1707 CK_i386,
1708 //@}
1709
1710 /// \name i486
1711 /// i486-generation processors.
1712 //@{
1713 CK_i486,
1714 CK_WinChipC6,
1715 CK_WinChip2,
1716 CK_C3,
1717 //@}
1718
1719 /// \name i586
1720 /// i586-generation processors, P5 microarchitecture based.
1721 //@{
1722 CK_i586,
1723 CK_Pentium,
1724 CK_PentiumMMX,
1725 //@}
1726
1727 /// \name i686
1728 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1729 //@{
1730 CK_i686,
1731 CK_PentiumPro,
1732 CK_Pentium2,
1733 CK_Pentium3,
1734 CK_Pentium3M,
1735 CK_PentiumM,
1736 CK_C3_2,
1737
1738 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1739 /// Clang however has some logic to suport this.
1740 // FIXME: Warn, deprecate, and potentially remove this.
1741 CK_Yonah,
1742 //@}
1743
1744 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001745 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001746 //@{
1747 CK_Pentium4,
1748 CK_Pentium4M,
1749 CK_Prescott,
1750 CK_Nocona,
1751 //@}
1752
1753 /// \name Core
1754 /// Core microarchitecture based processors.
1755 //@{
1756 CK_Core2,
1757
1758 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1759 /// codename which GCC no longer accepts as an option to -march, but Clang
1760 /// has some logic for recognizing it.
1761 // FIXME: Warn, deprecate, and potentially remove this.
1762 CK_Penryn,
1763 //@}
1764
1765 /// \name Atom
1766 /// Atom processors
1767 //@{
1768 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001769 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001770 //@}
1771
1772 /// \name Nehalem
1773 /// Nehalem microarchitecture based processors.
1774 //@{
1775 CK_Corei7,
1776 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001777 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001778 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001779 //@}
1780
Craig Topper449314e2013-08-20 07:09:39 +00001781 /// \name Knights Landing
1782 /// Knights Landing processor.
1783 CK_KNL,
1784
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001785 /// \name Skylake Server
1786 /// Skylake server processor.
1787 CK_SKX,
1788
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001789 /// \name K6
1790 /// K6 architecture processors.
1791 //@{
1792 CK_K6,
1793 CK_K6_2,
1794 CK_K6_3,
1795 //@}
1796
1797 /// \name K7
1798 /// K7 architecture processors.
1799 //@{
1800 CK_Athlon,
1801 CK_AthlonThunderbird,
1802 CK_Athlon4,
1803 CK_AthlonXP,
1804 CK_AthlonMP,
1805 //@}
1806
1807 /// \name K8
1808 /// K8 architecture processors.
1809 //@{
1810 CK_Athlon64,
1811 CK_Athlon64SSE3,
1812 CK_AthlonFX,
1813 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001814 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001815 CK_Opteron,
1816 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001817 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001818 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001819
Benjamin Kramer569f2152012-01-10 11:50:18 +00001820 /// \name Bobcat
1821 /// Bobcat architecture processors.
1822 //@{
1823 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001824 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001825 //@}
1826
1827 /// \name Bulldozer
1828 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001829 //@{
1830 CK_BDVER1,
1831 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001832 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001833 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001834 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001835
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001836 /// This specification is deprecated and will be removed in the future.
1837 /// Users should prefer \see CK_K8.
1838 // FIXME: Warn on this when the CPU is set to it.
1839 CK_x86_64,
1840 //@}
1841
1842 /// \name Geode
1843 /// Geode processors.
1844 //@{
1845 CK_Geode
1846 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001847 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001848
Rafael Espindolaeb265472013-08-21 21:59:03 +00001849 enum FPMathKind {
1850 FP_Default,
1851 FP_SSE,
1852 FP_387
1853 } FPMath;
1854
Eli Friedman3fd920a2008-08-20 02:34:37 +00001855public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001856 X86TargetInfo(const llvm::Triple &Triple)
1857 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001858 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1859 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001860 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1861 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001862 HasAVX512PF(false), HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1863 HasSHA(false), HasCX16(false), CPU(CK_Generic),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001864 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001865 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001866 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001867 }
Craig Topper3164f332014-03-11 03:39:26 +00001868 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001869 // X87 evaluates with 80 bits "long double" precision.
1870 return SSELevel == NoSSE ? 2 : 0;
1871 }
Craig Topper3164f332014-03-11 03:39:26 +00001872 void getTargetBuiltins(const Builtin::Info *&Records,
1873 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001874 Records = BuiltinInfo;
1875 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001876 }
Craig Topper3164f332014-03-11 03:39:26 +00001877 void getGCCRegNames(const char * const *&Names,
1878 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001879 Names = GCCRegNames;
1880 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001881 }
Craig Topper3164f332014-03-11 03:39:26 +00001882 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1883 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001884 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00001885 NumAliases = 0;
1886 }
Craig Topper3164f332014-03-11 03:39:26 +00001887 void getGCCAddlRegNames(const AddlRegName *&Names,
1888 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001889 Names = AddlRegNames;
1890 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001891 }
Craig Topper3164f332014-03-11 03:39:26 +00001892 bool validateAsmConstraint(const char *&Name,
1893 TargetInfo::ConstraintInfo &info) const override;
1894 std::string convertConstraint(const char *&Constraint) const override;
1895 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001896 return "~{dirflag},~{fpsr},~{flags}";
1897 }
Craig Topper3164f332014-03-11 03:39:26 +00001898 void getTargetDefines(const LangOptions &Opts,
1899 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001900 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1901 bool Enabled);
1902 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1903 bool Enabled);
1904 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1905 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001906 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1907 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00001908 setFeatureEnabledImpl(Features, Name, Enabled);
1909 }
1910 // This exists purely to cut down on the number of virtual calls in
1911 // getDefaultFeatures which calls this repeatedly.
1912 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1913 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001914 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1915 bool hasFeature(StringRef Feature) const override;
1916 bool handleTargetFeatures(std::vector<std::string> &Features,
1917 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00001918 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001919 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001920 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001921 else if (getTriple().getArch() == llvm::Triple::x86 &&
1922 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001923 return "no-mmx";
1924 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001925 }
Craig Topper3164f332014-03-11 03:39:26 +00001926 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00001927 CPU = llvm::StringSwitch<CPUKind>(Name)
1928 .Case("i386", CK_i386)
1929 .Case("i486", CK_i486)
1930 .Case("winchip-c6", CK_WinChipC6)
1931 .Case("winchip2", CK_WinChip2)
1932 .Case("c3", CK_C3)
1933 .Case("i586", CK_i586)
1934 .Case("pentium", CK_Pentium)
1935 .Case("pentium-mmx", CK_PentiumMMX)
1936 .Case("i686", CK_i686)
1937 .Case("pentiumpro", CK_PentiumPro)
1938 .Case("pentium2", CK_Pentium2)
1939 .Case("pentium3", CK_Pentium3)
1940 .Case("pentium3m", CK_Pentium3M)
1941 .Case("pentium-m", CK_PentiumM)
1942 .Case("c3-2", CK_C3_2)
1943 .Case("yonah", CK_Yonah)
1944 .Case("pentium4", CK_Pentium4)
1945 .Case("pentium4m", CK_Pentium4M)
1946 .Case("prescott", CK_Prescott)
1947 .Case("nocona", CK_Nocona)
1948 .Case("core2", CK_Core2)
1949 .Case("penryn", CK_Penryn)
1950 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001951 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001952 .Case("corei7", CK_Corei7)
1953 .Case("corei7-avx", CK_Corei7AVX)
1954 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001955 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001956 .Case("knl", CK_KNL)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001957 .Case("skx", CK_SKX)
Chandler Carruth212334f2011-09-28 08:55:37 +00001958 .Case("k6", CK_K6)
1959 .Case("k6-2", CK_K6_2)
1960 .Case("k6-3", CK_K6_3)
1961 .Case("athlon", CK_Athlon)
1962 .Case("athlon-tbird", CK_AthlonThunderbird)
1963 .Case("athlon-4", CK_Athlon4)
1964 .Case("athlon-xp", CK_AthlonXP)
1965 .Case("athlon-mp", CK_AthlonMP)
1966 .Case("athlon64", CK_Athlon64)
1967 .Case("athlon64-sse3", CK_Athlon64SSE3)
1968 .Case("athlon-fx", CK_AthlonFX)
1969 .Case("k8", CK_K8)
1970 .Case("k8-sse3", CK_K8SSE3)
1971 .Case("opteron", CK_Opteron)
1972 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001973 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001974 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001975 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001976 .Case("bdver1", CK_BDVER1)
1977 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001978 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00001979 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00001980 .Case("x86-64", CK_x86_64)
1981 .Case("geode", CK_Geode)
1982 .Default(CK_Generic);
1983
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001984 // Perform any per-CPU checks necessary to determine if this CPU is
1985 // acceptable.
1986 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1987 // invalid without explaining *why*.
1988 switch (CPU) {
1989 case CK_Generic:
1990 // No processor selected!
1991 return false;
1992
1993 case CK_i386:
1994 case CK_i486:
1995 case CK_WinChipC6:
1996 case CK_WinChip2:
1997 case CK_C3:
1998 case CK_i586:
1999 case CK_Pentium:
2000 case CK_PentiumMMX:
2001 case CK_i686:
2002 case CK_PentiumPro:
2003 case CK_Pentium2:
2004 case CK_Pentium3:
2005 case CK_Pentium3M:
2006 case CK_PentiumM:
2007 case CK_Yonah:
2008 case CK_C3_2:
2009 case CK_Pentium4:
2010 case CK_Pentium4M:
2011 case CK_Prescott:
2012 case CK_K6:
2013 case CK_K6_2:
2014 case CK_K6_3:
2015 case CK_Athlon:
2016 case CK_AthlonThunderbird:
2017 case CK_Athlon4:
2018 case CK_AthlonXP:
2019 case CK_AthlonMP:
2020 case CK_Geode:
2021 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002022 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002023 return false;
2024
2025 // Fallthrough
2026 case CK_Nocona:
2027 case CK_Core2:
2028 case CK_Penryn:
2029 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00002030 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002031 case CK_Corei7:
2032 case CK_Corei7AVX:
2033 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002034 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00002035 case CK_KNL:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002036 case CK_SKX:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002037 case CK_Athlon64:
2038 case CK_Athlon64SSE3:
2039 case CK_AthlonFX:
2040 case CK_K8:
2041 case CK_K8SSE3:
2042 case CK_Opteron:
2043 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002044 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002045 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002046 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002047 case CK_BDVER1:
2048 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002049 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002050 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002051 case CK_x86_64:
2052 return true;
2053 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002054 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002055 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002056
Craig Topper3164f332014-03-11 03:39:26 +00002057 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002058
Craig Topper3164f332014-03-11 03:39:26 +00002059 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002060 // We accept all non-ARM calling conventions
2061 return (CC == CC_X86ThisCall ||
2062 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00002063 CC == CC_X86StdCall ||
2064 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002065 CC == CC_X86Pascal ||
2066 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002067 }
2068
Craig Topper3164f332014-03-11 03:39:26 +00002069 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002070 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002071 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002072};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002073
Rafael Espindolaeb265472013-08-21 21:59:03 +00002074bool X86TargetInfo::setFPMath(StringRef Name) {
2075 if (Name == "387") {
2076 FPMath = FP_387;
2077 return true;
2078 }
2079 if (Name == "sse") {
2080 FPMath = FP_SSE;
2081 return true;
2082 }
2083 return false;
2084}
2085
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002086void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002087 // FIXME: This *really* should not be here.
2088
2089 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002090 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002091 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002092
Chandler Carruth212334f2011-09-28 08:55:37 +00002093 switch (CPU) {
2094 case CK_Generic:
2095 case CK_i386:
2096 case CK_i486:
2097 case CK_i586:
2098 case CK_Pentium:
2099 case CK_i686:
2100 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002101 break;
2102 case CK_PentiumMMX:
2103 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002104 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002105 break;
2106 case CK_Pentium3:
2107 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002108 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002109 break;
2110 case CK_PentiumM:
2111 case CK_Pentium4:
2112 case CK_Pentium4M:
2113 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002114 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002115 break;
2116 case CK_Yonah:
2117 case CK_Prescott:
2118 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002119 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002120 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002121 break;
2122 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002123 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002124 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002125 break;
2126 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002127 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002128 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002129 break;
2130 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002131 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002132 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002133 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002134 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002135 setFeatureEnabledImpl(Features, "sse4.2", true);
2136 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002137 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002138 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002139 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002140 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002141 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002142 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002143 break;
2144 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002145 setFeatureEnabledImpl(Features, "avx", true);
2146 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002147 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002148 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002149 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002150 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002151 setFeatureEnabledImpl(Features, "avx", true);
2152 setFeatureEnabledImpl(Features, "aes", true);
2153 setFeatureEnabledImpl(Features, "pclmul", true);
2154 setFeatureEnabledImpl(Features, "rdrnd", true);
2155 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002156 break;
Craig Topper865fff52011-12-17 19:55:21 +00002157 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002158 setFeatureEnabledImpl(Features, "avx2", true);
2159 setFeatureEnabledImpl(Features, "aes", true);
2160 setFeatureEnabledImpl(Features, "pclmul", true);
2161 setFeatureEnabledImpl(Features, "lzcnt", true);
2162 setFeatureEnabledImpl(Features, "rdrnd", true);
2163 setFeatureEnabledImpl(Features, "f16c", true);
2164 setFeatureEnabledImpl(Features, "bmi", true);
2165 setFeatureEnabledImpl(Features, "bmi2", true);
2166 setFeatureEnabledImpl(Features, "rtm", true);
2167 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002168 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002169 break;
Craig Topper449314e2013-08-20 07:09:39 +00002170 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002171 setFeatureEnabledImpl(Features, "avx512f", true);
2172 setFeatureEnabledImpl(Features, "avx512cd", true);
2173 setFeatureEnabledImpl(Features, "avx512er", true);
2174 setFeatureEnabledImpl(Features, "avx512pf", true);
2175 setFeatureEnabledImpl(Features, "aes", true);
2176 setFeatureEnabledImpl(Features, "pclmul", true);
2177 setFeatureEnabledImpl(Features, "lzcnt", true);
2178 setFeatureEnabledImpl(Features, "rdrnd", true);
2179 setFeatureEnabledImpl(Features, "f16c", true);
2180 setFeatureEnabledImpl(Features, "bmi", true);
2181 setFeatureEnabledImpl(Features, "bmi2", true);
2182 setFeatureEnabledImpl(Features, "rtm", true);
2183 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002184 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002185 case CK_SKX:
2186 setFeatureEnabledImpl(Features, "avx512f", true);
2187 setFeatureEnabledImpl(Features, "avx512cd", true);
2188 setFeatureEnabledImpl(Features, "avx512dq", true);
2189 setFeatureEnabledImpl(Features, "avx512bw", true);
2190 setFeatureEnabledImpl(Features, "avx512vl", true);
2191 setFeatureEnabledImpl(Features, "aes", true);
2192 setFeatureEnabledImpl(Features, "pclmul", true);
2193 setFeatureEnabledImpl(Features, "lzcnt", true);
2194 setFeatureEnabledImpl(Features, "rdrnd", true);
2195 setFeatureEnabledImpl(Features, "f16c", true);
2196 setFeatureEnabledImpl(Features, "bmi", true);
2197 setFeatureEnabledImpl(Features, "bmi2", true);
2198 setFeatureEnabledImpl(Features, "rtm", true);
2199 setFeatureEnabledImpl(Features, "fma", true);
2200 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002201 case CK_K6:
2202 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002203 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002204 break;
2205 case CK_K6_2:
2206 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002207 case CK_WinChip2:
2208 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002209 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002210 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002211 case CK_Athlon:
2212 case CK_AthlonThunderbird:
2213 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002214 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002215 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002216 case CK_Athlon4:
2217 case CK_AthlonXP:
2218 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002219 setFeatureEnabledImpl(Features, "sse", true);
2220 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002221 break;
2222 case CK_K8:
2223 case CK_Opteron:
2224 case CK_Athlon64:
2225 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002226 setFeatureEnabledImpl(Features, "sse2", true);
2227 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002228 break;
2229 case CK_K8SSE3:
2230 case CK_OpteronSSE3:
2231 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002232 setFeatureEnabledImpl(Features, "sse3", true);
2233 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002234 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002235 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002236 setFeatureEnabledImpl(Features, "sse3", true);
2237 setFeatureEnabledImpl(Features, "sse4a", true);
2238 setFeatureEnabledImpl(Features, "3dnowa", true);
2239 setFeatureEnabledImpl(Features, "lzcnt", true);
2240 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002241 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002242 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002243 setFeatureEnabledImpl(Features, "ssse3", true);
2244 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002245 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002246 setFeatureEnabledImpl(Features, "lzcnt", true);
2247 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002248 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002249 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002250 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002251 setFeatureEnabledImpl(Features, "avx", true);
2252 setFeatureEnabledImpl(Features, "sse4a", true);
2253 setFeatureEnabledImpl(Features, "lzcnt", true);
2254 setFeatureEnabledImpl(Features, "aes", true);
2255 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002256 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002257 setFeatureEnabledImpl(Features, "bmi", true);
2258 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002259 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002260 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002261 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002262 setFeatureEnabledImpl(Features, "xop", true);
2263 setFeatureEnabledImpl(Features, "lzcnt", true);
2264 setFeatureEnabledImpl(Features, "aes", true);
2265 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002266 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002267 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002268 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002269 case CK_BDVER4:
2270 setFeatureEnabledImpl(Features, "avx2", true);
2271 setFeatureEnabledImpl(Features, "bmi2", true);
2272 // FALLTHROUGH
Eli Friedman3e94f572012-11-17 01:43:10 +00002273 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002274 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002275 setFeatureEnabledImpl(Features, "xop", true);
2276 setFeatureEnabledImpl(Features, "lzcnt", true);
2277 setFeatureEnabledImpl(Features, "aes", true);
2278 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002279 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002280 setFeatureEnabledImpl(Features, "bmi", true);
2281 setFeatureEnabledImpl(Features, "fma", true);
2282 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002283 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002284 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002285 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002286 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002287 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002288 break;
Eli Friedman33465822011-07-08 23:31:17 +00002289 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002290}
2291
Rafael Espindolae62e2792013-08-20 13:44:29 +00002292void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002293 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002294 if (Enabled) {
2295 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002296 case AVX512F:
2297 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002298 case AVX2:
2299 Features["avx2"] = true;
2300 case AVX:
2301 Features["avx"] = true;
2302 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002303 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002304 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002305 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002306 case SSSE3:
2307 Features["ssse3"] = true;
2308 case SSE3:
2309 Features["sse3"] = true;
2310 case SSE2:
2311 Features["sse2"] = true;
2312 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002313 Features["sse"] = true;
2314 case NoSSE:
2315 break;
2316 }
2317 return;
2318 }
2319
2320 switch (Level) {
2321 case NoSSE:
2322 case SSE1:
2323 Features["sse"] = false;
2324 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002325 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2326 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002327 case SSE3:
2328 Features["sse3"] = false;
2329 setXOPLevel(Features, NoXOP, false);
2330 case SSSE3:
2331 Features["ssse3"] = false;
2332 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002333 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002334 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002335 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002336 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002337 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002338 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002339 case AVX2:
2340 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002341 case AVX512F:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002342 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] = Features["avx512pf"] =
2343 Features["avx512dq"] = Features["avx512bw"] = Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002344 }
2345}
2346
2347void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002348 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002349 if (Enabled) {
2350 switch (Level) {
2351 case AMD3DNowAthlon:
2352 Features["3dnowa"] = true;
2353 case AMD3DNow:
2354 Features["3dnow"] = true;
2355 case MMX:
2356 Features["mmx"] = true;
2357 case NoMMX3DNow:
2358 break;
2359 }
2360 return;
2361 }
2362
2363 switch (Level) {
2364 case NoMMX3DNow:
2365 case MMX:
2366 Features["mmx"] = false;
2367 case AMD3DNow:
2368 Features["3dnow"] = false;
2369 case AMD3DNowAthlon:
2370 Features["3dnowa"] = false;
2371 }
2372}
2373
2374void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002375 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002376 if (Enabled) {
2377 switch (Level) {
2378 case XOP:
2379 Features["xop"] = true;
2380 case FMA4:
2381 Features["fma4"] = true;
2382 setSSELevel(Features, AVX, true);
2383 case SSE4A:
2384 Features["sse4a"] = true;
2385 setSSELevel(Features, SSE3, true);
2386 case NoXOP:
2387 break;
2388 }
2389 return;
2390 }
2391
2392 switch (Level) {
2393 case NoXOP:
2394 case SSE4A:
2395 Features["sse4a"] = false;
2396 case FMA4:
2397 Features["fma4"] = false;
2398 case XOP:
2399 Features["xop"] = false;
2400 }
2401}
2402
Craig Topper86d79ef2013-09-17 04:51:29 +00002403void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2404 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002405 // FIXME: This *really* should not be here. We need some way of translating
2406 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002407 if (Name == "sse4")
2408 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002409
Rafael Espindolae62e2792013-08-20 13:44:29 +00002410 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002411
Craig Topper29561122013-09-19 01:13:07 +00002412 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002413 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002414 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002415 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002416 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002417 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002418 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002419 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002420 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002421 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002422 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002423 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002424 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002425 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002426 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002427 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002428 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002429 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002430 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002431 if (Enabled)
2432 setSSELevel(Features, SSE2, Enabled);
2433 } else if (Name == "pclmul") {
2434 if (Enabled)
2435 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002436 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002437 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002438 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002439 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002440 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002441 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002442 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2443 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002444 if (Enabled)
2445 setSSELevel(Features, AVX512F, Enabled);
2446 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002447 if (Enabled)
2448 setSSELevel(Features, AVX, Enabled);
2449 } else if (Name == "fma4") {
2450 setXOPLevel(Features, FMA4, Enabled);
2451 } else if (Name == "xop") {
2452 setXOPLevel(Features, XOP, Enabled);
2453 } else if (Name == "sse4a") {
2454 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002455 } else if (Name == "f16c") {
2456 if (Enabled)
2457 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002458 } else if (Name == "sha") {
2459 if (Enabled)
2460 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002461 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002462}
2463
Eric Christopher3ff21b32013-10-16 21:26:26 +00002464/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002465/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002466bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002467 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002468 // Remember the maximum enabled sselevel.
2469 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2470 // Ignore disabled features.
2471 if (Features[i][0] == '-')
2472 continue;
2473
Benjamin Kramer27402c62012-03-05 15:10:44 +00002474 StringRef Feature = StringRef(Features[i]).substr(1);
2475
2476 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002477 HasAES = true;
2478 continue;
2479 }
2480
Craig Topper3f122a72012-05-31 05:18:48 +00002481 if (Feature == "pclmul") {
2482 HasPCLMUL = true;
2483 continue;
2484 }
2485
Benjamin Kramer27402c62012-03-05 15:10:44 +00002486 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002487 HasLZCNT = true;
2488 continue;
2489 }
2490
Rafael Espindola89049822013-08-23 20:21:37 +00002491 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002492 HasRDRND = true;
2493 continue;
2494 }
2495
Benjamin Kramer27402c62012-03-05 15:10:44 +00002496 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002497 HasBMI = true;
2498 continue;
2499 }
2500
Benjamin Kramer27402c62012-03-05 15:10:44 +00002501 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002502 HasBMI2 = true;
2503 continue;
2504 }
2505
Benjamin Kramer27402c62012-03-05 15:10:44 +00002506 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002507 HasPOPCNT = true;
2508 continue;
2509 }
2510
Michael Liao625a8752012-11-10 05:17:46 +00002511 if (Feature == "rtm") {
2512 HasRTM = true;
2513 continue;
2514 }
2515
Michael Liao74f4eaf2013-03-26 17:52:08 +00002516 if (Feature == "prfchw") {
2517 HasPRFCHW = true;
2518 continue;
2519 }
2520
Michael Liaoffaae352013-03-29 05:17:55 +00002521 if (Feature == "rdseed") {
2522 HasRDSEED = true;
2523 continue;
2524 }
2525
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002526 if (Feature == "tbm") {
2527 HasTBM = true;
2528 continue;
2529 }
2530
Craig Topperbba778b2012-06-03 21:46:30 +00002531 if (Feature == "fma") {
2532 HasFMA = true;
2533 continue;
2534 }
2535
Manman Rena45358c2012-10-11 00:59:55 +00002536 if (Feature == "f16c") {
2537 HasF16C = true;
2538 continue;
2539 }
2540
Craig Topper679b53a2013-08-21 05:29:10 +00002541 if (Feature == "avx512cd") {
2542 HasAVX512CD = true;
2543 continue;
2544 }
2545
2546 if (Feature == "avx512er") {
2547 HasAVX512ER = true;
2548 continue;
2549 }
2550
2551 if (Feature == "avx512pf") {
2552 HasAVX512PF = true;
2553 continue;
2554 }
2555
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002556 if (Feature == "avx512dq") {
2557 HasAVX512DQ = true;
2558 continue;
2559 }
2560
2561 if (Feature == "avx512bw") {
2562 HasAVX512BW = true;
2563 continue;
2564 }
2565
2566 if (Feature == "avx512vl") {
2567 HasAVX512VL = true;
2568 continue;
2569 }
2570
Ben Langmuir58078d02013-09-19 13:22:04 +00002571 if (Feature == "sha") {
2572 HasSHA = true;
2573 continue;
2574 }
2575
Nick Lewycky50e8f482013-10-05 20:14:27 +00002576 if (Feature == "cx16") {
2577 HasCX16 = true;
2578 continue;
2579 }
2580
Daniel Dunbar979586e2009-11-11 09:38:56 +00002581 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002582 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002583 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002584 .Case("avx2", AVX2)
2585 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002586 .Case("sse4.2", SSE42)
2587 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002588 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002589 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002590 .Case("sse2", SSE2)
2591 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002592 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002593 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002594
Eli Friedman33465822011-07-08 23:31:17 +00002595 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002596 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002597 .Case("3dnowa", AMD3DNowAthlon)
2598 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002599 .Case("mmx", MMX)
2600 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002601 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002602
2603 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2604 .Case("xop", XOP)
2605 .Case("fma4", FMA4)
2606 .Case("sse4a", SSE4A)
2607 .Default(NoXOP);
2608 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002609 }
Eli Friedman33465822011-07-08 23:31:17 +00002610
Craig Topper7481d8a2013-09-10 06:55:47 +00002611 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2612 // Can't do this earlier because we need to be able to explicitly enable
2613 // popcnt and still disable sse4.2.
2614 if (!HasPOPCNT && SSELevel >= SSE42 &&
2615 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2616 HasPOPCNT = true;
2617 Features.push_back("+popcnt");
2618 }
2619
Yunzhong Gao61089362013-10-16 19:07:02 +00002620 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2621 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2622 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2623 HasPRFCHW = true;
2624 Features.push_back("+prfchw");
2625 }
2626
Rafael Espindolaeb265472013-08-21 21:59:03 +00002627 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2628 // matches the selected sse level.
2629 if (FPMath == FP_SSE && SSELevel < SSE1) {
2630 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2631 return false;
2632 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2633 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2634 return false;
2635 }
2636
Eli Friedman33465822011-07-08 23:31:17 +00002637 // Don't tell the backend if we're turning off mmx; it will end up disabling
2638 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002639 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2640 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002641 std::vector<std::string>::iterator it;
2642 it = std::find(Features.begin(), Features.end(), "-mmx");
2643 if (it != Features.end())
2644 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002645 else if (SSELevel > NoSSE)
2646 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002647 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002648}
Chris Lattnerecd49032009-03-02 22:27:17 +00002649
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002650/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2651/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002652void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002653 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002654 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002655 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002656 Builder.defineMacro("__amd64__");
2657 Builder.defineMacro("__amd64");
2658 Builder.defineMacro("__x86_64");
2659 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002660 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002661 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002662 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002663
Chris Lattnerecd49032009-03-02 22:27:17 +00002664 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002665 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2666 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002667 switch (CPU) {
2668 case CK_Generic:
2669 break;
2670 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002671 // The rest are coming from the i386 define above.
2672 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002673 break;
2674 case CK_i486:
2675 case CK_WinChipC6:
2676 case CK_WinChip2:
2677 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002678 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002679 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002680 case CK_PentiumMMX:
2681 Builder.defineMacro("__pentium_mmx__");
2682 Builder.defineMacro("__tune_pentium_mmx__");
2683 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002684 case CK_i586:
2685 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002686 defineCPUMacros(Builder, "i586");
2687 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002688 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002689 case CK_Pentium3:
2690 case CK_Pentium3M:
2691 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002692 Builder.defineMacro("__tune_pentium3__");
2693 // Fallthrough
2694 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002695 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002696 Builder.defineMacro("__tune_pentium2__");
2697 // Fallthrough
2698 case CK_PentiumPro:
2699 Builder.defineMacro("__tune_i686__");
2700 Builder.defineMacro("__tune_pentiumpro__");
2701 // Fallthrough
2702 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002703 Builder.defineMacro("__i686");
2704 Builder.defineMacro("__i686__");
2705 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2706 Builder.defineMacro("__pentiumpro");
2707 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002708 break;
2709 case CK_Pentium4:
2710 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002711 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002712 break;
2713 case CK_Yonah:
2714 case CK_Prescott:
2715 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002716 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002717 break;
2718 case CK_Core2:
2719 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002720 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002721 break;
2722 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002723 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002724 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002725 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002726 defineCPUMacros(Builder, "slm");
2727 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002728 case CK_Corei7:
2729 case CK_Corei7AVX:
2730 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002731 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002732 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002733 break;
Craig Topper449314e2013-08-20 07:09:39 +00002734 case CK_KNL:
2735 defineCPUMacros(Builder, "knl");
2736 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002737 case CK_SKX:
2738 defineCPUMacros(Builder, "skx");
2739 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002740 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002741 Builder.defineMacro("__k6_2__");
2742 Builder.defineMacro("__tune_k6_2__");
2743 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002744 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002745 if (CPU != CK_K6_2) { // In case of fallthrough
2746 // FIXME: GCC may be enabling these in cases where some other k6
2747 // architecture is specified but -m3dnow is explicitly provided. The
2748 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002749 Builder.defineMacro("__k6_3__");
2750 Builder.defineMacro("__tune_k6_3__");
2751 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002752 // Fallthrough
2753 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002754 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002755 break;
2756 case CK_Athlon:
2757 case CK_AthlonThunderbird:
2758 case CK_Athlon4:
2759 case CK_AthlonXP:
2760 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002761 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002762 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002763 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002764 Builder.defineMacro("__tune_athlon_sse__");
2765 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002766 break;
2767 case CK_K8:
2768 case CK_K8SSE3:
2769 case CK_x86_64:
2770 case CK_Opteron:
2771 case CK_OpteronSSE3:
2772 case CK_Athlon64:
2773 case CK_Athlon64SSE3:
2774 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002775 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002776 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002777 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002778 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002779 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002780 case CK_BTVER1:
2781 defineCPUMacros(Builder, "btver1");
2782 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002783 case CK_BTVER2:
2784 defineCPUMacros(Builder, "btver2");
2785 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002786 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002787 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002788 break;
2789 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002790 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002791 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002792 case CK_BDVER3:
2793 defineCPUMacros(Builder, "bdver3");
2794 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002795 case CK_BDVER4:
2796 defineCPUMacros(Builder, "bdver4");
2797 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002798 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002799 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002800 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002801 }
Chris Lattner96e43572009-03-02 22:40:39 +00002802
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002803 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002804 Builder.defineMacro("__REGISTER_PREFIX__", "");
2805
Chris Lattner6df41af2009-04-19 17:32:33 +00002806 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2807 // functions in glibc header files that use FP Stack inline asm which the
2808 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002809 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002810
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002811 if (HasAES)
2812 Builder.defineMacro("__AES__");
2813
Craig Topper3f122a72012-05-31 05:18:48 +00002814 if (HasPCLMUL)
2815 Builder.defineMacro("__PCLMUL__");
2816
Craig Topper22967d42011-12-25 05:06:45 +00002817 if (HasLZCNT)
2818 Builder.defineMacro("__LZCNT__");
2819
Benjamin Kramer1e250392012-07-07 09:39:18 +00002820 if (HasRDRND)
2821 Builder.defineMacro("__RDRND__");
2822
Craig Topper22967d42011-12-25 05:06:45 +00002823 if (HasBMI)
2824 Builder.defineMacro("__BMI__");
2825
2826 if (HasBMI2)
2827 Builder.defineMacro("__BMI2__");
2828
Craig Topper1de83482011-12-29 16:10:46 +00002829 if (HasPOPCNT)
2830 Builder.defineMacro("__POPCNT__");
2831
Michael Liao625a8752012-11-10 05:17:46 +00002832 if (HasRTM)
2833 Builder.defineMacro("__RTM__");
2834
Michael Liao74f4eaf2013-03-26 17:52:08 +00002835 if (HasPRFCHW)
2836 Builder.defineMacro("__PRFCHW__");
2837
Michael Liaoffaae352013-03-29 05:17:55 +00002838 if (HasRDSEED)
2839 Builder.defineMacro("__RDSEED__");
2840
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002841 if (HasTBM)
2842 Builder.defineMacro("__TBM__");
2843
Rafael Espindolae62e2792013-08-20 13:44:29 +00002844 switch (XOPLevel) {
2845 case XOP:
2846 Builder.defineMacro("__XOP__");
2847 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002848 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002849 case SSE4A:
2850 Builder.defineMacro("__SSE4A__");
2851 case NoXOP:
2852 break;
2853 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002854
Craig Topperbba778b2012-06-03 21:46:30 +00002855 if (HasFMA)
2856 Builder.defineMacro("__FMA__");
2857
Manman Rena45358c2012-10-11 00:59:55 +00002858 if (HasF16C)
2859 Builder.defineMacro("__F16C__");
2860
Craig Topper679b53a2013-08-21 05:29:10 +00002861 if (HasAVX512CD)
2862 Builder.defineMacro("__AVX512CD__");
2863 if (HasAVX512ER)
2864 Builder.defineMacro("__AVX512ER__");
2865 if (HasAVX512PF)
2866 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002867 if (HasAVX512DQ)
2868 Builder.defineMacro("__AVX512DQ__");
2869 if (HasAVX512BW)
2870 Builder.defineMacro("__AVX512BW__");
2871 if (HasAVX512VL)
2872 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00002873
Ben Langmuir58078d02013-09-19 13:22:04 +00002874 if (HasSHA)
2875 Builder.defineMacro("__SHA__");
2876
Nick Lewycky50e8f482013-10-05 20:14:27 +00002877 if (HasCX16)
2878 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2879
Chris Lattner96e43572009-03-02 22:40:39 +00002880 // Each case falls through to the previous one here.
2881 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002882 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002883 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002884 case AVX2:
2885 Builder.defineMacro("__AVX2__");
2886 case AVX:
2887 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002888 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002889 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002890 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002891 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002892 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002893 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002894 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002895 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002896 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002897 Builder.defineMacro("__SSE2__");
2898 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002899 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002900 Builder.defineMacro("__SSE__");
2901 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002902 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002903 break;
2904 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002905
Derek Schuffc7dd7222012-10-11 15:52:22 +00002906 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002907 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002908 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002909 case AVX2:
2910 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002911 case SSE42:
2912 case SSE41:
2913 case SSSE3:
2914 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002915 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002916 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002917 break;
2918 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002919 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002920 break;
2921 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002922 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002923 }
2924 }
2925
Anders Carlssone437c682010-01-27 03:47:49 +00002926 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002927 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002928 case AMD3DNowAthlon:
2929 Builder.defineMacro("__3dNOW_A__");
2930 case AMD3DNow:
2931 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002932 case MMX:
2933 Builder.defineMacro("__MMX__");
2934 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002935 break;
2936 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002937
2938 if (CPU >= CK_i486) {
2939 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2940 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2941 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2942 }
2943 if (CPU >= CK_i586)
2944 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002945}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002946
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002947bool X86TargetInfo::hasFeature(StringRef Feature) const {
2948 return llvm::StringSwitch<bool>(Feature)
2949 .Case("aes", HasAES)
2950 .Case("avx", SSELevel >= AVX)
2951 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002952 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002953 .Case("avx512cd", HasAVX512CD)
2954 .Case("avx512er", HasAVX512ER)
2955 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002956 .Case("avx512dq", HasAVX512DQ)
2957 .Case("avx512bw", HasAVX512BW)
2958 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002959 .Case("bmi", HasBMI)
2960 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002961 .Case("cx16", HasCX16)
2962 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002963 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002964 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002965 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002966 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002967 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002968 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2969 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2970 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002971 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002972 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002973 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002974 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002975 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002976 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002977 .Case("sse", SSELevel >= SSE1)
2978 .Case("sse2", SSELevel >= SSE2)
2979 .Case("sse3", SSELevel >= SSE3)
2980 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002981 .Case("sse4.1", SSELevel >= SSE41)
2982 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002983 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002984 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002985 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2986 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002987 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002988 .Default(false);
2989}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002990
Eli Friedman3fd920a2008-08-20 02:34:37 +00002991bool
Anders Carlsson58436352009-02-28 17:11:49 +00002992X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002993 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002994 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002995 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002996 case 'Y': // first letter of a pair:
2997 switch (*(Name+1)) {
2998 default: return false;
2999 case '0': // First SSE register.
3000 case 't': // Any SSE register, when SSE2 is enabled.
3001 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3002 case 'm': // any MMX register, when inter-unit moves enabled.
3003 break; // falls through to setAllowsRegister.
3004 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003005 case 'f': // any x87 floating point stack register.
3006 // Constraint 'f' cannot be used for output operands.
3007 if (Info.ConstraintStr[0] == '=')
3008 return false;
3009
3010 Info.setAllowsRegister();
3011 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003012 case 'a': // eax.
3013 case 'b': // ebx.
3014 case 'c': // ecx.
3015 case 'd': // edx.
3016 case 'S': // esi.
3017 case 'D': // edi.
3018 case 'A': // edx:eax.
3019 case 't': // top of floating point stack.
3020 case 'u': // second from top of floating point stack.
3021 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003022 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003023 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003024 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003025 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3026 case 'l': // "Index" registers: any general register that can be used as an
3027 // index in a base+index memory access.
3028 Info.setAllowsRegister();
3029 return true;
3030 case 'C': // SSE floating point constant.
3031 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003032 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003033 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003034 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003035 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003036 return true;
3037 }
3038}
3039
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003040
Eli Friedman3fd920a2008-08-20 02:34:37 +00003041std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003042X86TargetInfo::convertConstraint(const char *&Constraint) const {
3043 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003044 case 'a': return std::string("{ax}");
3045 case 'b': return std::string("{bx}");
3046 case 'c': return std::string("{cx}");
3047 case 'd': return std::string("{dx}");
3048 case 'S': return std::string("{si}");
3049 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003050 case 'p': // address
3051 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003052 case 't': // top of floating point stack.
3053 return std::string("{st}");
3054 case 'u': // second from top of floating point stack.
3055 return std::string("{st(1)}"); // second from top of floating point stack.
3056 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003057 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003058 }
3059}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003060} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003061
3062namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003063// X86-32 generic target
3064class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003065public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003066 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003067 DoubleAlign = LongLongAlign = 32;
3068 LongDoubleWidth = 96;
3069 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003070 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003071 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003072 SizeType = UnsignedInt;
3073 PtrDiffType = SignedInt;
3074 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003075 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003076
3077 // Use fpret for all types.
3078 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3079 (1 << TargetInfo::Double) |
3080 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003081
3082 // x86-32 has atomics up to 8 bytes
3083 // FIXME: Check that we actually have cmpxchg8b before setting
3084 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3085 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003086 }
Craig Topper3164f332014-03-11 03:39:26 +00003087 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003088 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003089 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003090
Craig Topper3164f332014-03-11 03:39:26 +00003091 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003092 if (RegNo == 0) return 0;
3093 if (RegNo == 1) return 2;
3094 return -1;
3095 }
Craig Topper3164f332014-03-11 03:39:26 +00003096 bool validateInputSize(StringRef Constraint,
3097 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003098 switch (Constraint[0]) {
3099 default: break;
3100 case 'a':
3101 case 'b':
3102 case 'c':
3103 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003104 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00003105 }
3106
3107 return true;
3108 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003109};
3110} // end anonymous namespace
3111
3112namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003113class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3114public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003115 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3116 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003117
Craig Topper3164f332014-03-11 03:39:26 +00003118 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003119 unsigned Major, Minor, Micro;
3120 getTriple().getOSVersion(Major, Minor, Micro);
3121 // New NetBSD uses the default rounding mode.
3122 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3123 return X86_32TargetInfo::getFloatEvalMethod();
3124 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003125 return 1;
3126 }
3127};
3128} // end anonymous namespace
3129
3130namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003131class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3132public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003133 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3134 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003135 SizeType = UnsignedLong;
3136 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003137 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003138 }
3139};
3140} // end anonymous namespace
3141
3142namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003143class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3144public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003145 BitrigI386TargetInfo(const llvm::Triple &Triple)
3146 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003147 SizeType = UnsignedLong;
3148 IntPtrType = SignedLong;
3149 PtrDiffType = SignedLong;
3150 }
3151};
3152} // end anonymous namespace
3153
3154namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003155class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003156public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003157 DarwinI386TargetInfo(const llvm::Triple &Triple)
3158 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003159 LongDoubleWidth = 128;
3160 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003161 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003162 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003163 SizeType = UnsignedLong;
3164 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003165 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003166 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003167 }
3168
Eli Friedman3fd920a2008-08-20 02:34:37 +00003169};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003170} // end anonymous namespace
3171
3172namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003173// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003174class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003175public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003176 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3177 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003178 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003179 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003180 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003181 }
Craig Topper3164f332014-03-11 03:39:26 +00003182 void getTargetDefines(const LangOptions &Opts,
3183 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003184 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3185 }
3186};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003187
3188// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003189class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003190public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003191 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003192 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003193 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003194 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3195 }
Craig Topper3164f332014-03-11 03:39:26 +00003196 void getTargetDefines(const LangOptions &Opts,
3197 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003198 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3199 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3200 // The value of the following reflects processor type.
3201 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3202 // We lost the original triple, so we use the default.
3203 Builder.defineMacro("_M_IX86", "600");
3204 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003205};
3206} // end anonymous namespace
3207
Reid Kleckner47606832014-04-21 20:58:00 +00003208static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3209 Builder.defineMacro("__MSVCRT__");
3210 Builder.defineMacro("__MINGW32__");
3211
3212 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3213 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3214 // macro anyway for pre-processor compatibility.
3215 if (Opts.MicrosoftExt)
3216 Builder.defineMacro("__declspec", "__declspec");
3217 else
3218 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3219
3220 if (!Opts.MicrosoftExt) {
3221 // Provide macros for all the calling convention keywords. Provide both
3222 // single and double underscore prefixed variants. These are available on
3223 // x64 as well as x86, even though they have no effect.
3224 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3225 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003226 std::string GCCSpelling = "__attribute__((__";
3227 GCCSpelling += CC;
3228 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003229 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3230 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3231 }
3232 }
3233}
3234
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003235namespace {
3236// x86-32 MinGW target
3237class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3238public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003239 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3240 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003241 void getTargetDefines(const LangOptions &Opts,
3242 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003243 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003244 DefineStd(Builder, "WIN32", Opts);
3245 DefineStd(Builder, "WINNT", Opts);
3246 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003247 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003248 }
3249};
3250} // end anonymous namespace
3251
3252namespace {
3253// x86-32 Cygwin target
3254class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3255public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003256 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3257 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003258 TLSSupported = false;
3259 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003260 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003261 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003262 }
Craig Topper3164f332014-03-11 03:39:26 +00003263 void getTargetDefines(const LangOptions &Opts,
3264 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003265 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003266 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003267 Builder.defineMacro("__CYGWIN__");
3268 Builder.defineMacro("__CYGWIN32__");
3269 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003270 if (Opts.CPlusPlus)
3271 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003272 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003273};
3274} // end anonymous namespace
3275
3276namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003277// x86-32 Haiku target
3278class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3279public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003280 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003281 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003282 IntPtrType = SignedLong;
3283 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003284 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003285 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003286 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003287 }
Craig Topper3164f332014-03-11 03:39:26 +00003288 void getTargetDefines(const LangOptions &Opts,
3289 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003290 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3291 Builder.defineMacro("__INTEL__");
3292 Builder.defineMacro("__HAIKU__");
3293 }
3294};
3295} // end anonymous namespace
3296
Douglas Gregor9fabd852011-07-01 22:41:14 +00003297// RTEMS Target
3298template<typename Target>
3299class RTEMSTargetInfo : public OSTargetInfo<Target> {
3300protected:
Craig Topper3164f332014-03-11 03:39:26 +00003301 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3302 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003303 // RTEMS defines; list based off of gcc output
3304
Douglas Gregor9fabd852011-07-01 22:41:14 +00003305 Builder.defineMacro("__rtems__");
3306 Builder.defineMacro("__ELF__");
3307 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003308
Douglas Gregor9fabd852011-07-01 22:41:14 +00003309public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003310 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3311 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003312
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003313 switch (Triple.getArch()) {
3314 default:
3315 case llvm::Triple::x86:
3316 // this->MCountName = ".mcount";
3317 break;
3318 case llvm::Triple::mips:
3319 case llvm::Triple::mipsel:
3320 case llvm::Triple::ppc:
3321 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003322 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003323 // this->MCountName = "_mcount";
3324 break;
3325 case llvm::Triple::arm:
3326 // this->MCountName = "__mcount";
3327 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003328 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003329 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003330};
3331
3332namespace {
3333// x86-32 RTEMS target
3334class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3335public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003336 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003337 SizeType = UnsignedLong;
3338 IntPtrType = SignedLong;
3339 PtrDiffType = SignedLong;
3340 this->UserLabelPrefix = "";
3341 }
Craig Topper3164f332014-03-11 03:39:26 +00003342 void getTargetDefines(const LangOptions &Opts,
3343 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003344 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3345 Builder.defineMacro("__INTEL__");
3346 Builder.defineMacro("__rtems__");
3347 }
3348};
3349} // end anonymous namespace
3350
Chris Lattnerb986aba2010-04-11 19:29:39 +00003351namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003352// x86-64 generic target
3353class X86_64TargetInfo : public X86TargetInfo {
3354public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003355 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003356 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003357 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003358 LongDoubleWidth = 128;
3359 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003360 LargeArrayMinWidth = 128;
3361 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003362 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003363 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3364 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3365 IntPtrType = IsX32 ? SignedInt : SignedLong;
3366 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003367 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003368 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003369
Zinovy Nis1db95732014-07-10 15:27:19 +00003370 DescriptionString = (IsX32)
3371 ? "e-m:e-" "p:32:32-" "i64:64-f80:128-n8:16:32:64-S128"
3372 : "e-m:e-" "i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003373
3374 // Use fpret only for long double.
3375 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003376
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003377 // Use fp2ret for _Complex long double.
3378 ComplexLongDoubleUsesFP2Ret = true;
3379
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003380 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003381 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003382 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003383 }
Craig Topper3164f332014-03-11 03:39:26 +00003384 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003385 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003386 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003387
Craig Topper3164f332014-03-11 03:39:26 +00003388 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003389 if (RegNo == 0) return 0;
3390 if (RegNo == 1) return 1;
3391 return -1;
3392 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003393
Craig Topper3164f332014-03-11 03:39:26 +00003394 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003395 return (CC == CC_C ||
3396 CC == CC_IntelOclBicc ||
3397 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003398 }
3399
Craig Topper3164f332014-03-11 03:39:26 +00003400 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003401 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003402 }
3403
Pavel Chupinfd223e12014-08-04 12:39:43 +00003404 // for x32 we need it here explicitly
3405 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003406};
3407} // end anonymous namespace
3408
3409namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003410// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003411class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003412public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003413 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3414 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003415 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003416 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003417 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003418 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003419 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003420 SizeType = UnsignedLongLong;
3421 PtrDiffType = SignedLongLong;
3422 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003423 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003424 }
Craig Topper3164f332014-03-11 03:39:26 +00003425 void getTargetDefines(const LangOptions &Opts,
3426 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003427 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003428 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003429 }
Craig Topper3164f332014-03-11 03:39:26 +00003430 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003431 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003432 }
Craig Topper3164f332014-03-11 03:39:26 +00003433 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003434 return (CC == CC_C ||
3435 CC == CC_IntelOclBicc ||
3436 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3437 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003438};
3439} // end anonymous namespace
3440
3441namespace {
3442// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003443class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003444public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003445 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003446 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003447 LongDoubleWidth = LongDoubleAlign = 64;
3448 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003449 }
Craig Topper3164f332014-03-11 03:39:26 +00003450 void getTargetDefines(const LangOptions &Opts,
3451 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003452 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3453 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003454 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003455 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003456 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003457};
3458} // end anonymous namespace
3459
3460namespace {
3461// x86-64 MinGW target
3462class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3463public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003464 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3465 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003466 void getTargetDefines(const LangOptions &Opts,
3467 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003468 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003469 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003470 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003471 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003472 }
3473};
3474} // end anonymous namespace
3475
3476namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003477class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3478public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003479 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3480 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003481 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003482 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003483 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3484 llvm::Triple T = llvm::Triple(Triple);
3485 if (T.getOS() == llvm::Triple::IOS)
3486 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003487 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003488 }
3489};
3490} // end anonymous namespace
3491
3492namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003493class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3494public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003495 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3496 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003497 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003498 Int64Type = SignedLongLong;
3499 }
3500};
3501} // end anonymous namespace
3502
3503namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003504class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3505public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003506 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3507 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3508 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003509 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003510 }
3511};
Tim Northover9bb857a2013-01-31 12:13:10 +00003512}
3513
Eli Friedman9fa28852012-08-08 23:57:20 +00003514
3515namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003516class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003517 // Possible FPU choices.
3518 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003519 VFP2FPU = (1 << 0),
3520 VFP3FPU = (1 << 1),
3521 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003522 NeonFPU = (1 << 3),
3523 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003524 };
3525
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003526 // Possible HWDiv features.
3527 enum HWDivMode {
3528 HWDivThumb = (1 << 0),
3529 HWDivARM = (1 << 1)
3530 };
3531
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003532 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003533 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003534 }
3535
3536 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3537 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003538
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003539 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003540
Rafael Espindolaeb265472013-08-21 21:59:03 +00003541 enum {
3542 FP_Default,
3543 FP_VFP,
3544 FP_Neon
3545 } FPMath;
3546
Bernard Ogdenda13af32013-10-24 18:32:51 +00003547 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003548
Logan Chien57086ce2012-10-10 06:56:20 +00003549 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003550 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003551 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003552
3553 // Initialized via features.
3554 unsigned SoftFloat : 1;
3555 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003556
Bernard Ogden18b57012013-10-29 09:47:51 +00003557 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003558 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003559
Chris Lattner5cc15e02010-03-03 19:03:45 +00003560 static const Builtin::Info BuiltinInfo[];
3561
Rafael Espindola101d5b92013-05-13 20:09:47 +00003562 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003563 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003564 if (T.getArch() == llvm::Triple::arm ||
3565 T.getArch() == llvm::Triple::armeb) {
3566 StringRef VersionStr;
3567 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003568 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003569 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003570 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003571 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003572 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003573 unsigned Version;
3574 if (VersionStr.getAsInteger(10, Version))
3575 return false;
3576 return Version >= 6;
3577 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003578 assert(T.getArch() == llvm::Triple::thumb ||
3579 T.getArch() == llvm::Triple::thumbeb);
3580 StringRef VersionStr;
3581 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003582 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003583 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003584 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003585 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003586 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003587 unsigned Version;
3588 if (VersionStr.getAsInteger(10, Version))
3589 return false;
3590 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003591 }
3592
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003593 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003594 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003595
3596 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003597 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003598
Joerg Sonnenbergerf19dc302014-01-26 20:02:03 +00003599 // size_t is unsigned long on Darwin and NetBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003600 if (T.isOSDarwin() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003601 SizeType = UnsignedLong;
3602 else
3603 SizeType = UnsignedInt;
3604
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003605 switch (T.getOS()) {
3606 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003607 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003608 break;
3609 case llvm::Triple::Win32:
3610 WCharType = UnsignedShort;
3611 break;
3612 case llvm::Triple::Linux:
3613 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003614 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3615 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003616 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003617 }
3618
3619 UseBitFieldTypeAlignment = true;
3620
3621 ZeroLengthBitfieldBoundary = 0;
3622
3623 if (IsThumb) {
3624 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3625 // so set preferred for small types to 32.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003626 if (T.isOSBinFormatMachO()) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003627 DescriptionString = BigEndian ?
3628 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3629 "v128:64:128-a:0:32-n32-S64" :
3630 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3631 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003632 } else if (T.isOSWindows()) {
3633 // FIXME: this is invalid for WindowsCE
3634 assert(!BigEndian && "Windows on ARM does not support big endian");
3635 DescriptionString = "e"
3636 "-m:e"
3637 "-p:32:32"
3638 "-i1:8:32-i8:8:32-i16:16:32-i64:64"
3639 "-v128:64:128"
3640 "-a:0:32"
3641 "-n32"
3642 "-S64";
3643 } else {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003644 DescriptionString = BigEndian ?
3645 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3646 "v128:64:128-a:0:32-n32-S64" :
3647 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3648 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003649 }
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003650 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003651 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003652 DescriptionString = BigEndian ?
3653 "E-m:o-p:32:32-i64:64-v128:64:128-n32-S64" :
3654 "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003655 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003656 DescriptionString = BigEndian ?
3657 "E-m:e-p:32:32-i64:64-v128:64:128-n32-S64" :
3658 "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003659 }
3660
3661 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003662 }
3663
3664 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003665 const llvm::Triple &T = getTriple();
3666
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003667 IsAAPCS = false;
3668
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003669 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003670
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003671 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003672 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003673 SizeType = UnsignedInt;
3674 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003675 SizeType = UnsignedLong;
3676
3677 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3678 WCharType = SignedInt;
3679
3680 // Do not respect the alignment of bit-field types when laying out
3681 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3682 UseBitFieldTypeAlignment = false;
3683
3684 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3685 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3686 /// gcc.
3687 ZeroLengthBitfieldBoundary = 32;
3688
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003689 if (IsThumb) {
3690 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3691 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003692 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003693 DescriptionString = BigEndian ?
3694 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3695 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3696 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3697 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003698 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003699 DescriptionString = BigEndian ?
3700 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3701 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3702 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3703 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003704 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003705 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003706 DescriptionString = BigEndian ?
3707 "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 +00003708 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3709 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003710 DescriptionString = BigEndian ?
3711 "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 +00003712 "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 +00003713 }
3714
3715 // FIXME: Override "preferred align" for double and long long.
3716 }
3717
Chris Lattner17df24e2008-04-21 18:56:49 +00003718public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003719 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003720 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3721 IsAAPCS(true) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003722 BigEndian = IsBigEndian;
3723
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003724 switch (getTriple().getOS()) {
3725 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003726 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003727 break;
3728 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003729 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003730 break;
3731 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003732
Chris Lattner1a8f3942010-04-23 16:29:58 +00003733 // {} in inline assembly are neon specifiers, not assembly variant
3734 // specifiers.
3735 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003736
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003737 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003738 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003739
3740 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003741
3742 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003743 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003744
3745 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003746 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003747 if (shouldUseInlineAtomic(getTriple()))
3748 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003749
3750 // Do force alignment of members that follow zero length bitfields. If
3751 // the alignment of the zero-length bitfield is greater than the member
3752 // that follows it, `bar', `bar' will be aligned as the type of the
3753 // zero length bitfield.
3754 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003755 }
Alp Toker4925ba72014-06-07 23:30:42 +00003756 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003757 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003758 ABI = Name;
3759
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003760 // The defaults (above) are for AAPCS, check if we need to change them.
3761 //
3762 // FIXME: We need support for -meabi... we could just mangle it into the
3763 // name.
3764 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003765 setABIAPCS();
3766 return true;
3767 }
3768 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3769 setABIAAPCS();
3770 return true;
3771 }
3772 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003773 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003774
Craig Topper3164f332014-03-11 03:39:26 +00003775 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003776 if (IsAAPCS)
3777 Features["aapcs"] = true;
3778 else
3779 Features["apcs"] = true;
3780
Silviu Barangae5690462013-10-21 10:59:33 +00003781 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003782 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3783 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003784 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3785 CPU == "cortex-a9-mp") {
3786 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003787 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003788 }
3789 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003790 Features["vfp4"] = true;
3791 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003792 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3793 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3794 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003795 Features["vfp4"] = true;
3796 Features["neon"] = true;
3797 Features["hwdiv"] = true;
3798 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003799 } else if (CPU == "cyclone") {
3800 Features["v8fp"] = true;
3801 Features["neon"] = true;
3802 Features["hwdiv"] = true;
3803 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003804 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3805 Features["fp-armv8"] = true;
3806 Features["neon"] = true;
3807 Features["hwdiv"] = true;
3808 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003809 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003810 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003811 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003812 // Enable the hwdiv extension for all v8a AArch32 cores by
3813 // default.
3814 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003815 ArchName == "armebv8a" || ArchName == "armebv8" ||
3816 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3817 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00003818 Features["hwdiv"] = true;
3819 Features["hwdiv-arm"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003820 } else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
3821 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003822 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003823 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003824
Craig Topper3164f332014-03-11 03:39:26 +00003825 bool handleTargetFeatures(std::vector<std::string> &Features,
3826 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003827 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003828 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003829 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003830 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003831 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003832 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3833 if (Features[i] == "+soft-float")
3834 SoftFloat = true;
3835 else if (Features[i] == "+soft-float-abi")
3836 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003837 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003838 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003839 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003840 FPU |= VFP3FPU;
3841 else if (Features[i] == "+vfp4")
3842 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003843 else if (Features[i] == "+fp-armv8")
3844 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003845 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003846 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003847 else if (Features[i] == "+hwdiv")
3848 HWDiv |= HWDivThumb;
3849 else if (Features[i] == "+hwdiv-arm")
3850 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00003851 else if (Features[i] == "+crc")
3852 CRC = 1;
Tim Northover02e38602014-02-03 17:28:04 +00003853 else if (Features[i] == "+crypto")
3854 Crypto = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003855 }
3856
Rafael Espindolaeb265472013-08-21 21:59:03 +00003857 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3858 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3859 return false;
3860 }
3861
3862 if (FPMath == FP_Neon)
3863 Features.push_back("+neonfp");
3864 else if (FPMath == FP_VFP)
3865 Features.push_back("-neonfp");
3866
Daniel Dunbar893d4752009-12-19 04:15:38 +00003867 // Remove front-end specific options which the backend handles differently.
3868 std::vector<std::string>::iterator it;
3869 it = std::find(Features.begin(), Features.end(), "+soft-float");
3870 if (it != Features.end())
3871 Features.erase(it);
3872 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3873 if (it != Features.end())
3874 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00003875 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003876 }
3877
Craig Topper3164f332014-03-11 03:39:26 +00003878 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003879 return llvm::StringSwitch<bool>(Feature)
3880 .Case("arm", true)
3881 .Case("softfloat", SoftFloat)
3882 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003883 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003884 .Case("hwdiv", HWDiv & HWDivThumb)
3885 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003886 .Default(false);
3887 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003888 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003889 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003890 return llvm::StringSwitch<const char*>(Name)
3891 .Cases("arm8", "arm810", "4")
3892 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3893 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3894 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3895 .Case("ep9312", "4T")
3896 .Cases("arm10tdmi", "arm1020t", "5T")
3897 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3898 .Case("arm926ej-s", "5TEJ")
3899 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3900 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003901 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003902 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003903 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003904 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00003905 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003906 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003907 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003908 .Case("swift", "7S")
Tim Northovera2ee4332014-03-29 15:09:45 +00003909 .Case("cyclone", "8A")
Jim Grosbachbe83cb82014-06-26 17:24:16 +00003910 .Case("cortex-m3", "7M")
3911 .Case("cortex-m4", "7EM")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003912 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003913 .Cases("cortex-a53", "cortex-a57", "8A")
Craig Topperf1186c52014-05-08 06:41:40 +00003914 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003915 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003916 static const char *getCPUProfile(StringRef Name) {
3917 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003918 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003919 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003920 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003921 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00003922 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00003923 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003924 }
Craig Topper3164f332014-03-11 03:39:26 +00003925 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003926 if (!getCPUDefineSuffix(Name))
3927 return false;
3928
Tim Northovere8c37212014-07-09 09:24:43 +00003929 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
3930 StringRef Profile = getCPUProfile(Name);
3931 if (Profile == "M" && MaxAtomicInlineWidth) {
3932 MaxAtomicPromoteWidth = 32;
3933 MaxAtomicInlineWidth = 32;
3934 }
3935
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003936 CPU = Name;
3937 return true;
3938 }
Craig Topper3164f332014-03-11 03:39:26 +00003939 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003940 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
3941 unsigned CPUArchVer) const {
3942 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
3943 (CPUArch.find('M') != StringRef::npos);
3944 }
3945 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
3946 unsigned CPUArchVer) const {
3947 // We check both CPUArchVer and ArchName because when only triple is
3948 // specified, the default CPU is arm1136j-s.
3949 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
3950 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
3951 }
Craig Topper3164f332014-03-11 03:39:26 +00003952 void getTargetDefines(const LangOptions &Opts,
3953 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00003954 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003955 Builder.defineMacro("__arm");
3956 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003957
Chris Lattnerecd49032009-03-02 22:27:17 +00003958 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003959 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003960
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003961 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003962 unsigned int CPUArchVer;
3963 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
3964 llvm_unreachable("Invalid char for architecture version number");
3965 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003966 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003967
3968 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003969 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003970 StringRef ArchName = getTriple().getArchName();
3971
3972 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
3973 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3974
3975 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
3976 // is not defined for the M-profile.
3977 // NOTE that the deffault profile is assumed to be 'A'
3978 if (CPUProfile.empty() || CPUProfile != "M")
3979 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
3980
3981 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
3982 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
3983 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
3984 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
3985 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
3986 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
3987 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
3988
3989 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
3990 // instruction set such as ARM or Thumb.
3991 Builder.defineMacro("__ARM_32BIT_STATE", "1");
3992
3993 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
3994
3995 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003996 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003997 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00003998
Yi Konga44c4d72014-06-27 21:25:42 +00003999 // ACLE predefines.
4000 Builder.defineMacro("__ARM_ACLE", "200");
4001
Mike Stump9d54bd72009-04-08 02:07:04 +00004002 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004003
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004004 // FIXME: It's more complicated than this and we don't really support
4005 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004006 // Windows on ARM does not "support" interworking
4007 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004008 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004009
David Tweed8f676532012-10-25 13:33:01 +00004010 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004011 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004012 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4013 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004014 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004015 Builder.defineMacro("__ARM_PCS", "1");
4016
David Tweed8f676532012-10-25 13:33:01 +00004017 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004018 Builder.defineMacro("__ARM_PCS_VFP", "1");
4019 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004020
Daniel Dunbar893d4752009-12-19 04:15:38 +00004021 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004022 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004023
4024 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004025 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004026
4027 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004028 Builder.defineMacro("__THUMBEL__");
4029 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004030 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004031 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004032 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004033 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4034 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004035
4036 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004037 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004038
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004039 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004040 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004041 if (FPU & VFP2FPU)
4042 Builder.defineMacro("__ARM_VFPV2__");
4043 if (FPU & VFP3FPU)
4044 Builder.defineMacro("__ARM_VFPV3__");
4045 if (FPU & VFP4FPU)
4046 Builder.defineMacro("__ARM_VFPV4__");
4047 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004048
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004049 // This only gets set when Neon instructions are actually available, unlike
4050 // the VFP define, hence the soft float and arch check. This is subtly
4051 // different from gcc, we follow the intent which was that it should be set
4052 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004053 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4054 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004055 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004056 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004057
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004058 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4059 Opts.ShortWChar ? "2" : "4");
4060
4061 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4062 Opts.ShortEnums ? "1" : "4");
4063
Bernard Ogden18b57012013-10-29 09:47:51 +00004064 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004065 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004066
Tim Northover02e38602014-02-03 17:28:04 +00004067 if (Crypto)
4068 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4069
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004070 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004071 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4072 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4073 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4074 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4075 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004076 }
Craig Topper3164f332014-03-11 03:39:26 +00004077 void getTargetBuiltins(const Builtin::Info *&Records,
4078 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004079 Records = BuiltinInfo;
4080 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004081 }
Craig Topper3164f332014-03-11 03:39:26 +00004082 bool isCLZForZeroUndef() const override { return false; }
4083 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004084 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004085 }
Craig Topper3164f332014-03-11 03:39:26 +00004086 void getGCCRegNames(const char * const *&Names,
4087 unsigned &NumNames) const override;
4088 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4089 unsigned &NumAliases) const override;
4090 bool validateAsmConstraint(const char *&Name,
4091 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004092 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004093 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004094 case 'l': // r0-r7
4095 case 'h': // r8-r15
4096 case 'w': // VFP Floating point register single precision
4097 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004098 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004099 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004100 case 'Q': // A memory address that is a single base register.
4101 Info.setAllowsMemory();
4102 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004103 case 'U': // a memory reference...
4104 switch (Name[1]) {
4105 case 'q': // ...ARMV4 ldrsb
4106 case 'v': // ...VFP load/store (reg+constant offset)
4107 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004108 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004109 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004110 case 'n': // valid address for Neon doubleword vector load/store
4111 case 'm': // valid address for Neon element and structure load/store
4112 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004113 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004114 Info.setAllowsMemory();
4115 Name++;
4116 return true;
4117 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004118 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004119 return false;
4120 }
Craig Topper3164f332014-03-11 03:39:26 +00004121 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004122 std::string R;
4123 switch (*Constraint) {
4124 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004125 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004126 Constraint++;
4127 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004128 case 'p': // 'p' should be translated to 'r' by default.
4129 R = std::string("r");
4130 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004131 default:
4132 return std::string(1, *Constraint);
4133 }
4134 return R;
4135 }
Craig Topper3164f332014-03-11 03:39:26 +00004136 bool validateConstraintModifier(StringRef Constraint, const char Modifier,
4137 unsigned Size) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004138 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004139 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004140
Bill Wendling9d1ee112012-10-25 23:28:48 +00004141 // Strip off constraint modifiers.
4142 while (Constraint[0] == '=' ||
4143 Constraint[0] == '+' ||
4144 Constraint[0] == '&')
4145 Constraint = Constraint.substr(1);
4146
4147 switch (Constraint[0]) {
4148 default: break;
4149 case 'r': {
4150 switch (Modifier) {
4151 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004152 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004153 case 'q':
4154 // A register of size 32 cannot fit a vector type.
4155 return false;
4156 }
4157 }
4158 }
4159
4160 return true;
4161 }
Craig Topper3164f332014-03-11 03:39:26 +00004162 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004163 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004164 return "";
4165 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004166
Craig Topper3164f332014-03-11 03:39:26 +00004167 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004168 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4169 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004170
Craig Topper3164f332014-03-11 03:39:26 +00004171 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004172 if (RegNo == 0) return 0;
4173 if (RegNo == 1) return 1;
4174 return -1;
4175 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004176};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004177
Rafael Espindolaeb265472013-08-21 21:59:03 +00004178bool ARMTargetInfo::setFPMath(StringRef Name) {
4179 if (Name == "neon") {
4180 FPMath = FP_Neon;
4181 return true;
4182 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4183 Name == "vfp4") {
4184 FPMath = FP_VFP;
4185 return true;
4186 }
4187 return false;
4188}
4189
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004190const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004191 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004192 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004193 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4194
4195 // Float registers
4196 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4197 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4198 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004199 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004200
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004201 // Double registers
4202 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4203 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004204 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4205 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004206
4207 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004208 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4209 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004210};
4211
4212void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004213 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004214 Names = GCCRegNames;
4215 NumNames = llvm::array_lengthof(GCCRegNames);
4216}
4217
4218const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004219 { { "a1" }, "r0" },
4220 { { "a2" }, "r1" },
4221 { { "a3" }, "r2" },
4222 { { "a4" }, "r3" },
4223 { { "v1" }, "r4" },
4224 { { "v2" }, "r5" },
4225 { { "v3" }, "r6" },
4226 { { "v4" }, "r7" },
4227 { { "v5" }, "r8" },
4228 { { "v6", "rfp" }, "r9" },
4229 { { "sl" }, "r10" },
4230 { { "fp" }, "r11" },
4231 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004232 { { "r13" }, "sp" },
4233 { { "r14" }, "lr" },
4234 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004235 // The S, D and Q registers overlap, but aren't really aliases; we
4236 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004237};
4238
4239void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4240 unsigned &NumAliases) const {
4241 Aliases = GCCRegAliases;
4242 NumAliases = llvm::array_lengthof(GCCRegAliases);
4243}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004244
4245const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004246#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004247#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004248 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004249#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004250
4251#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004252#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004253#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4254 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004255#include "clang/Basic/BuiltinsARM.def"
4256};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004257
4258class ARMleTargetInfo : public ARMTargetInfo {
4259public:
4260 ARMleTargetInfo(const llvm::Triple &Triple)
4261 : ARMTargetInfo(Triple, false) { }
4262 virtual void getTargetDefines(const LangOptions &Opts,
4263 MacroBuilder &Builder) const {
4264 Builder.defineMacro("__ARMEL__");
4265 ARMTargetInfo::getTargetDefines(Opts, Builder);
4266 }
4267};
4268
4269class ARMbeTargetInfo : public ARMTargetInfo {
4270public:
4271 ARMbeTargetInfo(const llvm::Triple &Triple)
4272 : ARMTargetInfo(Triple, true) { }
4273 virtual void getTargetDefines(const LangOptions &Opts,
4274 MacroBuilder &Builder) const {
4275 Builder.defineMacro("__ARMEB__");
4276 Builder.defineMacro("__ARM_BIG_ENDIAN");
4277 ARMTargetInfo::getTargetDefines(Opts, Builder);
4278 }
4279};
Chris Lattner17df24e2008-04-21 18:56:49 +00004280} // end anonymous namespace.
4281
Eli Friedmanf05b7722008-08-20 07:44:10 +00004282namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004283class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4284 const llvm::Triple Triple;
4285public:
4286 WindowsARMTargetInfo(const llvm::Triple &Triple)
4287 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4288 TLSSupported = false;
4289 WCharType = UnsignedShort;
4290 SizeType = UnsignedInt;
4291 UserLabelPrefix = "";
4292 }
4293 void getVisualStudioDefines(const LangOptions &Opts,
4294 MacroBuilder &Builder) const {
4295 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4296
4297 // FIXME: this is invalid for WindowsCE
4298 Builder.defineMacro("_M_ARM_NT", "1");
4299 Builder.defineMacro("_M_ARMT", "_M_ARM");
4300 Builder.defineMacro("_M_THUMB", "_M_ARM");
4301
4302 assert((Triple.getArch() == llvm::Triple::arm ||
4303 Triple.getArch() == llvm::Triple::thumb) &&
4304 "invalid architecture for Windows ARM target info");
4305 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4306 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4307
4308 // TODO map the complete set of values
4309 // 31: VFPv3 40: VFPv4
4310 Builder.defineMacro("_M_ARM_FP", "31");
4311 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004312 BuiltinVaListKind getBuiltinVaListKind() const override {
4313 return TargetInfo::CharPtrBuiltinVaList;
4314 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004315};
4316
4317// Windows ARM + Itanium C++ ABI Target
4318class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4319public:
4320 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4321 : WindowsARMTargetInfo(Triple) {
4322 TheCXXABI.set(TargetCXXABI::GenericARM);
4323 }
4324
4325 void getTargetDefines(const LangOptions &Opts,
4326 MacroBuilder &Builder) const override {
4327 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4328
4329 if (Opts.MSVCCompat)
4330 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4331 }
4332};
4333
4334// Windows ARM, MS (C++) ABI
4335class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4336public:
4337 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4338 : WindowsARMTargetInfo(Triple) {
4339 TheCXXABI.set(TargetCXXABI::Microsoft);
4340 }
4341
4342 void getTargetDefines(const LangOptions &Opts,
4343 MacroBuilder &Builder) const override {
4344 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4345 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4346 }
4347};
4348}
4349
4350
4351namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004352class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004353 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004354protected:
Craig Topper3164f332014-03-11 03:39:26 +00004355 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4356 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004357 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004358 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004359
Torok Edwinb2b37c62009-06-30 17:10:35 +00004360public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004361 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004362 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004363 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004364 // iOS always has 64-bit atomic instructions.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004365 // FIXME: This should be based off of the target features in ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004366 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004367
4368 // Darwin on iOS uses a variant of the ARM C++ ABI.
4369 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004370 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004371};
4372} // end anonymous namespace.
4373
Tony Linthicum76329bf2011-12-12 21:14:55 +00004374
4375namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004376class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004377 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004378 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4379 static const char *const GCCRegNames[];
4380
James Molloy75f5f9e2014-04-16 15:33:48 +00004381 enum FPUModeEnum {
4382 FPUMode,
4383 NeonMode
4384 };
4385
4386 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004387 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004388 unsigned Crypto;
4389
Tim Northovera2ee4332014-03-29 15:09:45 +00004390 static const Builtin::Info BuiltinInfo[];
4391
4392 std::string ABI;
4393
4394public:
Tim Northover573cbee2014-05-24 12:52:07 +00004395 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004396 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004397
4398 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4399 WCharType = SignedInt;
4400
4401 // NetBSD apparently prefers consistency across ARM targets to consistency
4402 // across 64-bit targets.
4403 Int64Type = SignedLongLong;
4404 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004405 } else {
4406 WCharType = UnsignedInt;
4407 Int64Type = SignedLong;
4408 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004409 }
4410
Tim Northovera2ee4332014-03-29 15:09:45 +00004411 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004412 MaxVectorAlign = 128;
4413 RegParmMax = 8;
4414 MaxAtomicInlineWidth = 128;
4415 MaxAtomicPromoteWidth = 128;
4416
4417 LongDoubleWidth = LongDoubleAlign = 128;
4418 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4419
Tim Northovera2ee4332014-03-29 15:09:45 +00004420 // {} in inline assembly are neon specifiers, not assembly variant
4421 // specifiers.
4422 NoAsmVariants = true;
4423
Tim Northover573cbee2014-05-24 12:52:07 +00004424 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004425 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4426 }
4427
Alp Toker4925ba72014-06-07 23:30:42 +00004428 StringRef getABI() const override { return ABI; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004429 virtual bool setABI(const std::string &Name) {
4430 if (Name != "aapcs" && Name != "darwinpcs")
4431 return false;
4432
4433 ABI = Name;
4434 return true;
4435 }
4436
4437 virtual bool setCPU(const std::string &Name) {
4438 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004439 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004440 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004441 .Case("cyclone", true)
4442 .Default(false);
4443 return CPUKnown;
4444 }
4445
4446 virtual void getTargetDefines(const LangOptions &Opts,
4447 MacroBuilder &Builder) const {
4448 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004449 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004450
4451 // Target properties.
4452 Builder.defineMacro("_LP64");
4453 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004454
4455 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4456 Builder.defineMacro("__ARM_ACLE", "200");
4457 Builder.defineMacro("__ARM_ARCH", "8");
4458 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4459
4460 Builder.defineMacro("__ARM_64BIT_STATE");
4461 Builder.defineMacro("__ARM_PCS_AAPCS64");
4462 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4463
4464 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4465 Builder.defineMacro("__ARM_FEATURE_CLZ");
4466 Builder.defineMacro("__ARM_FEATURE_FMA");
4467 Builder.defineMacro("__ARM_FEATURE_DIV");
4468
4469 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4470
4471 // 0xe implies support for half, single and double precision operations.
4472 Builder.defineMacro("__ARM_FP", "0xe");
4473
4474 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4475 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4476 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4477
4478 if (Opts.FastMath || Opts.FiniteMathOnly)
4479 Builder.defineMacro("__ARM_FP_FAST");
4480
4481 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
4482 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4483
4484 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4485
4486 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4487 Opts.ShortEnums ? "1" : "4");
4488
James Molloy75f5f9e2014-04-16 15:33:48 +00004489 if (FPU == NeonMode) {
4490 Builder.defineMacro("__ARM_NEON");
4491 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004492 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004493 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004494
Bradley Smith418c5932014-05-02 15:17:51 +00004495 if (CRC)
4496 Builder.defineMacro("__ARM_FEATURE_CRC32");
4497
James Molloy75f5f9e2014-04-16 15:33:48 +00004498 if (Crypto)
4499 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004500 }
4501
4502 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4503 unsigned &NumRecords) const {
4504 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004505 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004506 }
4507
4508 virtual bool hasFeature(StringRef Feature) const {
James Molloy75f5f9e2014-04-16 15:33:48 +00004509 return Feature == "aarch64" ||
4510 Feature == "arm64" ||
4511 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004512 }
4513
James Molloy5e73df52014-04-16 15:06:20 +00004514 bool handleTargetFeatures(std::vector<std::string> &Features,
4515 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004516 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004517 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004518 Crypto = 0;
4519 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4520 if (Features[i] == "+neon")
4521 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004522 if (Features[i] == "+crc")
4523 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004524 if (Features[i] == "+crypto")
4525 Crypto = 1;
4526 }
4527
James Molloy5e73df52014-04-16 15:06:20 +00004528 setDescriptionString();
4529
4530 return true;
4531 }
4532
Tim Northovera2ee4332014-03-29 15:09:45 +00004533 virtual bool isCLZForZeroUndef() const { return false; }
4534
4535 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4536 return TargetInfo::AArch64ABIBuiltinVaList;
4537 }
4538
4539 virtual void getGCCRegNames(const char *const *&Names,
4540 unsigned &NumNames) const;
4541 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4542 unsigned &NumAliases) const;
4543
4544 virtual bool validateAsmConstraint(const char *&Name,
4545 TargetInfo::ConstraintInfo &Info) const {
4546 switch (*Name) {
4547 default:
4548 return false;
4549 case 'w': // Floating point and SIMD registers (V0-V31)
4550 Info.setAllowsRegister();
4551 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004552 case 'I': // Constant that can be used with an ADD instruction
4553 case 'J': // Constant that can be used with a SUB instruction
4554 case 'K': // Constant that can be used with a 32-bit logical instruction
4555 case 'L': // Constant that can be used with a 64-bit logical instruction
4556 case 'M': // Constant that can be used as a 32-bit MOV immediate
4557 case 'N': // Constant that can be used as a 64-bit MOV immediate
4558 case 'Y': // Floating point constant zero
4559 case 'Z': // Integer constant zero
4560 return true;
4561 case 'Q': // A memory reference with base register and no offset
4562 Info.setAllowsMemory();
4563 return true;
4564 case 'S': // A symbolic address
4565 Info.setAllowsRegister();
4566 return true;
4567 case 'U':
4568 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
4569 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
4570 // Usa: An absolute symbolic address
4571 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
4572 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
Tim Northovera2ee4332014-03-29 15:09:45 +00004573 case 'z': // Zero register, wzr or xzr
4574 Info.setAllowsRegister();
4575 return true;
4576 case 'x': // Floating point and SIMD registers (V0-V15)
4577 Info.setAllowsRegister();
4578 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004579 }
4580 return false;
4581 }
4582
James Molloy8a157bf2014-07-25 10:19:47 +00004583 virtual bool validateConstraintModifier(StringRef Constraint,
4584 const char Modifier,
4585 unsigned Size) const {
4586 // Strip off constraint modifiers.
4587 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4588 Constraint = Constraint.substr(1);
4589
4590 switch (Constraint[0]) {
4591 default:
4592 return true;
4593 case 'z':
4594 case 'r': {
4595 switch (Modifier) {
4596 case 'x':
4597 case 'w':
4598 // For now assume that the person knows what they're
4599 // doing with the modifier.
4600 return true;
4601 default:
4602 // By default an 'r' constraint will be in the 'x'
4603 // registers.
4604 return Size == 64;
4605 }
4606 }
4607 }
4608 }
4609
Tim Northovera2ee4332014-03-29 15:09:45 +00004610 virtual const char *getClobbers() const { return ""; }
4611
4612 int getEHDataRegisterNumber(unsigned RegNo) const {
4613 if (RegNo == 0)
4614 return 0;
4615 if (RegNo == 1)
4616 return 1;
4617 return -1;
4618 }
4619};
4620
Tim Northover573cbee2014-05-24 12:52:07 +00004621const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004622 // 32-bit Integer registers
4623 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4624 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4625 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4626
4627 // 64-bit Integer registers
4628 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4629 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4630 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4631
4632 // 32-bit floating point regsisters
4633 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4634 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4635 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4636
4637 // 64-bit floating point regsisters
4638 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4639 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4640 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4641
4642 // Vector registers
4643 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4644 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4645 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4646};
4647
Tim Northover573cbee2014-05-24 12:52:07 +00004648void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004649 unsigned &NumNames) const {
4650 Names = GCCRegNames;
4651 NumNames = llvm::array_lengthof(GCCRegNames);
4652}
4653
Tim Northover573cbee2014-05-24 12:52:07 +00004654const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004655 { { "w31" }, "wsp" },
4656 { { "x29" }, "fp" },
4657 { { "x30" }, "lr" },
4658 { { "x31" }, "sp" },
4659 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4660 // don't want to substitute one of these for a different-sized one.
4661};
4662
Tim Northover573cbee2014-05-24 12:52:07 +00004663void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004664 unsigned &NumAliases) const {
4665 Aliases = GCCRegAliases;
4666 NumAliases = llvm::array_lengthof(GCCRegAliases);
4667}
4668
Tim Northover573cbee2014-05-24 12:52:07 +00004669const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004670#define BUILTIN(ID, TYPE, ATTRS) \
4671 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4672#include "clang/Basic/BuiltinsNEON.def"
4673
4674#define BUILTIN(ID, TYPE, ATTRS) \
4675 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004676#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004677};
James Molloy5e73df52014-04-16 15:06:20 +00004678
Tim Northover573cbee2014-05-24 12:52:07 +00004679class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004680 void setDescriptionString() override {
4681 if (getTriple().isOSBinFormatMachO())
4682 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4683 else
4684 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4685 }
4686
4687public:
Tim Northover573cbee2014-05-24 12:52:07 +00004688 AArch64leTargetInfo(const llvm::Triple &Triple)
4689 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004690 BigEndian = false;
4691 }
4692 void getTargetDefines(const LangOptions &Opts,
4693 MacroBuilder &Builder) const override {
4694 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004695 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004696 }
4697};
4698
Tim Northover573cbee2014-05-24 12:52:07 +00004699class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004700 void setDescriptionString() override {
4701 assert(!getTriple().isOSBinFormatMachO());
4702 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4703 }
4704
4705public:
Tim Northover573cbee2014-05-24 12:52:07 +00004706 AArch64beTargetInfo(const llvm::Triple &Triple)
4707 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004708 void getTargetDefines(const LangOptions &Opts,
4709 MacroBuilder &Builder) const override {
4710 Builder.defineMacro("__AARCH64EB__");
4711 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4712 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004713 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004714 }
4715};
Tim Northovera2ee4332014-03-29 15:09:45 +00004716} // end anonymous namespace.
4717
4718namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004719class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004720protected:
4721 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4722 MacroBuilder &Builder) const override {
4723 Builder.defineMacro("__AARCH64_SIMD__");
4724 Builder.defineMacro("__ARM64_ARCH_8__");
4725 Builder.defineMacro("__ARM_NEON__");
4726 Builder.defineMacro("__LITTLE_ENDIAN__");
4727 Builder.defineMacro("__REGISTER_PREFIX__", "");
4728 Builder.defineMacro("__arm64", "1");
4729 Builder.defineMacro("__arm64__", "1");
4730
4731 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4732 }
4733
Tim Northovera2ee4332014-03-29 15:09:45 +00004734public:
Tim Northover573cbee2014-05-24 12:52:07 +00004735 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4736 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004737 Int64Type = SignedLongLong;
4738 WCharType = SignedInt;
4739 UseSignedCharForObjCBool = false;
4740
4741 LongDoubleWidth = LongDoubleAlign = 64;
4742 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4743
4744 TheCXXABI.set(TargetCXXABI::iOS64);
4745 }
4746
4747 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4748 return TargetInfo::CharPtrBuiltinVaList;
4749 }
4750};
4751} // end anonymous namespace
4752
4753namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004754// Hexagon abstract base class
4755class HexagonTargetInfo : public TargetInfo {
4756 static const Builtin::Info BuiltinInfo[];
4757 static const char * const GCCRegNames[];
4758 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4759 std::string CPU;
4760public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004761 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004762 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004763 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004764
4765 // {} in inline assembly are packet specifiers, not assembly variant
4766 // specifiers.
4767 NoAsmVariants = true;
4768 }
4769
Craig Topper3164f332014-03-11 03:39:26 +00004770 void getTargetBuiltins(const Builtin::Info *&Records,
4771 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004772 Records = BuiltinInfo;
4773 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4774 }
4775
Craig Topper3164f332014-03-11 03:39:26 +00004776 bool validateAsmConstraint(const char *&Name,
4777 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004778 return true;
4779 }
4780
Craig Topper3164f332014-03-11 03:39:26 +00004781 void getTargetDefines(const LangOptions &Opts,
4782 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004783
Craig Topper3164f332014-03-11 03:39:26 +00004784 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004785 return Feature == "hexagon";
4786 }
Craig Topper3164f332014-03-11 03:39:26 +00004787
4788 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004789 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004790 }
Craig Topper3164f332014-03-11 03:39:26 +00004791 void getGCCRegNames(const char * const *&Names,
4792 unsigned &NumNames) const override;
4793 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4794 unsigned &NumAliases) const override;
4795 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004796 return "";
4797 }
Sebastian Pop86500282012-01-13 20:37:10 +00004798
4799 static const char *getHexagonCPUSuffix(StringRef Name) {
4800 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004801 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004802 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00004803 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00004804 }
4805
Craig Topper3164f332014-03-11 03:39:26 +00004806 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004807 if (!getHexagonCPUSuffix(Name))
4808 return false;
4809
Tony Linthicum76329bf2011-12-12 21:14:55 +00004810 CPU = Name;
4811 return true;
4812 }
4813};
4814
4815void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4816 MacroBuilder &Builder) const {
4817 Builder.defineMacro("qdsp6");
4818 Builder.defineMacro("__qdsp6", "1");
4819 Builder.defineMacro("__qdsp6__", "1");
4820
4821 Builder.defineMacro("hexagon");
4822 Builder.defineMacro("__hexagon", "1");
4823 Builder.defineMacro("__hexagon__", "1");
4824
4825 if(CPU == "hexagonv1") {
4826 Builder.defineMacro("__HEXAGON_V1__");
4827 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4828 if(Opts.HexagonQdsp6Compat) {
4829 Builder.defineMacro("__QDSP6_V1__");
4830 Builder.defineMacro("__QDSP6_ARCH__", "1");
4831 }
4832 }
4833 else if(CPU == "hexagonv2") {
4834 Builder.defineMacro("__HEXAGON_V2__");
4835 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4836 if(Opts.HexagonQdsp6Compat) {
4837 Builder.defineMacro("__QDSP6_V2__");
4838 Builder.defineMacro("__QDSP6_ARCH__", "2");
4839 }
4840 }
4841 else if(CPU == "hexagonv3") {
4842 Builder.defineMacro("__HEXAGON_V3__");
4843 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4844 if(Opts.HexagonQdsp6Compat) {
4845 Builder.defineMacro("__QDSP6_V3__");
4846 Builder.defineMacro("__QDSP6_ARCH__", "3");
4847 }
4848 }
4849 else if(CPU == "hexagonv4") {
4850 Builder.defineMacro("__HEXAGON_V4__");
4851 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4852 if(Opts.HexagonQdsp6Compat) {
4853 Builder.defineMacro("__QDSP6_V4__");
4854 Builder.defineMacro("__QDSP6_ARCH__", "4");
4855 }
4856 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004857 else if(CPU == "hexagonv5") {
4858 Builder.defineMacro("__HEXAGON_V5__");
4859 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4860 if(Opts.HexagonQdsp6Compat) {
4861 Builder.defineMacro("__QDSP6_V5__");
4862 Builder.defineMacro("__QDSP6_ARCH__", "5");
4863 }
4864 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004865}
4866
4867const char * const HexagonTargetInfo::GCCRegNames[] = {
4868 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4869 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4870 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4871 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4872 "p0", "p1", "p2", "p3",
4873 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4874};
4875
4876void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4877 unsigned &NumNames) const {
4878 Names = GCCRegNames;
4879 NumNames = llvm::array_lengthof(GCCRegNames);
4880}
4881
4882
4883const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4884 { { "sp" }, "r29" },
4885 { { "fp" }, "r30" },
4886 { { "lr" }, "r31" },
4887 };
4888
4889void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4890 unsigned &NumAliases) const {
4891 Aliases = GCCRegAliases;
4892 NumAliases = llvm::array_lengthof(GCCRegAliases);
4893}
4894
4895
4896const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4897#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4898#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4899 ALL_LANGUAGES },
4900#include "clang/Basic/BuiltinsHexagon.def"
4901};
4902}
4903
4904
Chris Lattner5ba61f02006-10-14 07:39:34 +00004905namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004906// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4907class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004908 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4909 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004910 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004911public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004912 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004913
Craig Topper3164f332014-03-11 03:39:26 +00004914 bool handleTargetFeatures(std::vector<std::string> &Features,
4915 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004916 SoftFloat = false;
4917 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4918 if (Features[i] == "+soft-float")
4919 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004920 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004921 }
Craig Topper3164f332014-03-11 03:39:26 +00004922 void getTargetDefines(const LangOptions &Opts,
4923 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004924 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004925 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004926
4927 if (SoftFloat)
4928 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004929 }
Craig Topper3164f332014-03-11 03:39:26 +00004930
4931 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004932 return llvm::StringSwitch<bool>(Feature)
4933 .Case("softfloat", SoftFloat)
4934 .Case("sparc", true)
4935 .Default(false);
4936 }
Craig Topper3164f332014-03-11 03:39:26 +00004937
4938 void getTargetBuiltins(const Builtin::Info *&Records,
4939 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004940 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00004941 }
Craig Topper3164f332014-03-11 03:39:26 +00004942 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004943 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00004944 }
Craig Topper3164f332014-03-11 03:39:26 +00004945 void getGCCRegNames(const char * const *&Names,
4946 unsigned &NumNames) const override;
4947 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4948 unsigned &NumAliases) const override;
4949 bool validateAsmConstraint(const char *&Name,
4950 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004951 // FIXME: Implement!
4952 return false;
Gabor Greif49991682008-02-21 16:29:08 +00004953 }
Craig Topper3164f332014-03-11 03:39:26 +00004954 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004955 // FIXME: Implement!
4956 return "";
Gabor Greif49991682008-02-21 16:29:08 +00004957 }
4958};
4959
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004960const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00004961 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4962 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4963 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4964 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4965};
4966
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004967void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4968 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004969 Names = GCCRegNames;
4970 NumNames = llvm::array_lengthof(GCCRegNames);
4971}
4972
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004973const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004974 { { "g0" }, "r0" },
4975 { { "g1" }, "r1" },
4976 { { "g2" }, "r2" },
4977 { { "g3" }, "r3" },
4978 { { "g4" }, "r4" },
4979 { { "g5" }, "r5" },
4980 { { "g6" }, "r6" },
4981 { { "g7" }, "r7" },
4982 { { "o0" }, "r8" },
4983 { { "o1" }, "r9" },
4984 { { "o2" }, "r10" },
4985 { { "o3" }, "r11" },
4986 { { "o4" }, "r12" },
4987 { { "o5" }, "r13" },
4988 { { "o6", "sp" }, "r14" },
4989 { { "o7" }, "r15" },
4990 { { "l0" }, "r16" },
4991 { { "l1" }, "r17" },
4992 { { "l2" }, "r18" },
4993 { { "l3" }, "r19" },
4994 { { "l4" }, "r20" },
4995 { { "l5" }, "r21" },
4996 { { "l6" }, "r22" },
4997 { { "l7" }, "r23" },
4998 { { "i0" }, "r24" },
4999 { { "i1" }, "r25" },
5000 { { "i2" }, "r26" },
5001 { { "i3" }, "r27" },
5002 { { "i4" }, "r28" },
5003 { { "i5" }, "r29" },
5004 { { "i6", "fp" }, "r30" },
5005 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005006};
5007
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005008void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5009 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005010 Aliases = GCCRegAliases;
5011 NumAliases = llvm::array_lengthof(GCCRegAliases);
5012}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005013
5014// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5015class SparcV8TargetInfo : public SparcTargetInfo {
5016public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005017 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005018 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005019 }
5020
Craig Topper3164f332014-03-11 03:39:26 +00005021 void getTargetDefines(const LangOptions &Opts,
5022 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005023 SparcTargetInfo::getTargetDefines(Opts, Builder);
5024 Builder.defineMacro("__sparcv8");
5025 }
5026};
5027
5028// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5029class SparcV9TargetInfo : public SparcTargetInfo {
5030public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005031 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005032 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005033 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005034 // This is an LP64 platform.
5035 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005036
5037 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005038 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005039 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005040 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005041 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005042 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005043
5044 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5045 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5046 LongDoubleWidth = 128;
5047 LongDoubleAlign = 128;
5048 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005049 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005050 }
5051
Craig Topper3164f332014-03-11 03:39:26 +00005052 void getTargetDefines(const LangOptions &Opts,
5053 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005054 SparcTargetInfo::getTargetDefines(Opts, Builder);
5055 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005056 Builder.defineMacro("__arch64__");
5057 // Solaris and its derivative AuroraUX don't need these variants, but the
5058 // BSDs do.
5059 if (getTriple().getOS() != llvm::Triple::Solaris &&
5060 getTriple().getOS() != llvm::Triple::AuroraUX) {
5061 Builder.defineMacro("__sparc64__");
5062 Builder.defineMacro("__sparc_v9__");
5063 Builder.defineMacro("__sparcv9__");
5064 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005065 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005066
Craig Topper3164f332014-03-11 03:39:26 +00005067 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005068 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5069 .Case("v9", true)
5070 .Case("ultrasparc", true)
5071 .Case("ultrasparc3", true)
5072 .Case("niagara", true)
5073 .Case("niagara2", true)
5074 .Case("niagara3", true)
5075 .Case("niagara4", true)
5076 .Default(false);
5077
5078 // No need to store the CPU yet. There aren't any CPU-specific
5079 // macros to define.
5080 return CPUKnown;
5081 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005082};
5083
Gabor Greif49991682008-02-21 16:29:08 +00005084} // end anonymous namespace.
5085
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005086namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005087class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
5088public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005089 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
5090 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005091 SizeType = UnsignedInt;
5092 PtrDiffType = SignedInt;
5093 }
5094};
Torok Edwinb2b37c62009-06-30 17:10:35 +00005095class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005096public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005097 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5098 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005099 SizeType = UnsignedInt;
5100 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005101 }
5102};
5103} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005104
Chris Lattnerb781dc792008-05-08 05:58:21 +00005105namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005106class SystemZTargetInfo : public TargetInfo {
5107 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005108
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005109public:
5110 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5111 TLSSupported = true;
5112 IntWidth = IntAlign = 32;
5113 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5114 PointerWidth = PointerAlign = 64;
5115 LongDoubleWidth = 128;
5116 LongDoubleAlign = 64;
5117 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5118 MinGlobalAlign = 16;
5119 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5120 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5121 }
5122 void getTargetDefines(const LangOptions &Opts,
5123 MacroBuilder &Builder) const override {
5124 Builder.defineMacro("__s390__");
5125 Builder.defineMacro("__s390x__");
5126 Builder.defineMacro("__zarch__");
5127 Builder.defineMacro("__LONG_DOUBLE_128__");
5128 }
5129 void getTargetBuiltins(const Builtin::Info *&Records,
5130 unsigned &NumRecords) const override {
5131 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005132 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005133 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005134 }
5135
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005136 void getGCCRegNames(const char *const *&Names,
5137 unsigned &NumNames) const override;
5138 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5139 unsigned &NumAliases) const override {
5140 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005141 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005142 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005143 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005144 bool validateAsmConstraint(const char *&Name,
5145 TargetInfo::ConstraintInfo &info) const override;
5146 const char *getClobbers() const override {
5147 // FIXME: Is this really right?
5148 return "";
5149 }
5150 BuiltinVaListKind getBuiltinVaListKind() const override {
5151 return TargetInfo::SystemZBuiltinVaList;
5152 }
5153 bool setCPU(const std::string &Name) override {
5154 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5155 .Case("z10", true)
5156 .Case("z196", true)
5157 .Case("zEC12", true)
5158 .Default(false);
5159
5160 // No need to store the CPU yet. There aren't any CPU-specific
5161 // macros to define.
5162 return CPUKnown;
5163 }
5164};
5165
5166const char *const SystemZTargetInfo::GCCRegNames[] = {
5167 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5168 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5169 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5170 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5171};
5172
5173void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5174 unsigned &NumNames) const {
5175 Names = GCCRegNames;
5176 NumNames = llvm::array_lengthof(GCCRegNames);
5177}
5178
5179bool SystemZTargetInfo::
5180validateAsmConstraint(const char *&Name,
5181 TargetInfo::ConstraintInfo &Info) const {
5182 switch (*Name) {
5183 default:
5184 return false;
5185
5186 case 'a': // Address register
5187 case 'd': // Data register (equivalent to 'r')
5188 case 'f': // Floating-point register
5189 Info.setAllowsRegister();
5190 return true;
5191
5192 case 'I': // Unsigned 8-bit constant
5193 case 'J': // Unsigned 12-bit constant
5194 case 'K': // Signed 16-bit constant
5195 case 'L': // Signed 20-bit displacement (on all targets we support)
5196 case 'M': // 0x7fffffff
5197 return true;
5198
5199 case 'Q': // Memory with base and unsigned 12-bit displacement
5200 case 'R': // Likewise, plus an index
5201 case 'S': // Memory with base and signed 20-bit displacement
5202 case 'T': // Likewise, plus an index
5203 Info.setAllowsMemory();
5204 return true;
5205 }
5206}
Ulrich Weigand47445072013-05-06 16:26:41 +00005207}
5208
5209namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005210 class MSP430TargetInfo : public TargetInfo {
5211 static const char * const GCCRegNames[];
5212 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005213 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005214 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005215 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005216 IntWidth = 16; IntAlign = 16;
5217 LongWidth = 32; LongLongWidth = 64;
5218 LongAlign = LongLongAlign = 16;
5219 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005220 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005221 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005222 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005223 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005224 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005225 SigAtomicType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005226 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005227 }
5228 void getTargetDefines(const LangOptions &Opts,
5229 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005230 Builder.defineMacro("MSP430");
5231 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005232 // FIXME: defines for different 'flavours' of MCU
5233 }
Craig Topper3164f332014-03-11 03:39:26 +00005234 void getTargetBuiltins(const Builtin::Info *&Records,
5235 unsigned &NumRecords) const override {
5236 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005237 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005238 NumRecords = 0;
5239 }
Craig Topper3164f332014-03-11 03:39:26 +00005240 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005241 return Feature == "msp430";
5242 }
Craig Topper3164f332014-03-11 03:39:26 +00005243 void getGCCRegNames(const char * const *&Names,
5244 unsigned &NumNames) const override;
5245 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5246 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005247 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005248 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005249 NumAliases = 0;
5250 }
Craig Topper3164f332014-03-11 03:39:26 +00005251 bool validateAsmConstraint(const char *&Name,
5252 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005253 // No target constraints for now.
5254 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005255 }
Craig Topper3164f332014-03-11 03:39:26 +00005256 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005257 // FIXME: Is this really right?
5258 return "";
5259 }
Craig Topper3164f332014-03-11 03:39:26 +00005260 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005261 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005262 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005263 }
5264 };
5265
5266 const char * const MSP430TargetInfo::GCCRegNames[] = {
5267 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5268 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5269 };
5270
5271 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5272 unsigned &NumNames) const {
5273 Names = GCCRegNames;
5274 NumNames = llvm::array_lengthof(GCCRegNames);
5275 }
5276}
5277
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005278namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005279
Mike Stump11289f42009-09-09 15:08:12 +00005280 // LLVM and Clang cannot be used directly to output native binaries for
5281 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005282 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005283 //
5284 // TCE uses the llvm bitcode as input and uses it for generating customized
5285 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005286 // publicly available in http://tce.cs.tut.fi
5287
Eli Friedman1f191002011-10-07 19:51:42 +00005288 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5289 3, // opencl_global
5290 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005291 5, // opencl_constant
5292 0, // cuda_device
5293 0, // cuda_constant
5294 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005295 };
5296
Eli Friedmana9c3d712009-08-19 20:47:07 +00005297 class TCETargetInfo : public TargetInfo{
5298 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005299 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005300 TLSSupported = false;
5301 IntWidth = 32;
5302 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005303 PointerWidth = 32;
5304 IntAlign = 32;
5305 LongAlign = LongLongAlign = 32;
5306 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005307 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005308 SizeType = UnsignedInt;
5309 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005310 IntPtrType = SignedInt;
5311 PtrDiffType = SignedInt;
5312 FloatWidth = 32;
5313 FloatAlign = 32;
5314 DoubleWidth = 32;
5315 DoubleAlign = 32;
5316 LongDoubleWidth = 32;
5317 LongDoubleAlign = 32;
5318 FloatFormat = &llvm::APFloat::IEEEsingle;
5319 DoubleFormat = &llvm::APFloat::IEEEsingle;
5320 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005321 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5322 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005323 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005324 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005325 }
5326
Craig Topper3164f332014-03-11 03:39:26 +00005327 void getTargetDefines(const LangOptions &Opts,
5328 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005329 DefineStd(Builder, "tce", Opts);
5330 Builder.defineMacro("__TCE__");
5331 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005332 }
Craig Topper3164f332014-03-11 03:39:26 +00005333 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005334 return Feature == "tce";
5335 }
Craig Topper3164f332014-03-11 03:39:26 +00005336
5337 void getTargetBuiltins(const Builtin::Info *&Records,
5338 unsigned &NumRecords) const override {}
5339 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005340 return "";
5341 }
Craig Topper3164f332014-03-11 03:39:26 +00005342 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005343 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005344 }
Craig Topper3164f332014-03-11 03:39:26 +00005345 void getGCCRegNames(const char * const *&Names,
5346 unsigned &NumNames) const override {}
5347 bool validateAsmConstraint(const char *&Name,
5348 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005349 return true;
5350 }
Craig Topper3164f332014-03-11 03:39:26 +00005351 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5352 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005353 };
5354}
5355
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005356namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005357class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005358 virtual void setDescriptionString() = 0;
5359
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005360 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005361 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005362 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005363 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005364 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005365 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005366 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005367 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005368 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005369 enum DspRevEnum {
5370 NoDSP, DSP1, DSP2
5371 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005372 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005373
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005374protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005375 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005376 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005377
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005378public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005379 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5380 const std::string &CPUStr)
5381 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005382 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005383 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005384
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005385 bool isNaN2008Default() const {
5386 return CPU == "mips32r6" || CPU == "mips64r6";
5387 }
5388
5389 bool isFP64Default() const {
5390 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5391 }
5392
Alp Toker4925ba72014-06-07 23:30:42 +00005393 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005394 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005395 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5396 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005397 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005398 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005399 .Case("mips1", IsMips32)
5400 .Case("mips2", IsMips32)
5401 .Case("mips3", true)
5402 .Case("mips4", true)
5403 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005404 .Case("mips32", IsMips32)
5405 .Case("mips32r2", IsMips32)
5406 .Case("mips32r6", IsMips32)
5407 .Case("mips64", true)
5408 .Case("mips64r2", true)
5409 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005410 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005411 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005412 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005413 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005414 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005415 // The backend enables certain ABI's by default according to the
5416 // architecture.
5417 // Disable both possible defaults so that we don't end up with multiple
5418 // ABI's selected and trigger an assertion.
5419 Features["o32"] = false;
5420 Features["n64"] = false;
5421
Eric Christopher0b26a612010-03-02 02:41:08 +00005422 Features[ABI] = true;
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005423 if (CPU == "octeon")
5424 Features["mips64r2"] = Features["cnmips"] = true;
5425 else
5426 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005427 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005428
Craig Topper3164f332014-03-11 03:39:26 +00005429 void getTargetDefines(const LangOptions &Opts,
5430 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005431 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005432 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005433 if (Opts.GNUMode)
5434 Builder.defineMacro("mips");
5435
Simon Atanasyan683535b2012-08-29 19:14:58 +00005436 Builder.defineMacro("__REGISTER_PREFIX__", "");
5437
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005438 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005439 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005440 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005441 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005442 case SoftFloat:
5443 Builder.defineMacro("__mips_soft_float", Twine(1));
5444 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005445 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005446
Simon Atanasyan16071912013-04-14 14:07:30 +00005447 if (IsSingleFloat)
5448 Builder.defineMacro("__mips_single_float", Twine(1));
5449
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005450 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5451 Builder.defineMacro("_MIPS_FPSET",
5452 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5453
Simon Atanasyan72244b62012-07-05 16:06:06 +00005454 if (IsMips16)
5455 Builder.defineMacro("__mips16", Twine(1));
5456
Simon Atanasyan60777612013-04-14 14:07:51 +00005457 if (IsMicromips)
5458 Builder.defineMacro("__mips_micromips", Twine(1));
5459
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005460 if (IsNan2008)
5461 Builder.defineMacro("__mips_nan2008", Twine(1));
5462
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005463 switch (DspRev) {
5464 default:
5465 break;
5466 case DSP1:
5467 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5468 Builder.defineMacro("__mips_dsp", Twine(1));
5469 break;
5470 case DSP2:
5471 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5472 Builder.defineMacro("__mips_dspr2", Twine(1));
5473 Builder.defineMacro("__mips_dsp", Twine(1));
5474 break;
5475 }
5476
Jack Carter44ff1e52013-08-12 17:20:29 +00005477 if (HasMSA)
5478 Builder.defineMacro("__mips_msa", Twine(1));
5479
Simon Atanasyan26f19672012-04-05 19:28:31 +00005480 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5481 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5482 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005483
5484 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5485 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005486 }
5487
Craig Topper3164f332014-03-11 03:39:26 +00005488 void getTargetBuiltins(const Builtin::Info *&Records,
5489 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005490 Records = BuiltinInfo;
5491 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005492 }
Craig Topper3164f332014-03-11 03:39:26 +00005493 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005494 return llvm::StringSwitch<bool>(Feature)
5495 .Case("mips", true)
5496 .Case("fp64", HasFP64)
5497 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005498 }
Craig Topper3164f332014-03-11 03:39:26 +00005499 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005500 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005501 }
Craig Topper3164f332014-03-11 03:39:26 +00005502 void getGCCRegNames(const char * const *&Names,
5503 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005504 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005505 // CPU register names
5506 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005507 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5508 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5509 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005510 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5511 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005512 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5513 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5514 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5515 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005516 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005517 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005518 "$fcc5","$fcc6","$fcc7",
5519 // MSA register names
5520 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5521 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5522 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5523 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5524 // MSA control register names
5525 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5526 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005527 };
5528 Names = GCCRegNames;
5529 NumNames = llvm::array_lengthof(GCCRegNames);
5530 }
Craig Topper3164f332014-03-11 03:39:26 +00005531 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5532 unsigned &NumAliases) const override = 0;
5533 bool validateAsmConstraint(const char *&Name,
5534 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005535 switch (*Name) {
5536 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005537 return false;
5538
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005539 case 'r': // CPU registers.
5540 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005541 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005542 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005543 case 'c': // $25 for indirect jumps
5544 case 'l': // lo register
5545 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005546 Info.setAllowsRegister();
5547 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005548 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005549 Info.setAllowsMemory();
5550 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005551 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005552 }
5553
Craig Topper3164f332014-03-11 03:39:26 +00005554 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005555 // FIXME: Implement!
5556 return "";
5557 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005558
Craig Topper3164f332014-03-11 03:39:26 +00005559 bool handleTargetFeatures(std::vector<std::string> &Features,
5560 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005561 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005562 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005563 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005564 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005565 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005566 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005567 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005568
5569 for (std::vector<std::string>::iterator it = Features.begin(),
5570 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005571 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005572 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005573 else if (*it == "+soft-float")
5574 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005575 else if (*it == "+mips16")
5576 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005577 else if (*it == "+micromips")
5578 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005579 else if (*it == "+dsp")
5580 DspRev = std::max(DspRev, DSP1);
5581 else if (*it == "+dspr2")
5582 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005583 else if (*it == "+msa")
5584 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005585 else if (*it == "+fp64")
5586 HasFP64 = true;
5587 else if (*it == "-fp64")
5588 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005589 else if (*it == "+nan2008")
5590 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005591 else if (*it == "-nan2008")
5592 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005593 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005594
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005595 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005596 std::vector<std::string>::iterator it =
5597 std::find(Features.begin(), Features.end(), "+soft-float");
5598 if (it != Features.end())
5599 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005600
Akira Hatanaka9064e362013-10-29 18:30:33 +00005601 setDescriptionString();
5602
Rafael Espindolaeb265472013-08-21 21:59:03 +00005603 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005604 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005605
Craig Topper3164f332014-03-11 03:39:26 +00005606 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005607 if (RegNo == 0) return 4;
5608 if (RegNo == 1) return 5;
5609 return -1;
5610 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005611
5612 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005613};
5614
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005615const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5616#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5617#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5618 ALL_LANGUAGES },
5619#include "clang/Basic/BuiltinsMips.def"
5620};
5621
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005622class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005623public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005624 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005625 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005626 SizeType = UnsignedInt;
5627 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005628 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005629 }
Craig Topper3164f332014-03-11 03:39:26 +00005630 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005631 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005632 ABI = Name;
5633 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005634 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005635 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005636 }
Craig Topper3164f332014-03-11 03:39:26 +00005637 void getTargetDefines(const LangOptions &Opts,
5638 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005639 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005640
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005641 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005642 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5643
5644 const std::string& CPUStr = getCPU();
5645 if (CPUStr == "mips32")
5646 Builder.defineMacro("__mips_isa_rev", "1");
5647 else if (CPUStr == "mips32r2")
5648 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005649
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005650 if (ABI == "o32") {
5651 Builder.defineMacro("__mips_o32");
5652 Builder.defineMacro("_ABIO32", "1");
5653 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5654 }
5655 else if (ABI == "eabi")
5656 Builder.defineMacro("__mips_eabi");
5657 else
David Blaikie83d382b2011-09-23 05:06:16 +00005658 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005659 }
Craig Topper3164f332014-03-11 03:39:26 +00005660 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5661 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005662 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5663 { { "at" }, "$1" },
5664 { { "v0" }, "$2" },
5665 { { "v1" }, "$3" },
5666 { { "a0" }, "$4" },
5667 { { "a1" }, "$5" },
5668 { { "a2" }, "$6" },
5669 { { "a3" }, "$7" },
5670 { { "t0" }, "$8" },
5671 { { "t1" }, "$9" },
5672 { { "t2" }, "$10" },
5673 { { "t3" }, "$11" },
5674 { { "t4" }, "$12" },
5675 { { "t5" }, "$13" },
5676 { { "t6" }, "$14" },
5677 { { "t7" }, "$15" },
5678 { { "s0" }, "$16" },
5679 { { "s1" }, "$17" },
5680 { { "s2" }, "$18" },
5681 { { "s3" }, "$19" },
5682 { { "s4" }, "$20" },
5683 { { "s5" }, "$21" },
5684 { { "s6" }, "$22" },
5685 { { "s7" }, "$23" },
5686 { { "t8" }, "$24" },
5687 { { "t9" }, "$25" },
5688 { { "k0" }, "$26" },
5689 { { "k1" }, "$27" },
5690 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005691 { { "sp","$sp" }, "$29" },
5692 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005693 { { "ra" }, "$31" }
5694 };
5695 Aliases = GCCRegAliases;
5696 NumAliases = llvm::array_lengthof(GCCRegAliases);
5697 }
5698};
5699
5700class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005701 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005702 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005703 }
5704
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005705public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005706 Mips32EBTargetInfo(const llvm::Triple &Triple)
5707 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005708 }
Craig Topper3164f332014-03-11 03:39:26 +00005709 void getTargetDefines(const LangOptions &Opts,
5710 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005711 DefineStd(Builder, "MIPSEB", Opts);
5712 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005713 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005714 }
5715};
5716
5717class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005718 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005719 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005720 }
5721
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005722public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005723 Mips32ELTargetInfo(const llvm::Triple &Triple)
5724 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005725 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005726 }
Craig Topper3164f332014-03-11 03:39:26 +00005727 void getTargetDefines(const LangOptions &Opts,
5728 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005729 DefineStd(Builder, "MIPSEL", Opts);
5730 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005731 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005732 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005733};
Akira Hatanakabef17452011-09-20 19:21:49 +00005734
5735class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005736public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005737 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005738 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005739 LongDoubleWidth = LongDoubleAlign = 128;
5740 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005741 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5742 LongDoubleWidth = LongDoubleAlign = 64;
5743 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5744 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005745 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005746 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005747 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005748 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005749
5750 void setN64ABITypes() {
5751 LongWidth = LongAlign = 64;
5752 PointerWidth = PointerAlign = 64;
5753 SizeType = UnsignedLong;
5754 PtrDiffType = SignedLong;
5755 }
5756
5757 void setN32ABITypes() {
5758 LongWidth = LongAlign = 32;
5759 PointerWidth = PointerAlign = 32;
5760 SizeType = UnsignedInt;
5761 PtrDiffType = SignedInt;
5762 }
5763
Craig Topper3164f332014-03-11 03:39:26 +00005764 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005765 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005766 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005767 ABI = Name;
5768 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005769 }
Simon Atanasyanad805952014-07-01 10:59:09 +00005770 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005771 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00005772 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005773 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005774 }
5775 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005776 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005777
Craig Topper3164f332014-03-11 03:39:26 +00005778 void getTargetDefines(const LangOptions &Opts,
5779 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005780 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005781
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005782 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005783 Builder.defineMacro("__mips64");
5784 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005785 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
5786
5787 const std::string& CPUStr = getCPU();
5788 if (CPUStr == "mips64")
5789 Builder.defineMacro("__mips_isa_rev", "1");
5790 else if (CPUStr == "mips64r2")
5791 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005792
Akira Hatanakabef17452011-09-20 19:21:49 +00005793 if (ABI == "n32") {
5794 Builder.defineMacro("__mips_n32");
5795 Builder.defineMacro("_ABIN32", "2");
5796 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5797 }
5798 else if (ABI == "n64") {
5799 Builder.defineMacro("__mips_n64");
5800 Builder.defineMacro("_ABI64", "3");
5801 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5802 }
5803 else
David Blaikie83d382b2011-09-23 05:06:16 +00005804 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005805 }
Craig Topper3164f332014-03-11 03:39:26 +00005806 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5807 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005808 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5809 { { "at" }, "$1" },
5810 { { "v0" }, "$2" },
5811 { { "v1" }, "$3" },
5812 { { "a0" }, "$4" },
5813 { { "a1" }, "$5" },
5814 { { "a2" }, "$6" },
5815 { { "a3" }, "$7" },
5816 { { "a4" }, "$8" },
5817 { { "a5" }, "$9" },
5818 { { "a6" }, "$10" },
5819 { { "a7" }, "$11" },
5820 { { "t0" }, "$12" },
5821 { { "t1" }, "$13" },
5822 { { "t2" }, "$14" },
5823 { { "t3" }, "$15" },
5824 { { "s0" }, "$16" },
5825 { { "s1" }, "$17" },
5826 { { "s2" }, "$18" },
5827 { { "s3" }, "$19" },
5828 { { "s4" }, "$20" },
5829 { { "s5" }, "$21" },
5830 { { "s6" }, "$22" },
5831 { { "s7" }, "$23" },
5832 { { "t8" }, "$24" },
5833 { { "t9" }, "$25" },
5834 { { "k0" }, "$26" },
5835 { { "k1" }, "$27" },
5836 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005837 { { "sp","$sp" }, "$29" },
5838 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005839 { { "ra" }, "$31" }
5840 };
5841 Aliases = GCCRegAliases;
5842 NumAliases = llvm::array_lengthof(GCCRegAliases);
5843 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00005844
5845 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00005846};
5847
5848class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005849 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005850 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005851 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 +00005852 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005853 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005854
Akira Hatanakabef17452011-09-20 19:21:49 +00005855 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005856
Akira Hatanakabef17452011-09-20 19:21:49 +00005857public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005858 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005859 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005860 void getTargetDefines(const LangOptions &Opts,
5861 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005862 DefineStd(Builder, "MIPSEB", Opts);
5863 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005864 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005865 }
5866};
5867
5868class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005869 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005870 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005871 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 +00005872 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005873 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005874 }
5875public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005876 Mips64ELTargetInfo(const llvm::Triple &Triple)
5877 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005878 // Default ABI is n64.
5879 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005880 }
Craig Topper3164f332014-03-11 03:39:26 +00005881 void getTargetDefines(const LangOptions &Opts,
5882 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005883 DefineStd(Builder, "MIPSEL", Opts);
5884 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005885 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005886 }
5887};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005888} // end anonymous namespace.
5889
Ivan Krasindd7403e2011-08-24 20:22:22 +00005890namespace {
5891class PNaClTargetInfo : public TargetInfo {
5892public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005893 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005894 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005895 this->UserLabelPrefix = "";
5896 this->LongAlign = 32;
5897 this->LongWidth = 32;
5898 this->PointerAlign = 32;
5899 this->PointerWidth = 32;
5900 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005901 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005902 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005903 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005904 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005905 this->SizeType = TargetInfo::UnsignedInt;
5906 this->PtrDiffType = TargetInfo::SignedInt;
5907 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005908 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005909 }
5910
Craig Topper3164f332014-03-11 03:39:26 +00005911 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005912 }
Craig Toppere6f17d02014-03-11 04:07:52 +00005913 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005914 Builder.defineMacro("__le32__");
5915 Builder.defineMacro("__pnacl__");
5916 }
Craig Topper3164f332014-03-11 03:39:26 +00005917 void getTargetDefines(const LangOptions &Opts,
5918 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005919 getArchDefines(Opts, Builder);
5920 }
Craig Topper3164f332014-03-11 03:39:26 +00005921 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005922 return Feature == "pnacl";
5923 }
Craig Topper3164f332014-03-11 03:39:26 +00005924 void getTargetBuiltins(const Builtin::Info *&Records,
5925 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005926 }
Craig Topper3164f332014-03-11 03:39:26 +00005927 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005928 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005929 }
Craig Topper3164f332014-03-11 03:39:26 +00005930 void getGCCRegNames(const char * const *&Names,
5931 unsigned &NumNames) const override;
5932 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5933 unsigned &NumAliases) const override;
5934 bool validateAsmConstraint(const char *&Name,
5935 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005936 return false;
5937 }
5938
Craig Topper3164f332014-03-11 03:39:26 +00005939 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005940 return "";
5941 }
5942};
5943
5944void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5945 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00005946 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005947 NumNames = 0;
5948}
5949
5950void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5951 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00005952 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005953 NumAliases = 0;
5954}
5955} // end anonymous namespace.
5956
Guy Benyeib798fc92012-12-11 21:38:14 +00005957namespace {
5958 static const unsigned SPIRAddrSpaceMap[] = {
5959 1, // opencl_global
5960 3, // opencl_local
5961 2, // opencl_constant
5962 0, // cuda_device
5963 0, // cuda_constant
5964 0 // cuda_shared
5965 };
5966 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00005967 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005968 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005969 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5970 "SPIR target must use unknown OS");
5971 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5972 "SPIR target must use unknown environment type");
5973 BigEndian = false;
5974 TLSSupported = false;
5975 LongWidth = LongAlign = 64;
5976 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005977 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00005978 // Define available target features
5979 // These must be defined in sorted order!
5980 NoAsmVariants = true;
5981 }
Craig Topper3164f332014-03-11 03:39:26 +00005982 void getTargetDefines(const LangOptions &Opts,
5983 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005984 DefineStd(Builder, "SPIR", Opts);
5985 }
Craig Topper3164f332014-03-11 03:39:26 +00005986 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005987 return Feature == "spir";
5988 }
Craig Topper3164f332014-03-11 03:39:26 +00005989
5990 void getTargetBuiltins(const Builtin::Info *&Records,
5991 unsigned &NumRecords) const override {}
5992 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005993 return "";
5994 }
Craig Topper3164f332014-03-11 03:39:26 +00005995 void getGCCRegNames(const char * const *&Names,
5996 unsigned &NumNames) const override {}
5997 bool validateAsmConstraint(const char *&Name,
5998 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005999 return true;
6000 }
Craig Topper3164f332014-03-11 03:39:26 +00006001 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6002 unsigned &NumAliases) const override {}
6003 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006004 return TargetInfo::VoidPtrBuiltinVaList;
6005 }
6006 };
6007
6008
6009 class SPIR32TargetInfo : public SPIRTargetInfo {
6010 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006011 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006012 PointerWidth = PointerAlign = 32;
6013 SizeType = TargetInfo::UnsignedInt;
6014 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6015 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006016 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6017 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006018 }
Craig Topper3164f332014-03-11 03:39:26 +00006019 void getTargetDefines(const LangOptions &Opts,
6020 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006021 DefineStd(Builder, "SPIR32", Opts);
6022 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006023 };
6024
6025 class SPIR64TargetInfo : public SPIRTargetInfo {
6026 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006027 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006028 PointerWidth = PointerAlign = 64;
6029 SizeType = TargetInfo::UnsignedLong;
6030 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006031 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6032 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006033 }
Craig Topper3164f332014-03-11 03:39:26 +00006034 void getTargetDefines(const LangOptions &Opts,
6035 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006036 DefineStd(Builder, "SPIR64", Opts);
6037 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006038 };
6039}
6040
Robert Lytton0e076492013-08-13 09:43:10 +00006041namespace {
6042class XCoreTargetInfo : public TargetInfo {
6043 static const Builtin::Info BuiltinInfo[];
6044public:
6045 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6046 BigEndian = false;
6047 NoAsmVariants = true;
6048 LongLongAlign = 32;
6049 SuitableAlign = 32;
6050 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006051 SizeType = UnsignedInt;
6052 PtrDiffType = SignedInt;
6053 IntPtrType = SignedInt;
6054 WCharType = UnsignedChar;
6055 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006056 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006057 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 +00006058 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006059 }
Craig Topper3164f332014-03-11 03:39:26 +00006060 void getTargetDefines(const LangOptions &Opts,
6061 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006062 Builder.defineMacro("__XS1B__");
6063 }
Craig Topper3164f332014-03-11 03:39:26 +00006064 void getTargetBuiltins(const Builtin::Info *&Records,
6065 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006066 Records = BuiltinInfo;
6067 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6068 }
Craig Topper3164f332014-03-11 03:39:26 +00006069 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006070 return TargetInfo::VoidPtrBuiltinVaList;
6071 }
Craig Topper3164f332014-03-11 03:39:26 +00006072 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006073 return "";
6074 }
Craig Topper3164f332014-03-11 03:39:26 +00006075 void getGCCRegNames(const char * const *&Names,
6076 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006077 static const char * const GCCRegNames[] = {
6078 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6079 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6080 };
6081 Names = GCCRegNames;
6082 NumNames = llvm::array_lengthof(GCCRegNames);
6083 }
Craig Topper3164f332014-03-11 03:39:26 +00006084 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6085 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006086 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006087 NumAliases = 0;
6088 }
Craig Topper3164f332014-03-11 03:39:26 +00006089 bool validateAsmConstraint(const char *&Name,
6090 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006091 return false;
6092 }
Craig Topper3164f332014-03-11 03:39:26 +00006093 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006094 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6095 return (RegNo < 2)? RegNo : -1;
6096 }
Robert Lytton0e076492013-08-13 09:43:10 +00006097};
6098
6099const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6100#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6101#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6102 ALL_LANGUAGES },
6103#include "clang/Basic/BuiltinsXCore.def"
6104};
6105} // end anonymous namespace.
6106
Ivan Krasindd7403e2011-08-24 20:22:22 +00006107
Chris Lattner5ba61f02006-10-14 07:39:34 +00006108//===----------------------------------------------------------------------===//
6109// Driver code
6110//===----------------------------------------------------------------------===//
6111
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006112static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006113 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006114
Daniel Dunbar52322032009-08-18 05:47:58 +00006115 switch (Triple.getArch()) {
6116 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006117 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006118
Tim Northover2a0783d2014-05-30 14:14:07 +00006119 case llvm::Triple::xcore:
6120 return new XCoreTargetInfo(Triple);
6121
6122 case llvm::Triple::hexagon:
6123 return new HexagonTargetInfo(Triple);
6124
6125 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006126 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006127 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006128
6129 switch (os) {
6130 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006131 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006132 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006133 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006134 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006135 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006136 }
6137
Christian Pirker9b019ae2014-02-25 13:51:00 +00006138 case llvm::Triple::aarch64_be:
6139 switch (os) {
6140 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006141 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006142 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006143 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006144 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006145 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006146 }
6147
Daniel Dunbar52322032009-08-18 05:47:58 +00006148 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006149 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006150 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006151 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006152
Daniel Dunbar52322032009-08-18 05:47:58 +00006153 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006154 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006155 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006156 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006157 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006158 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006159 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006160 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006161 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006162 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006163 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006164 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006165 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006166 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006167 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006168 case llvm::Triple::Win32:
6169 switch (Triple.getEnvironment()) {
6170 default:
6171 return new ARMleTargetInfo(Triple);
6172 case llvm::Triple::Itanium:
6173 return new ItaniumWindowsARMleTargetInfo(Triple);
6174 case llvm::Triple::MSVC:
6175 return new MicrosoftARMleTargetInfo(Triple);
6176 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006177 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006178 return new ARMleTargetInfo(Triple);
6179 }
6180
6181 case llvm::Triple::armeb:
6182 case llvm::Triple::thumbeb:
6183 if (Triple.isOSDarwin())
6184 return new DarwinARMTargetInfo(Triple);
6185
6186 switch (os) {
6187 case llvm::Triple::Linux:
6188 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6189 case llvm::Triple::FreeBSD:
6190 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6191 case llvm::Triple::NetBSD:
6192 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6193 case llvm::Triple::OpenBSD:
6194 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6195 case llvm::Triple::Bitrig:
6196 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6197 case llvm::Triple::RTEMS:
6198 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6199 case llvm::Triple::NaCl:
6200 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6201 default:
6202 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006203 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006204
Daniel Dunbar52322032009-08-18 05:47:58 +00006205 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006206 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006207
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006208 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006209 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006210 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006211 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006212 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006213 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006214 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006215 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006216 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006217 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006218 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006219 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006220 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006221
6222 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006223 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006224 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006225 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006226 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006227 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006228 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006229 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006230 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006231 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006232 case llvm::Triple::NaCl:
6233 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006234 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006235 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006236 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006237
Akira Hatanakabef17452011-09-20 19:21:49 +00006238 case llvm::Triple::mips64:
6239 switch (os) {
6240 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006241 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006242 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006243 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006244 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006245 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006246 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006247 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006248 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006249 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006250 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006251 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006252 }
6253
6254 case llvm::Triple::mips64el:
6255 switch (os) {
6256 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006257 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006258 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006259 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006260 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006261 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006262 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006263 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006264 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006265 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006266 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006267 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006268 }
6269
Ivan Krasindd7403e2011-08-24 20:22:22 +00006270 case llvm::Triple::le32:
6271 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006272 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006273 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006274 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006275 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006276 }
6277
Daniel Dunbar52322032009-08-18 05:47:58 +00006278 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006279 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006280 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006281 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006282 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006283 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006284 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006285 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006286 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006287 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006288 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006289 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006290 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006291 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006292 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006293 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006294 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006295
6296 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006297 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006298 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006299 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006300 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006301 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006302 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006303 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006304 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006305 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006306 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006307 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006308 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006309 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006310 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006311
Bill Schmidt778d3872013-07-26 01:36:11 +00006312 case llvm::Triple::ppc64le:
6313 switch (os) {
6314 case llvm::Triple::Linux:
6315 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6316 default:
6317 return new PPC64TargetInfo(Triple);
6318 }
6319
Peter Collingbournec947aae2012-05-20 23:28:41 +00006320 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006321 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006322 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006323 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006324
Eli Friedmand13b41e2012-10-12 23:32:00 +00006325 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006326 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006327
Daniel Dunbar52322032009-08-18 05:47:58 +00006328 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006329 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006330 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006331 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006332 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006333 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006334 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006335 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006336 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006337 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006338 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006339 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006340 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006341 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006342 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006343 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006344 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006345
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006346 case llvm::Triple::sparcv9:
6347 switch (os) {
6348 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006349 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006350 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006351 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006352 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006353 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006354 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006355 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006356 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006357 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006358 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006359 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006360 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006361 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006362 }
6363
Ulrich Weigand47445072013-05-06 16:26:41 +00006364 case llvm::Triple::systemz:
6365 switch (os) {
6366 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006367 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006368 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006369 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006370 }
6371
Eli Friedmana9c3d712009-08-19 20:47:07 +00006372 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006373 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006374
Daniel Dunbar52322032009-08-18 05:47:58 +00006375 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006376 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006377 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006378
Daniel Dunbar52322032009-08-18 05:47:58 +00006379 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00006380 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006381 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006382 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006383 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006384 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006385 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006386 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006387 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006388 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006389 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006390 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006391 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006392 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006393 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006394 case llvm::Triple::KFreeBSD:
6395 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006396 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006397 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006398 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006399 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006400 case llvm::Triple::Win32: {
6401 switch (Triple.getEnvironment()) {
6402 default:
6403 return new X86_32TargetInfo(Triple);
6404 case llvm::Triple::Cygnus:
6405 return new CygwinX86_32TargetInfo(Triple);
6406 case llvm::Triple::GNU:
6407 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006408 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006409 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006410 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006411 }
6412 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006413 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006414 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006415 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006416 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006417 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006418 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006419 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006420 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006421 }
6422
6423 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006424 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006425 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006426
Daniel Dunbar52322032009-08-18 05:47:58 +00006427 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00006428 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006429 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006430 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006431 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006432 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006433 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006434 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006435 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006436 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006437 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006438 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006439 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006440 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006441 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006442 case llvm::Triple::KFreeBSD:
6443 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006444 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006445 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006446 case llvm::Triple::Win32: {
6447 switch (Triple.getEnvironment()) {
6448 default:
6449 return new X86_64TargetInfo(Triple);
6450 case llvm::Triple::GNU:
6451 return new MinGWX86_64TargetInfo(Triple);
6452 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006453 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006454 }
6455 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006456 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006457 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006458 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006459 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006460 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006461
6462 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006463 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006464 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006465 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006466 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006467 }
6468 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006469 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006470 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006471 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006472 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006473 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006474 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006475}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006476
6477/// CreateTargetInfo - Return the target info object for the specified target
6478/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006479TargetInfo *
6480TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6481 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006482 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006483
6484 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006485 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006486 if (!Target) {
6487 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006488 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006489 }
Alp Toker80758082014-07-06 05:26:44 +00006490 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006491
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006492 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006493 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6494 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006495 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006496 }
6497
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006498 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006499 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6500 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006501 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006502 }
6503
Rafael Espindolaeb265472013-08-21 21:59:03 +00006504 // Set the fp math unit.
6505 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6506 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006507 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006508 }
6509
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006510 // Compute the default target features, we need the target to handle this
6511 // because features may have dependencies on one another.
6512 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006513 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006514
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006515 // Apply the user specified deltas.
6516 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6517 I < N; ++I) {
6518 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006519 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006520 bool Enabled = Name[0] == '+';
6521 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006522 }
6523
6524 // Add the features to the compile options.
6525 //
6526 // FIXME: If we are completely confident that we have the right set, we only
6527 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006528 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006529 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6530 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006531 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006532 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006533 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006534
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006535 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006536}