blob: 39bc3e3a6edb80afd86733b0cc34d0bea2076cc8 [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"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.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.
Alexey Samsonovedf99a92014-11-07 22:29:38 +000096 if (Opts.Sanitize.has(SanitizerKind::Address))
97 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000098
John McCall5d36a8c2011-06-16 00:03:19 +000099 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000100 // __weak is always defined, for use in blocks and with objc pointers.
101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000102
John McCall31168b02011-06-15 23:02:42 +0000103 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000104 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
106 else
107 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000108
John McCall31168b02011-06-15 23:02:42 +0000109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
110 // allow this in C, since one might have block pointers in structs that
111 // are used in pure C code and in Objective-C ARC.
112 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000113 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000114
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000115 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000116 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000117 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000119
120 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000121 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000122
Daniel Dunbarecf13562011-04-19 21:40:34 +0000123 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000124 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000125 if (Triple.isMacOSX()) {
126 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000127 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000129 Triple.getOSVersion(Maj, Min, Rev);
130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000131 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000132
Sebastian Pop422377c2012-01-20 22:01:23 +0000133 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000134 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
136 if (PlatformName == "win32") {
137 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138 return;
139 }
140
Evan Cheng31dd9a62014-01-26 23:12:43 +0000141 // Set the appropriate OS version define.
142 if (Triple.isiOS()) {
143 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
144 char Str[6];
145 Str[0] = '0' + Maj;
146 Str[1] = '0' + (Min / 10);
147 Str[2] = '0' + (Min % 10);
148 Str[3] = '0' + (Rev / 10);
149 Str[4] = '0' + (Rev % 10);
150 Str[5] = '\0';
151 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
152 Str);
153 } else if (Triple.isMacOSX()) {
154 // Note that the Driver allows versions which aren't representable in the
155 // define (because we only get a single digit for the minor and micro
156 // revision numbers). So, we limit them to the maximum representable
157 // version.
158 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000159 char Str[7];
160 if (Maj < 10 || (Maj == 10 && Min < 10)) {
161 Str[0] = '0' + (Maj / 10);
162 Str[1] = '0' + (Maj % 10);
163 Str[2] = '0' + std::min(Min, 9U);
164 Str[3] = '0' + std::min(Rev, 9U);
165 Str[4] = '\0';
166 } else {
167 // Handle versions > 10.9.
168 Str[0] = '0' + (Maj / 10);
169 Str[1] = '0' + (Maj % 10);
170 Str[2] = '0' + (Min / 10);
171 Str[3] = '0' + (Min % 10);
172 Str[4] = '0' + (Rev / 10);
173 Str[5] = '0' + (Rev % 10);
174 Str[6] = '\0';
175 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000176 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000177 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000178
Tim Northover157d9112014-01-16 08:48:16 +0000179 // Tell users about the kernel if there is one.
180 if (Triple.isOSDarwin())
181 Builder.defineMacro("__MACH__");
182
Daniel Dunbarecf13562011-04-19 21:40:34 +0000183 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000184}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000185
Benjamin Kramerd5748c72015-03-23 12:31:05 +0000186namespace {
Ed Schoutenf33c6072015-03-11 08:42:46 +0000187// CloudABI Target
188template <typename Target>
189class CloudABITargetInfo : public OSTargetInfo<Target> {
190protected:
191 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
192 MacroBuilder &Builder) const override {
193 Builder.defineMacro("__CloudABI__");
194 Builder.defineMacro("__ELF__");
195
196 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
197 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
198 Builder.defineMacro("__STDC_UTF_16__");
199 Builder.defineMacro("__STDC_UTF_32__");
200 }
201
202public:
203 CloudABITargetInfo(const llvm::Triple &Triple)
204 : OSTargetInfo<Target>(Triple) {
205 this->UserLabelPrefix = "";
206 }
207};
208
Torok Edwinb2b37c62009-06-30 17:10:35 +0000209template<typename Target>
210class DarwinTargetInfo : public OSTargetInfo<Target> {
211protected:
Craig Topper3164f332014-03-11 03:39:26 +0000212 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
213 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000214 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000215 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000216 }
Mike Stump11289f42009-09-09 15:08:12 +0000217
Torok Edwinb2b37c62009-06-30 17:10:35 +0000218public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000219 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
220 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
221 this->MCountName = "\01mcount";
222 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000223
Craig Topper3164f332014-03-11 03:39:26 +0000224 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000225 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000226 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000227 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000228 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000229 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000230 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000231 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000232
Craig Topper3164f332014-03-11 03:39:26 +0000233 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000234 // FIXME: We should return 0 when building kexts.
235 return "__TEXT,__StaticInit,regular,pure_instructions";
236 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000237
John McCalleed64c72012-01-29 01:20:30 +0000238 /// Darwin does not support protected visibility. Darwin's "default"
239 /// is very similar to ELF's "protected"; Darwin requires a "weak"
240 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000241 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000242 return false;
243 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000244};
245
Chris Lattner30ba6742009-08-10 19:03:04 +0000246
Torok Edwinb2b37c62009-06-30 17:10:35 +0000247// DragonFlyBSD Target
248template<typename Target>
249class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
250protected:
Craig Topper3164f332014-03-11 03:39:26 +0000251 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
252 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000254 Builder.defineMacro("__DragonFly__");
255 Builder.defineMacro("__DragonFly_cc_version", "100001");
256 Builder.defineMacro("__ELF__");
257 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
258 Builder.defineMacro("__tune_i386__");
259 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000260 }
261public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000262 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
263 : OSTargetInfo<Target>(Triple) {
264 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000265
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000266 switch (Triple.getArch()) {
267 default:
268 case llvm::Triple::x86:
269 case llvm::Triple::x86_64:
270 this->MCountName = ".mcount";
271 break;
272 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000273 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000274};
275
276// FreeBSD Target
277template<typename Target>
278class FreeBSDTargetInfo : public OSTargetInfo<Target> {
279protected:
Craig Topper3164f332014-03-11 03:39:26 +0000280 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
281 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000282 // FreeBSD defines; list based off of gcc output
283
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000284 unsigned Release = Triple.getOSMajorVersion();
285 if (Release == 0U)
286 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000287
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000288 Builder.defineMacro("__FreeBSD__", Twine(Release));
289 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000290 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
291 DefineStd(Builder, "unix", Opts);
292 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000293
294 // On FreeBSD, wchar_t contains the number of the code point as
295 // used by the character set of the locale. These character sets are
296 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000297 //
298 // FIXME: This is wrong; the macro refers to the numerical values
299 // of wchar_t *literals*, which are not locale-dependent. However,
300 // FreeBSD systems apparently depend on us getting this wrong, and
301 // setting this to 1 is conforming even if all the basic source
302 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000303 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000304 }
305public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000306 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
307 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000308
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000309 switch (Triple.getArch()) {
310 default:
311 case llvm::Triple::x86:
312 case llvm::Triple::x86_64:
313 this->MCountName = ".mcount";
314 break;
315 case llvm::Triple::mips:
316 case llvm::Triple::mipsel:
317 case llvm::Triple::ppc:
318 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000319 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000320 this->MCountName = "_mcount";
321 break;
322 case llvm::Triple::arm:
323 this->MCountName = "__mcount";
324 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000325 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000326 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000327};
328
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000329// GNU/kFreeBSD Target
330template<typename Target>
331class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
332protected:
Craig Topper3164f332014-03-11 03:39:26 +0000333 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
334 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000335 // GNU/kFreeBSD defines; list based off of gcc output
336
337 DefineStd(Builder, "unix", Opts);
338 Builder.defineMacro("__FreeBSD_kernel__");
339 Builder.defineMacro("__GLIBC__");
340 Builder.defineMacro("__ELF__");
341 if (Opts.POSIXThreads)
342 Builder.defineMacro("_REENTRANT");
343 if (Opts.CPlusPlus)
344 Builder.defineMacro("_GNU_SOURCE");
345 }
346public:
Eric Christopher917e9522014-11-18 22:36:15 +0000347 KFreeBSDTargetInfo(const llvm::Triple &Triple)
348 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000349 this->UserLabelPrefix = "";
350 }
351};
352
Chris Lattner3e2ee142010-07-07 16:01:42 +0000353// Minix Target
354template<typename Target>
355class MinixTargetInfo : public OSTargetInfo<Target> {
356protected:
Craig Topper3164f332014-03-11 03:39:26 +0000357 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
358 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000359 // Minix defines
360
361 Builder.defineMacro("__minix", "3");
362 Builder.defineMacro("_EM_WSIZE", "4");
363 Builder.defineMacro("_EM_PSIZE", "4");
364 Builder.defineMacro("_EM_SSIZE", "2");
365 Builder.defineMacro("_EM_LSIZE", "4");
366 Builder.defineMacro("_EM_FSIZE", "4");
367 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000368 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000369 DefineStd(Builder, "unix", Opts);
370 }
371public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000372 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
373 this->UserLabelPrefix = "";
374 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000375};
376
Torok Edwinb2b37c62009-06-30 17:10:35 +0000377// Linux target
378template<typename Target>
379class LinuxTargetInfo : public OSTargetInfo<Target> {
380protected:
Craig Topper3164f332014-03-11 03:39:26 +0000381 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
382 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000383 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000384 DefineStd(Builder, "unix", Opts);
385 DefineStd(Builder, "linux", Opts);
386 Builder.defineMacro("__gnu_linux__");
387 Builder.defineMacro("__ELF__");
Dan Albert84aee012015-03-03 18:28:38 +0000388 if (Triple.getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000389 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000390 unsigned Maj, Min, Rev;
391 Triple.getOSVersion(Maj, Min, Rev);
392 this->PlatformName = "android";
393 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
394 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000395 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000396 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000399 }
400public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000401 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000402 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000403 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000404
405 switch (Triple.getArch()) {
406 default:
407 break;
408 case llvm::Triple::ppc:
409 case llvm::Triple::ppc64:
410 case llvm::Triple::ppc64le:
411 this->MCountName = "_mcount";
412 break;
413 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000414 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000415
Craig Topper3164f332014-03-11 03:39:26 +0000416 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000417 return ".text.startup";
418 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000419};
420
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000421// NetBSD Target
422template<typename Target>
423class NetBSDTargetInfo : public OSTargetInfo<Target> {
424protected:
Craig Topper3164f332014-03-11 03:39:26 +0000425 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
426 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000427 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000428 Builder.defineMacro("__NetBSD__");
429 Builder.defineMacro("__unix__");
430 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000431 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000432 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000433
434 switch (Triple.getArch()) {
435 default:
436 break;
437 case llvm::Triple::arm:
438 case llvm::Triple::armeb:
439 case llvm::Triple::thumb:
440 case llvm::Triple::thumbeb:
441 Builder.defineMacro("__ARM_DWARF_EH__");
442 break;
443 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000444 }
445public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000446 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
447 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000448 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000449 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000450};
451
Torok Edwinb2b37c62009-06-30 17:10:35 +0000452// OpenBSD Target
453template<typename Target>
454class OpenBSDTargetInfo : public OSTargetInfo<Target> {
455protected:
Craig Topper3164f332014-03-11 03:39:26 +0000456 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
457 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000458 // OpenBSD defines; list based off of gcc output
459
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000460 Builder.defineMacro("__OpenBSD__");
461 DefineStd(Builder, "unix", Opts);
462 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000463 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000464 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000465 }
466public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000467 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
468 this->UserLabelPrefix = "";
469 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000470
Eli Friedman3715d1f2011-12-15 02:15:56 +0000471 switch (Triple.getArch()) {
472 default:
473 case llvm::Triple::x86:
474 case llvm::Triple::x86_64:
475 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000476 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000477 this->MCountName = "__mcount";
478 break;
479 case llvm::Triple::mips64:
480 case llvm::Triple::mips64el:
481 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000482 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000483 this->MCountName = "_mcount";
484 break;
485 }
486 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000487};
488
Eli Friedman9fa28852012-08-08 23:57:20 +0000489// Bitrig Target
490template<typename Target>
491class BitrigTargetInfo : public OSTargetInfo<Target> {
492protected:
Craig Topper3164f332014-03-11 03:39:26 +0000493 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
494 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000495 // Bitrig defines; list based off of gcc output
496
497 Builder.defineMacro("__Bitrig__");
498 DefineStd(Builder, "unix", Opts);
499 Builder.defineMacro("__ELF__");
500 if (Opts.POSIXThreads)
501 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000502
503 switch (Triple.getArch()) {
504 default:
505 break;
506 case llvm::Triple::arm:
507 case llvm::Triple::armeb:
508 case llvm::Triple::thumb:
509 case llvm::Triple::thumbeb:
510 Builder.defineMacro("__ARM_DWARF_EH__");
511 break;
512 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000513 }
514public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000515 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
516 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000517 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000518 }
519};
520
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000521// PSP Target
522template<typename Target>
523class PSPTargetInfo : public OSTargetInfo<Target> {
524protected:
Craig Topper3164f332014-03-11 03:39:26 +0000525 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
526 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000527 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000528 Builder.defineMacro("PSP");
529 Builder.defineMacro("_PSP");
530 Builder.defineMacro("__psp__");
531 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000532 }
533public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000534 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000535 this->UserLabelPrefix = "";
536 }
537};
538
John Thompsone467e192009-11-19 17:18:50 +0000539// PS3 PPU Target
540template<typename Target>
541class PS3PPUTargetInfo : public OSTargetInfo<Target> {
542protected:
Craig Topper3164f332014-03-11 03:39:26 +0000543 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
544 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000545 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000546 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000547 Builder.defineMacro("__PPU__");
548 Builder.defineMacro("__CELLOS_LV2__");
549 Builder.defineMacro("__ELF__");
550 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000551 Builder.defineMacro("_ARCH_PPC64");
552 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000553 }
554public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000555 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000556 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000557 this->LongWidth = this->LongAlign = 32;
558 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000559 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000560 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000561 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000562 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000563 }
564};
565
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000566template <typename Target>
567class PS4OSTargetInfo : public OSTargetInfo<Target> {
568protected:
569 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
570 MacroBuilder &Builder) const override {
571 Builder.defineMacro("__FreeBSD__", "9");
572 Builder.defineMacro("__FreeBSD_cc_version", "900001");
573 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
574 DefineStd(Builder, "unix", Opts);
575 Builder.defineMacro("__ELF__");
576 Builder.defineMacro("__PS4__");
577 }
578public:
579 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
580 this->WCharType = this->UnsignedShort;
581
582 this->UserLabelPrefix = "";
583
584 switch (Triple.getArch()) {
585 default:
586 case llvm::Triple::x86_64:
587 this->MCountName = ".mcount";
588 break;
589 }
590 }
591};
592
Torok Edwinb2b37c62009-06-30 17:10:35 +0000593// Solaris target
594template<typename Target>
595class SolarisTargetInfo : public OSTargetInfo<Target> {
596protected:
Craig Topper3164f332014-03-11 03:39:26 +0000597 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
598 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000599 DefineStd(Builder, "sun", Opts);
600 DefineStd(Builder, "unix", Opts);
601 Builder.defineMacro("__ELF__");
602 Builder.defineMacro("__svr4__");
603 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000604 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
605 // newer, but to 500 for everything else. feature_test.h has a check to
606 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000607 // with a new version.
608 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000609 Builder.defineMacro("_XOPEN_SOURCE", "600");
610 else
611 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000612 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000613 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000614 Builder.defineMacro("_LARGEFILE_SOURCE");
615 Builder.defineMacro("_LARGEFILE64_SOURCE");
616 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000617 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000618 }
619public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000620 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000621 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000622 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000623 // FIXME: WIntType should be SignedLong
624 }
625};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000626
627// Windows target
628template<typename Target>
629class WindowsTargetInfo : public OSTargetInfo<Target> {
630protected:
Craig Topper3164f332014-03-11 03:39:26 +0000631 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
632 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000633 Builder.defineMacro("_WIN32");
634 }
635 void getVisualStudioDefines(const LangOptions &Opts,
636 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000637 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000638 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000639 Builder.defineMacro("_CPPRTTI");
640
Reid Kleckner16514352015-01-30 21:42:55 +0000641 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000642 Builder.defineMacro("_CPPUNWIND");
643 }
644
645 if (!Opts.CharIsSigned)
646 Builder.defineMacro("_CHAR_UNSIGNED");
647
648 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
649 // but it works for now.
650 if (Opts.POSIXThreads)
651 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000652
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000653 if (Opts.MSCompatibilityVersion) {
654 Builder.defineMacro("_MSC_VER",
655 Twine(Opts.MSCompatibilityVersion / 100000));
656 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000657 // FIXME We cannot encode the revision information into 32-bits
658 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000659
660 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(19))
661 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000662 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000663
664 if (Opts.MicrosoftExt) {
665 Builder.defineMacro("_MSC_EXTENSIONS");
666
667 if (Opts.CPlusPlus11) {
668 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
669 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
670 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
671 }
672 }
673
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000674 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000675 }
676
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000677public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000678 WindowsTargetInfo(const llvm::Triple &Triple)
679 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000680};
681
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000682template <typename Target>
683class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000684protected:
Craig Topper3164f332014-03-11 03:39:26 +0000685 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
686 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000687 if (Opts.POSIXThreads)
688 Builder.defineMacro("_REENTRANT");
689 if (Opts.CPlusPlus)
690 Builder.defineMacro("_GNU_SOURCE");
691
692 DefineStd(Builder, "unix", Opts);
693 Builder.defineMacro("__ELF__");
694 Builder.defineMacro("__native_client__");
695 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000696
697public:
698 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000699 this->UserLabelPrefix = "";
700 this->LongAlign = 32;
701 this->LongWidth = 32;
702 this->PointerAlign = 32;
703 this->PointerWidth = 32;
704 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000705 this->Int64Type = TargetInfo::SignedLongLong;
706 this->DoubleAlign = 64;
707 this->LongDoubleWidth = 64;
708 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000709 this->LongLongWidth = 64;
710 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000711 this->SizeType = TargetInfo::UnsignedInt;
712 this->PtrDiffType = TargetInfo::SignedInt;
713 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000714 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000715 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000716 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000717 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000718 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000719 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000720 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000721 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000722 } else if (Triple.getArch() == llvm::Triple::mipsel) {
723 // Handled on mips' setDescriptionString.
724 } else {
725 assert(Triple.getArch() == llvm::Triple::le32);
726 this->DescriptionString = "e-p:32:32-i64:64";
727 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000728 }
729};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000730
Chris Lattner09d98f52008-10-05 21:50:58 +0000731//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000732// Specific target implementations.
733//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000734
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000735// PPC abstract base class
736class PPCTargetInfo : public TargetInfo {
737 static const Builtin::Info BuiltinInfo[];
738 static const char * const GCCRegNames[];
739 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000740 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000741
742 // Target cpu features.
743 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000744 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000745 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000746 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000747 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000748 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000749 bool HasBPERMD;
750 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000751
Ulrich Weigand8afad612014-07-28 13:17:52 +0000752protected:
753 std::string ABI;
754
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000755public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000756 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000757 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000758 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000759 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000760 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000761 LongDoubleWidth = LongDoubleAlign = 128;
762 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
763 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000764
Hal Finkel6b984f02012-07-03 16:51:04 +0000765 /// \brief Flags for architecture specific defines.
766 typedef enum {
767 ArchDefineNone = 0,
768 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
769 ArchDefinePpcgr = 1 << 1,
770 ArchDefinePpcsq = 1 << 2,
771 ArchDefine440 = 1 << 3,
772 ArchDefine603 = 1 << 4,
773 ArchDefine604 = 1 << 5,
774 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000775 ArchDefinePwr5 = 1 << 7,
776 ArchDefinePwr5x = 1 << 8,
777 ArchDefinePwr6 = 1 << 9,
778 ArchDefinePwr6x = 1 << 10,
779 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000780 ArchDefinePwr8 = 1 << 12,
781 ArchDefineA2 = 1 << 13,
782 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000783 } ArchDefineTypes;
784
Bill Schmidt38378a02013-02-01 20:23:10 +0000785 // Note: GCC recognizes the following additional cpus:
786 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
787 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
788 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000789 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000790 bool CPUKnown = llvm::StringSwitch<bool>(Name)
791 .Case("generic", true)
792 .Case("440", true)
793 .Case("450", true)
794 .Case("601", true)
795 .Case("602", true)
796 .Case("603", true)
797 .Case("603e", true)
798 .Case("603ev", true)
799 .Case("604", true)
800 .Case("604e", true)
801 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000802 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000803 .Case("g3", true)
804 .Case("7400", true)
805 .Case("g4", true)
806 .Case("7450", true)
807 .Case("g4+", true)
808 .Case("750", true)
809 .Case("970", true)
810 .Case("g5", true)
811 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000812 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000813 .Case("e500mc", true)
814 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000815 .Case("power3", true)
816 .Case("pwr3", true)
817 .Case("power4", true)
818 .Case("pwr4", true)
819 .Case("power5", true)
820 .Case("pwr5", true)
821 .Case("power5x", true)
822 .Case("pwr5x", true)
823 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000824 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000825 .Case("power6x", true)
826 .Case("pwr6x", true)
827 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000828 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000829 .Case("power8", true)
830 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000831 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000832 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000833 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000834 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000835 .Case("powerpc64le", true)
836 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000837 .Default(false);
838
839 if (CPUKnown)
840 CPU = Name;
841
842 return CPUKnown;
843 }
844
Ulrich Weigand8afad612014-07-28 13:17:52 +0000845
846 StringRef getABI() const override { return ABI; }
847
Craig Topper3164f332014-03-11 03:39:26 +0000848 void getTargetBuiltins(const Builtin::Info *&Records,
849 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000850 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000851 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000852 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000853
Craig Topper3164f332014-03-11 03:39:26 +0000854 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000855
Craig Topper3164f332014-03-11 03:39:26 +0000856 void getTargetDefines(const LangOptions &Opts,
857 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000858
Craig Topper3164f332014-03-11 03:39:26 +0000859 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000860
Craig Topper3164f332014-03-11 03:39:26 +0000861 bool handleTargetFeatures(std::vector<std::string> &Features,
862 DiagnosticsEngine &Diags) override;
863 bool hasFeature(StringRef Feature) const override;
864
865 void getGCCRegNames(const char * const *&Names,
866 unsigned &NumNames) const override;
867 void getGCCRegAliases(const GCCRegAlias *&Aliases,
868 unsigned &NumAliases) const override;
869 bool validateAsmConstraint(const char *&Name,
870 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000871 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000872 default: return false;
873 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000874 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000875 case 'b': // Base register
876 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000877 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000878 break;
879 // FIXME: The following are added to allow parsing.
880 // I just took a guess at what the actions should be.
881 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000882 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000883 case 'v': // Altivec vector register
884 Info.setAllowsRegister();
885 break;
886 case 'w':
887 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000888 case 'd':// VSX vector register to hold vector double data
889 case 'f':// VSX vector register to hold vector float data
890 case 's':// VSX vector register to hold scalar float data
891 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000892 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000893 break;
894 default:
895 return false;
896 }
897 Info.setAllowsRegister();
898 Name++; // Skip over 'w'.
899 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000900 case 'h': // `MQ', `CTR', or `LINK' register
901 case 'q': // `MQ' register
902 case 'c': // `CTR' register
903 case 'l': // `LINK' register
904 case 'x': // `CR' register (condition register) number 0
905 case 'y': // `CR' register (condition register)
906 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000907 Info.setAllowsRegister();
908 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000909 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000910 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000911 // (use `L' instead for SImode constants)
912 case 'K': // Unsigned 16-bit constant
913 case 'L': // Signed 16-bit constant shifted left 16 bits
914 case 'M': // Constant larger than 31
915 case 'N': // Exact power of 2
916 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000917 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000918 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000919 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000920 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000921 break;
922 case 'm': // Memory operand. Note that on PowerPC targets, m can
923 // include addresses that update the base register. It
924 // is therefore only safe to use `m' in an asm statement
925 // if that asm statement accesses the operand exactly once.
926 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000927 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000928 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000929 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000930 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000931 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
932 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000933 // register to be updated.
934 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000935 if (Name[1] != 's')
936 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000937 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000938 // include any automodification of the base register. Unlike
939 // `m', this constraint can be used in asm statements that
940 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000941 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000942 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000943 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000944 break;
945 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000946 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000947 case 'Z': // Memory operand that is an indexed or indirect from a
948 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000949 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000950 Info.setAllowsMemory();
951 Info.setAllowsRegister();
952 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000953 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000954 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000955 // register (`p' is preferable for asm statements)
956 case 'S': // Constant suitable as a 64-bit mask operand
957 case 'T': // Constant suitable as a 32-bit mask operand
958 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000959 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000960 // instructions
961 case 'W': // Vector constant that does not require memory
962 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000963 break;
964 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000965 }
John Thompson07a61a42010-06-24 22:44:13 +0000966 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000967 }
Craig Topper3164f332014-03-11 03:39:26 +0000968 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000969 std::string R;
970 switch (*Constraint) {
971 case 'e':
972 case 'w':
973 // Two-character constraint; add "^" hint for later parsing.
974 R = std::string("^") + std::string(Constraint, 2);
975 Constraint++;
976 break;
977 default:
978 return TargetInfo::convertConstraint(Constraint);
979 }
980 return R;
981 }
Craig Topper3164f332014-03-11 03:39:26 +0000982 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000983 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000984 }
Craig Topper3164f332014-03-11 03:39:26 +0000985 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000986 if (RegNo == 0) return 3;
987 if (RegNo == 1) return 4;
988 return -1;
989 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +0000990
991 bool hasSjLjLowering() const override {
992 return true;
993 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000994};
Anders Carlssonf511f642007-11-27 04:11:28 +0000995
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000996const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000997#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000998#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000999 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001000#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001001};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001002
Eric Christopher917e9522014-11-18 22:36:15 +00001003/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001004/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001005bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001006 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001007 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1008 // Ignore disabled features.
1009 if (Features[i][0] == '-')
1010 continue;
1011
1012 StringRef Feature = StringRef(Features[i]).substr(1);
1013
1014 if (Feature == "vsx") {
1015 HasVSX = true;
1016 continue;
1017 }
1018
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001019 if (Feature == "bpermd") {
1020 HasBPERMD = true;
1021 continue;
1022 }
1023
1024 if (Feature == "extdiv") {
1025 HasExtDiv = true;
1026 continue;
1027 }
1028
Bill Schmidt59eb7672014-10-10 15:09:43 +00001029 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001030 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +00001031 continue;
1032 }
1033
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001034 if (Feature == "crypto") {
1035 HasP8Crypto = true;
1036 continue;
1037 }
1038
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001039 if (Feature == "direct-move") {
1040 HasDirectMove = true;
1041 continue;
1042 }
1043
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001044 if (Feature == "qpx") {
1045 HasQPX = true;
1046 continue;
1047 }
1048
Kit Barton8246f282015-03-25 19:41:41 +00001049 if (Feature == "htm") {
1050 HasHTM = true;
1051 continue;
1052 }
1053
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001054 // TODO: Finish this list and add an assert that we've handled them
1055 // all.
1056 }
1057
1058 return true;
1059}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001060
Chris Lattnerecd49032009-03-02 22:27:17 +00001061/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1062/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001063void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001064 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001065 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001066 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001067 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001068 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001069 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001070 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001071 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001072 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001073 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001074 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001075 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001076 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001077
Chris Lattnerecd49032009-03-02 22:27:17 +00001078 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001079 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1080 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001081 } else {
1082 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1083 getTriple().getOS() != llvm::Triple::OpenBSD)
1084 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001085 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001086
Ulrich Weigand8afad612014-07-28 13:17:52 +00001087 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001088 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001089 Builder.defineMacro("_CALL_ELF", "1");
1090 if (ABI == "elfv2")
1091 Builder.defineMacro("_CALL_ELF", "2");
1092
Chris Lattnerecd49032009-03-02 22:27:17 +00001093 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001094 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1095 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001096
Chris Lattnerecd49032009-03-02 22:27:17 +00001097 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001098 if (LongDoubleWidth == 128)
1099 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001100
John Thompsone467e192009-11-19 17:18:50 +00001101 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001102 Builder.defineMacro("__VEC__", "10206");
1103 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001104 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001105
1106 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001107 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1108 .Case("440", ArchDefineName)
1109 .Case("450", ArchDefineName | ArchDefine440)
1110 .Case("601", ArchDefineName)
1111 .Case("602", ArchDefineName | ArchDefinePpcgr)
1112 .Case("603", ArchDefineName | ArchDefinePpcgr)
1113 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1114 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1115 .Case("604", ArchDefineName | ArchDefinePpcgr)
1116 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1117 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001118 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001119 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1120 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1121 .Case("750", ArchDefineName | ArchDefinePpcgr)
1122 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1123 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001124 .Case("a2", ArchDefineA2)
1125 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001126 .Case("pwr3", ArchDefinePpcgr)
1127 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1128 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1129 | ArchDefinePpcsq)
1130 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1131 | ArchDefinePpcgr | ArchDefinePpcsq)
1132 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1133 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1134 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1135 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1136 | ArchDefinePpcsq)
1137 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1138 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001139 | ArchDefinePpcgr | ArchDefinePpcsq)
1140 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1141 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1142 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001143 .Case("power3", ArchDefinePpcgr)
1144 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1145 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1146 | ArchDefinePpcsq)
1147 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1148 | ArchDefinePpcgr | ArchDefinePpcsq)
1149 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1150 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1151 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1152 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1153 | ArchDefinePpcsq)
1154 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1155 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001156 | ArchDefinePpcgr | ArchDefinePpcsq)
1157 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1158 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1159 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001160 .Default(ArchDefineNone);
1161
1162 if (defs & ArchDefineName)
1163 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1164 if (defs & ArchDefinePpcgr)
1165 Builder.defineMacro("_ARCH_PPCGR");
1166 if (defs & ArchDefinePpcsq)
1167 Builder.defineMacro("_ARCH_PPCSQ");
1168 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001169 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001170 if (defs & ArchDefine603)
1171 Builder.defineMacro("_ARCH_603");
1172 if (defs & ArchDefine604)
1173 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001174 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001175 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001176 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001177 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001178 if (defs & ArchDefinePwr5x)
1179 Builder.defineMacro("_ARCH_PWR5X");
1180 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001181 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001182 if (defs & ArchDefinePwr6x)
1183 Builder.defineMacro("_ARCH_PWR6X");
1184 if (defs & ArchDefinePwr7)
1185 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001186 if (defs & ArchDefinePwr8)
1187 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001188 if (defs & ArchDefineA2)
1189 Builder.defineMacro("_ARCH_A2");
1190 if (defs & ArchDefineA2q) {
1191 Builder.defineMacro("_ARCH_A2Q");
1192 Builder.defineMacro("_ARCH_QP");
1193 }
1194
1195 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1196 Builder.defineMacro("__bg__");
1197 Builder.defineMacro("__THW_BLUEGENE__");
1198 Builder.defineMacro("__bgq__");
1199 Builder.defineMacro("__TOS_BGQ__");
1200 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001201
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001202 if (HasVSX)
1203 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001204 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001205 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001206 if (HasP8Crypto)
1207 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001208 if (HasHTM)
1209 Builder.defineMacro("__HTM__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001210
Bill Schmidt38378a02013-02-01 20:23:10 +00001211 // FIXME: The following are not yet generated here by Clang, but are
1212 // generated by GCC:
1213 //
1214 // _SOFT_FLOAT_
1215 // __RECIP_PRECISION__
1216 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001217 // __RECIP__
1218 // __RECIPF__
1219 // __RSQRTE__
1220 // __RSQRTEF__
1221 // _SOFT_DOUBLE_
1222 // __NO_LWSYNC__
1223 // __HAVE_BSWAP__
1224 // __LONGDOUBLE128
1225 // __CMODEL_MEDIUM__
1226 // __CMODEL_LARGE__
1227 // _CALL_SYSV
1228 // _CALL_DARWIN
1229 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001230}
1231
1232void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1233 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1234 .Case("7400", true)
1235 .Case("g4", true)
1236 .Case("7450", true)
1237 .Case("g4+", true)
1238 .Case("970", true)
1239 .Case("g5", true)
1240 .Case("pwr6", true)
1241 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001242 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001243 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001244 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001245 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001246
1247 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001248 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1249 .Case("ppc64le", true)
1250 .Case("pwr8", true)
1251 .Default(false);
1252 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1253 .Case("ppc64le", true)
1254 .Case("pwr8", true)
1255 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001256 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1257 .Case("ppc64le", true)
1258 .Case("pwr8", true)
1259 .Case("pwr7", true)
1260 .Default(false);
1261 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1262 .Case("ppc64le", true)
1263 .Case("pwr8", true)
1264 .Case("pwr7", true)
1265 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001266 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1267 .Case("ppc64le", true)
1268 .Case("pwr8", true)
1269 .Default(false);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001270}
1271
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001272bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001273 return llvm::StringSwitch<bool>(Feature)
1274 .Case("powerpc", true)
1275 .Case("vsx", HasVSX)
1276 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001277 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001278 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001279 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001280 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001281 .Case("bpermd", HasBPERMD)
1282 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001283 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001284}
Chris Lattner17df24e2008-04-21 18:56:49 +00001285
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001286const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001287 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1288 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1289 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1290 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1291 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1292 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1293 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1294 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001295 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001296 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001297 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001298 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1299 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1300 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1301 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001302 "vrsave", "vscr",
1303 "spe_acc", "spefscr",
1304 "sfp"
1305};
Chris Lattner10a5b382007-01-29 05:24:35 +00001306
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001307void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001308 unsigned &NumNames) const {
1309 Names = GCCRegNames;
1310 NumNames = llvm::array_lengthof(GCCRegNames);
1311}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001312
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001313const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1314 // While some of these aliases do map to different registers
1315 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001316 { { "0" }, "r0" },
1317 { { "1"}, "r1" },
1318 { { "2" }, "r2" },
1319 { { "3" }, "r3" },
1320 { { "4" }, "r4" },
1321 { { "5" }, "r5" },
1322 { { "6" }, "r6" },
1323 { { "7" }, "r7" },
1324 { { "8" }, "r8" },
1325 { { "9" }, "r9" },
1326 { { "10" }, "r10" },
1327 { { "11" }, "r11" },
1328 { { "12" }, "r12" },
1329 { { "13" }, "r13" },
1330 { { "14" }, "r14" },
1331 { { "15" }, "r15" },
1332 { { "16" }, "r16" },
1333 { { "17" }, "r17" },
1334 { { "18" }, "r18" },
1335 { { "19" }, "r19" },
1336 { { "20" }, "r20" },
1337 { { "21" }, "r21" },
1338 { { "22" }, "r22" },
1339 { { "23" }, "r23" },
1340 { { "24" }, "r24" },
1341 { { "25" }, "r25" },
1342 { { "26" }, "r26" },
1343 { { "27" }, "r27" },
1344 { { "28" }, "r28" },
1345 { { "29" }, "r29" },
1346 { { "30" }, "r30" },
1347 { { "31" }, "r31" },
1348 { { "fr0" }, "f0" },
1349 { { "fr1" }, "f1" },
1350 { { "fr2" }, "f2" },
1351 { { "fr3" }, "f3" },
1352 { { "fr4" }, "f4" },
1353 { { "fr5" }, "f5" },
1354 { { "fr6" }, "f6" },
1355 { { "fr7" }, "f7" },
1356 { { "fr8" }, "f8" },
1357 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001358 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001359 { { "fr11" }, "f11" },
1360 { { "fr12" }, "f12" },
1361 { { "fr13" }, "f13" },
1362 { { "fr14" }, "f14" },
1363 { { "fr15" }, "f15" },
1364 { { "fr16" }, "f16" },
1365 { { "fr17" }, "f17" },
1366 { { "fr18" }, "f18" },
1367 { { "fr19" }, "f19" },
1368 { { "fr20" }, "f20" },
1369 { { "fr21" }, "f21" },
1370 { { "fr22" }, "f22" },
1371 { { "fr23" }, "f23" },
1372 { { "fr24" }, "f24" },
1373 { { "fr25" }, "f25" },
1374 { { "fr26" }, "f26" },
1375 { { "fr27" }, "f27" },
1376 { { "fr28" }, "f28" },
1377 { { "fr29" }, "f29" },
1378 { { "fr30" }, "f30" },
1379 { { "fr31" }, "f31" },
1380 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001381};
1382
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001383void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001384 unsigned &NumAliases) const {
1385 Aliases = GCCRegAliases;
1386 NumAliases = llvm::array_lengthof(GCCRegAliases);
1387}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001388
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001389class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001390public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001391 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001392 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001393
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001394 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001395 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001396 case llvm::Triple::FreeBSD:
1397 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001398 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001399 PtrDiffType = SignedInt;
1400 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001401 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001402 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001403 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001404 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001405
Roman Divacky3ffe7462012-03-13 19:20:17 +00001406 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1407 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001408 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001409 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001410
1411 // PPC32 supports atomics up to 4 bytes.
1412 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001413 }
1414
Craig Topper3164f332014-03-11 03:39:26 +00001415 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001416 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001417 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001418 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001419};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001420
Bill Schmidt778d3872013-07-26 01:36:11 +00001421// Note: ABI differences may eventually require us to have a separate
1422// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001423class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001424public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001425 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001426 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001427 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001428 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001429
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001430 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1431 DescriptionString = "e-m:e-i64:64-n32:64";
1432 ABI = "elfv2";
1433 } else {
1434 DescriptionString = "E-m:e-i64:64-n32:64";
1435 ABI = "elfv1";
1436 }
1437
1438 switch (getTriple().getOS()) {
1439 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001440 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001441 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001442 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001443 case llvm::Triple::NetBSD:
1444 IntMaxType = SignedLongLong;
1445 Int64Type = SignedLongLong;
1446 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001447 default:
1448 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001449 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001450
1451 // PPC64 supports atomics up to 8 bytes.
1452 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001453 }
Craig Topper3164f332014-03-11 03:39:26 +00001454 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001455 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001456 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001457 // PPC64 Linux-specifc ABI options.
1458 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001459 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001460 ABI = Name;
1461 return true;
1462 }
1463 return false;
1464 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001465};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001466
Roman Divacky965b0b72011-01-06 08:27:10 +00001467class DarwinPPC32TargetInfo :
1468 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001469public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001470 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1471 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001472 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001473 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001474 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001475 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001476 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001477 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001478 }
Craig Topper3164f332014-03-11 03:39:26 +00001479 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001480 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001481 }
1482};
1483
1484class DarwinPPC64TargetInfo :
1485 public DarwinTargetInfo<PPC64TargetInfo> {
1486public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001487 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1488 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001489 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001490 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001491 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001492 }
1493};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001494
Peter Collingbournec947aae2012-05-20 23:28:41 +00001495 static const unsigned NVPTXAddrSpaceMap[] = {
1496 1, // opencl_global
1497 3, // opencl_local
1498 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001499 // FIXME: generic has to be added to the target
1500 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001501 1, // cuda_device
1502 4, // cuda_constant
1503 3, // cuda_shared
1504 };
1505 class NVPTXTargetInfo : public TargetInfo {
1506 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001507 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001508
1509 // The GPU profiles supported by the NVPTX backend
1510 enum GPUKind {
1511 GK_NONE,
1512 GK_SM20,
1513 GK_SM21,
1514 GK_SM30,
1515 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001516 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001517 } GPU;
1518
Peter Collingbournec947aae2012-05-20 23:28:41 +00001519 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001520 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001521 BigEndian = false;
1522 TLSSupported = false;
1523 LongWidth = LongAlign = 64;
1524 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001525 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001526 // Define available target features
1527 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001528 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001529 // Set the default GPU to sm20
1530 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001531 }
Craig Topper3164f332014-03-11 03:39:26 +00001532 void getTargetDefines(const LangOptions &Opts,
1533 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001534 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001535 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001536 if (Opts.CUDAIsDevice) {
1537 // Set __CUDA_ARCH__ for the GPU specified.
1538 std::string CUDAArchCode;
1539 switch (GPU) {
1540 case GK_SM20:
1541 CUDAArchCode = "200";
1542 break;
1543 case GK_SM21:
1544 CUDAArchCode = "210";
1545 break;
1546 case GK_SM30:
1547 CUDAArchCode = "300";
1548 break;
1549 case GK_SM35:
1550 CUDAArchCode = "350";
1551 break;
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001552 case GK_SM37:
1553 CUDAArchCode = "370";
1554 break;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001555 default:
1556 llvm_unreachable("Unhandled target CPU");
1557 }
1558 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1559 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001560 }
Craig Topper3164f332014-03-11 03:39:26 +00001561 void getTargetBuiltins(const Builtin::Info *&Records,
1562 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001563 Records = BuiltinInfo;
1564 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001565 }
Craig Topper3164f332014-03-11 03:39:26 +00001566 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001567 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001568 }
Craig Topper3164f332014-03-11 03:39:26 +00001569
1570 void getGCCRegNames(const char * const *&Names,
1571 unsigned &NumNames) const override;
1572 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1573 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001574 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001575 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001576 NumAliases = 0;
1577 }
Eric Christopher917e9522014-11-18 22:36:15 +00001578 bool
1579 validateAsmConstraint(const char *&Name,
1580 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001581 switch (*Name) {
1582 default: return false;
1583 case 'c':
1584 case 'h':
1585 case 'r':
1586 case 'l':
1587 case 'f':
1588 case 'd':
1589 Info.setAllowsRegister();
1590 return true;
1591 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001592 }
Craig Topper3164f332014-03-11 03:39:26 +00001593 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001594 // FIXME: Is this really right?
1595 return "";
1596 }
Craig Topper3164f332014-03-11 03:39:26 +00001597 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001598 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001599 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001600 }
Craig Topper3164f332014-03-11 03:39:26 +00001601 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001602 GPU = llvm::StringSwitch<GPUKind>(Name)
1603 .Case("sm_20", GK_SM20)
1604 .Case("sm_21", GK_SM21)
1605 .Case("sm_30", GK_SM30)
1606 .Case("sm_35", GK_SM35)
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001607 .Case("sm_37", GK_SM37)
Reid Klecknerbbc01782014-12-03 21:53:36 +00001608 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001609
Reid Klecknerbbc01782014-12-03 21:53:36 +00001610 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001611 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001612 };
1613
1614 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1615#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1616#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1617 ALL_LANGUAGES },
1618#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001619 };
1620
1621 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1622 "r0"
1623 };
1624
1625 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1626 unsigned &NumNames) const {
1627 Names = GCCRegNames;
1628 NumNames = llvm::array_lengthof(GCCRegNames);
1629 }
1630
1631 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1632 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001633 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001634 PointerWidth = PointerAlign = 32;
Eli Bendersky13467172015-04-01 20:29:18 +00001635 SizeType = TargetInfo::UnsignedInt;
1636 PtrDiffType = TargetInfo::SignedInt;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001637 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001638 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001639 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001640 };
1641
1642 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1643 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001644 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001645 PointerWidth = PointerAlign = 64;
Eli Bendersky13467172015-04-01 20:29:18 +00001646 SizeType = TargetInfo::UnsignedLong;
1647 PtrDiffType = TargetInfo::SignedLong;
Eli Bendersky15f63422015-04-01 18:29:27 +00001648 IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001649 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001650 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001651 };
Eli Friedmand13b41e2012-10-12 23:32:00 +00001652
1653static const unsigned R600AddrSpaceMap[] = {
1654 1, // opencl_global
1655 3, // opencl_local
1656 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001657 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001658 1, // cuda_device
1659 2, // cuda_constant
1660 3 // cuda_shared
1661};
1662
Tom Stellarda96344b2014-08-21 13:58:40 +00001663// If you edit the description strings, make sure you update
1664// getPointerWidthV().
1665
Tom Stellardc74b1e02013-03-04 17:40:53 +00001666static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001667 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1668 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001669
1670static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001671 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1672 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001673
1674static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001675 "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 +00001676 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1677 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001678
Eli Friedmand13b41e2012-10-12 23:32:00 +00001679class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001680 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001681 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001682
Tom Stellardc74b1e02013-03-04 17:40:53 +00001683 /// \brief The GPU profiles supported by the R600 target.
1684 enum GPUKind {
1685 GK_NONE,
1686 GK_R600,
1687 GK_R600_DOUBLE_OPS,
1688 GK_R700,
1689 GK_R700_DOUBLE_OPS,
1690 GK_EVERGREEN,
1691 GK_EVERGREEN_DOUBLE_OPS,
1692 GK_NORTHERN_ISLANDS,
1693 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001694 GK_SOUTHERN_ISLANDS,
1695 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001696 } GPU;
1697
Jan Veselya3abd6d2015-05-01 17:38:13 +00001698 bool hasFP64;
1699
Eli Friedmand13b41e2012-10-12 23:32:00 +00001700public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001701 R600TargetInfo(const llvm::Triple &Triple)
Tom Stellardd99fb952015-01-28 15:38:44 +00001702 : TargetInfo(Triple) {
1703
1704 if (Triple.getArch() == llvm::Triple::amdgcn) {
1705 DescriptionString = DescriptionStringSI;
1706 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001707 hasFP64 = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001708 } else {
1709 DescriptionString = DescriptionStringR600;
1710 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001711 hasFP64 = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001712 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001713 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001714 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001715 }
1716
Tom Stellarda96344b2014-08-21 13:58:40 +00001717 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1718 if (GPU <= GK_CAYMAN)
1719 return 32;
1720
1721 switch(AddrSpace) {
1722 default:
1723 return 64;
1724 case 0:
1725 case 3:
1726 case 5:
1727 return 32;
1728 }
1729 }
1730
Craig Topper3164f332014-03-11 03:39:26 +00001731 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001732 return "";
1733 }
1734
Craig Topper3164f332014-03-11 03:39:26 +00001735 void getGCCRegNames(const char * const *&Names,
Tom Stellard7b1059b2015-04-14 14:36:56 +00001736 unsigned &NumNames) const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001737
Craig Topper3164f332014-03-11 03:39:26 +00001738 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1739 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001740 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001741 NumAliases = 0;
1742 }
1743
Craig Topper3164f332014-03-11 03:39:26 +00001744 bool validateAsmConstraint(const char *&Name,
1745 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001746 return true;
1747 }
1748
Craig Topper3164f332014-03-11 03:39:26 +00001749 void getTargetBuiltins(const Builtin::Info *&Records,
1750 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001751 Records = BuiltinInfo;
1752 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001753 }
1754
Craig Topper3164f332014-03-11 03:39:26 +00001755 void getTargetDefines(const LangOptions &Opts,
1756 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001757 Builder.defineMacro("__R600__");
Jan Veselya3abd6d2015-05-01 17:38:13 +00001758 if (hasFP64 && Opts.OpenCL) {
Tom Stellardfded50f2015-02-27 15:10:19 +00001759 Builder.defineMacro("cl_khr_fp64");
Jan Veselya3abd6d2015-05-01 17:38:13 +00001760 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001761 }
1762
Craig Topper3164f332014-03-11 03:39:26 +00001763 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001764 return TargetInfo::CharPtrBuiltinVaList;
1765 }
1766
Craig Topper3164f332014-03-11 03:39:26 +00001767 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001768 GPU = llvm::StringSwitch<GPUKind>(Name)
1769 .Case("r600" , GK_R600)
1770 .Case("rv610", GK_R600)
1771 .Case("rv620", GK_R600)
1772 .Case("rv630", GK_R600)
1773 .Case("rv635", GK_R600)
1774 .Case("rs780", GK_R600)
1775 .Case("rs880", GK_R600)
1776 .Case("rv670", GK_R600_DOUBLE_OPS)
1777 .Case("rv710", GK_R700)
1778 .Case("rv730", GK_R700)
1779 .Case("rv740", GK_R700_DOUBLE_OPS)
1780 .Case("rv770", GK_R700_DOUBLE_OPS)
1781 .Case("palm", GK_EVERGREEN)
1782 .Case("cedar", GK_EVERGREEN)
1783 .Case("sumo", GK_EVERGREEN)
1784 .Case("sumo2", GK_EVERGREEN)
1785 .Case("redwood", GK_EVERGREEN)
1786 .Case("juniper", GK_EVERGREEN)
1787 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1788 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1789 .Case("barts", GK_NORTHERN_ISLANDS)
1790 .Case("turks", GK_NORTHERN_ISLANDS)
1791 .Case("caicos", GK_NORTHERN_ISLANDS)
1792 .Case("cayman", GK_CAYMAN)
1793 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001794 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001795 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1796 .Case("verde", GK_SOUTHERN_ISLANDS)
1797 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001798 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001799 .Case("bonaire", GK_SEA_ISLANDS)
1800 .Case("kabini", GK_SEA_ISLANDS)
1801 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001802 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001803 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001804 .Default(GK_NONE);
1805
1806 if (GPU == GK_NONE) {
1807 return false;
1808 }
1809
1810 // Set the correct data layout
1811 switch (GPU) {
1812 case GK_NONE:
1813 case GK_R600:
1814 case GK_R700:
1815 case GK_EVERGREEN:
1816 case GK_NORTHERN_ISLANDS:
1817 DescriptionString = DescriptionStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001818 hasFP64 = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001819 break;
1820 case GK_R600_DOUBLE_OPS:
1821 case GK_R700_DOUBLE_OPS:
1822 case GK_EVERGREEN_DOUBLE_OPS:
1823 case GK_CAYMAN:
1824 DescriptionString = DescriptionStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001825 hasFP64 = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001826 break;
1827 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001828 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001829 DescriptionString = DescriptionStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001830 hasFP64 = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001831 break;
1832 }
1833
1834 return true;
1835 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001836};
1837
Matt Arsenault56f008d2014-06-24 20:45:01 +00001838const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1839#define BUILTIN(ID, TYPE, ATTRS) \
1840 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1841#include "clang/Basic/BuiltinsR600.def"
1842};
Tom Stellard7b1059b2015-04-14 14:36:56 +00001843const char * const R600TargetInfo::GCCRegNames[] = {
1844 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1845 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1846 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1847 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1848 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1849 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1850 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1851 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1852 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1853 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1854 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1855 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1856 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1857 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1858 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1859 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1860 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1861 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1862 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1863 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1864 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1865 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1866 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1867 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1868 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1869 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1870 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1871 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1872 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1873 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1874 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1875 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1876 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1877 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1878 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1879 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1880 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1881 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1882 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1883 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1884 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1885 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
1886 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
1887 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
1888 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
1889 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
1890 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
1891 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
1892 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
1893 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
1894};
1895
1896void R600TargetInfo::getGCCRegNames(const char * const *&Names,
1897 unsigned &NumNames) const {
1898 Names = GCCRegNames;
1899 NumNames = llvm::array_lengthof(GCCRegNames);
1900}
Matt Arsenault56f008d2014-06-24 20:45:01 +00001901
Eli Friedman3fd920a2008-08-20 02:34:37 +00001902// Namespace for x86 abstract base class
1903const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001904#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001905#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001906 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001907#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001908};
Eli Friedmanb5366062008-05-20 14:21:01 +00001909
Nuno Lopescfca1f02009-12-23 17:49:57 +00001910static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001911 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1912 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001913 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001914 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1915 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1916 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001917 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001918 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1919 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001920};
1921
Eric Christophercdd36352011-06-21 00:05:20 +00001922const TargetInfo::AddlRegName AddlRegNames[] = {
1923 { { "al", "ah", "eax", "rax" }, 0 },
1924 { { "bl", "bh", "ebx", "rbx" }, 3 },
1925 { { "cl", "ch", "ecx", "rcx" }, 2 },
1926 { { "dl", "dh", "edx", "rdx" }, 1 },
1927 { { "esi", "rsi" }, 4 },
1928 { { "edi", "rdi" }, 5 },
1929 { { "esp", "rsp" }, 7 },
1930 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001931};
1932
1933// X86 target abstract base class; x86-32 and x86-64 are very close, so
1934// most of the implementation can be shared.
1935class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001936 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001937 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001938 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001939 enum MMX3DNowEnum {
1940 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1941 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001942 enum XOPEnum {
1943 NoXOP,
1944 SSE4A,
1945 FMA4,
1946 XOP
1947 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001948
Eric Christophere1ddaf92010-04-02 23:50:19 +00001949 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001950 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001951 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001952 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001953 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001954 bool HasBMI;
1955 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001956 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001957 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001958 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001959 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001960 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001961 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001962 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001963 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001964 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1965 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001966 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001967 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001968
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001969 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1970 ///
1971 /// Each enumeration represents a particular CPU supported by Clang. These
1972 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1973 enum CPUKind {
1974 CK_Generic,
1975
1976 /// \name i386
1977 /// i386-generation processors.
1978 //@{
1979 CK_i386,
1980 //@}
1981
1982 /// \name i486
1983 /// i486-generation processors.
1984 //@{
1985 CK_i486,
1986 CK_WinChipC6,
1987 CK_WinChip2,
1988 CK_C3,
1989 //@}
1990
1991 /// \name i586
1992 /// i586-generation processors, P5 microarchitecture based.
1993 //@{
1994 CK_i586,
1995 CK_Pentium,
1996 CK_PentiumMMX,
1997 //@}
1998
1999 /// \name i686
2000 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2001 //@{
2002 CK_i686,
2003 CK_PentiumPro,
2004 CK_Pentium2,
2005 CK_Pentium3,
2006 CK_Pentium3M,
2007 CK_PentiumM,
2008 CK_C3_2,
2009
2010 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2011 /// Clang however has some logic to suport this.
2012 // FIXME: Warn, deprecate, and potentially remove this.
2013 CK_Yonah,
2014 //@}
2015
2016 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002017 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002018 //@{
2019 CK_Pentium4,
2020 CK_Pentium4M,
2021 CK_Prescott,
2022 CK_Nocona,
2023 //@}
2024
2025 /// \name Core
2026 /// Core microarchitecture based processors.
2027 //@{
2028 CK_Core2,
2029
2030 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2031 /// codename which GCC no longer accepts as an option to -march, but Clang
2032 /// has some logic for recognizing it.
2033 // FIXME: Warn, deprecate, and potentially remove this.
2034 CK_Penryn,
2035 //@}
2036
2037 /// \name Atom
2038 /// Atom processors
2039 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002040 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002041 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002042 //@}
2043
2044 /// \name Nehalem
2045 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002046 CK_Nehalem,
2047
2048 /// \name Westmere
2049 /// Westmere microarchitecture based processors.
2050 CK_Westmere,
2051
2052 /// \name Sandy Bridge
2053 /// Sandy Bridge microarchitecture based processors.
2054 CK_SandyBridge,
2055
2056 /// \name Ivy Bridge
2057 /// Ivy Bridge microarchitecture based processors.
2058 CK_IvyBridge,
2059
2060 /// \name Haswell
2061 /// Haswell microarchitecture based processors.
2062 CK_Haswell,
2063
2064 /// \name Broadwell
2065 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002066 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002067
2068 /// \name Skylake
2069 /// Skylake microarchitecture based processors.
2070 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002071
Craig Topper449314e2013-08-20 07:09:39 +00002072 /// \name Knights Landing
2073 /// Knights Landing processor.
2074 CK_KNL,
2075
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002076 /// \name K6
2077 /// K6 architecture processors.
2078 //@{
2079 CK_K6,
2080 CK_K6_2,
2081 CK_K6_3,
2082 //@}
2083
2084 /// \name K7
2085 /// K7 architecture processors.
2086 //@{
2087 CK_Athlon,
2088 CK_AthlonThunderbird,
2089 CK_Athlon4,
2090 CK_AthlonXP,
2091 CK_AthlonMP,
2092 //@}
2093
2094 /// \name K8
2095 /// K8 architecture processors.
2096 //@{
2097 CK_Athlon64,
2098 CK_Athlon64SSE3,
2099 CK_AthlonFX,
2100 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002101 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002102 CK_Opteron,
2103 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002104 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002105 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002106
Benjamin Kramer569f2152012-01-10 11:50:18 +00002107 /// \name Bobcat
2108 /// Bobcat architecture processors.
2109 //@{
2110 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002111 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002112 //@}
2113
2114 /// \name Bulldozer
2115 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002116 //@{
2117 CK_BDVER1,
2118 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002119 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002120 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002121 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002122
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002123 /// This specification is deprecated and will be removed in the future.
2124 /// Users should prefer \see CK_K8.
2125 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002126 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002127 CK_x86_64,
2128 //@}
2129
2130 /// \name Geode
2131 /// Geode processors.
2132 //@{
2133 CK_Geode
2134 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002135 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002136
Rafael Espindolaeb265472013-08-21 21:59:03 +00002137 enum FPMathKind {
2138 FP_Default,
2139 FP_SSE,
2140 FP_387
2141 } FPMath;
2142
Eli Friedman3fd920a2008-08-20 02:34:37 +00002143public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002144 X86TargetInfo(const llvm::Triple &Triple)
2145 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002146 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002147 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2148 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2149 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2150 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2151 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2152 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002153 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002154 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002155 }
Craig Topper3164f332014-03-11 03:39:26 +00002156 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002157 // X87 evaluates with 80 bits "long double" precision.
2158 return SSELevel == NoSSE ? 2 : 0;
2159 }
Craig Topper3164f332014-03-11 03:39:26 +00002160 void getTargetBuiltins(const Builtin::Info *&Records,
2161 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002162 Records = BuiltinInfo;
2163 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002164 }
Craig Topper3164f332014-03-11 03:39:26 +00002165 void getGCCRegNames(const char * const *&Names,
2166 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002167 Names = GCCRegNames;
2168 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002169 }
Craig Topper3164f332014-03-11 03:39:26 +00002170 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2171 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002172 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002173 NumAliases = 0;
2174 }
Craig Topper3164f332014-03-11 03:39:26 +00002175 void getGCCAddlRegNames(const AddlRegName *&Names,
2176 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002177 Names = AddlRegNames;
2178 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002179 }
Craig Topper3164f332014-03-11 03:39:26 +00002180 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002181 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002182
Akira Hatanaka974131e2014-09-18 18:17:18 +00002183 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2184
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002185 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2186
Akira Hatanaka974131e2014-09-18 18:17:18 +00002187 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2188
Craig Topper3164f332014-03-11 03:39:26 +00002189 std::string convertConstraint(const char *&Constraint) const override;
2190 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002191 return "~{dirflag},~{fpsr},~{flags}";
2192 }
Craig Topper3164f332014-03-11 03:39:26 +00002193 void getTargetDefines(const LangOptions &Opts,
2194 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002195 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2196 bool Enabled);
2197 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2198 bool Enabled);
2199 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2200 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002201 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2202 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002203 setFeatureEnabledImpl(Features, Name, Enabled);
2204 }
2205 // This exists purely to cut down on the number of virtual calls in
2206 // getDefaultFeatures which calls this repeatedly.
2207 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2208 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002209 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2210 bool hasFeature(StringRef Feature) const override;
2211 bool handleTargetFeatures(std::vector<std::string> &Features,
2212 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002213 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002214 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002215 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002216 else if (getTriple().getArch() == llvm::Triple::x86 &&
2217 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002218 return "no-mmx";
2219 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002220 }
Craig Topper3164f332014-03-11 03:39:26 +00002221 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002222 CPU = llvm::StringSwitch<CPUKind>(Name)
2223 .Case("i386", CK_i386)
2224 .Case("i486", CK_i486)
2225 .Case("winchip-c6", CK_WinChipC6)
2226 .Case("winchip2", CK_WinChip2)
2227 .Case("c3", CK_C3)
2228 .Case("i586", CK_i586)
2229 .Case("pentium", CK_Pentium)
2230 .Case("pentium-mmx", CK_PentiumMMX)
2231 .Case("i686", CK_i686)
2232 .Case("pentiumpro", CK_PentiumPro)
2233 .Case("pentium2", CK_Pentium2)
2234 .Case("pentium3", CK_Pentium3)
2235 .Case("pentium3m", CK_Pentium3M)
2236 .Case("pentium-m", CK_PentiumM)
2237 .Case("c3-2", CK_C3_2)
2238 .Case("yonah", CK_Yonah)
2239 .Case("pentium4", CK_Pentium4)
2240 .Case("pentium4m", CK_Pentium4M)
2241 .Case("prescott", CK_Prescott)
2242 .Case("nocona", CK_Nocona)
2243 .Case("core2", CK_Core2)
2244 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002245 .Case("bonnell", CK_Bonnell)
2246 .Case("atom", CK_Bonnell) // Legacy name.
2247 .Case("silvermont", CK_Silvermont)
2248 .Case("slm", CK_Silvermont) // Legacy name.
2249 .Case("nehalem", CK_Nehalem)
2250 .Case("corei7", CK_Nehalem) // Legacy name.
2251 .Case("westmere", CK_Westmere)
2252 .Case("sandybridge", CK_SandyBridge)
2253 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2254 .Case("ivybridge", CK_IvyBridge)
2255 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2256 .Case("haswell", CK_Haswell)
2257 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002258 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002259 .Case("skylake", CK_Skylake)
2260 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002261 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002262 .Case("k6", CK_K6)
2263 .Case("k6-2", CK_K6_2)
2264 .Case("k6-3", CK_K6_3)
2265 .Case("athlon", CK_Athlon)
2266 .Case("athlon-tbird", CK_AthlonThunderbird)
2267 .Case("athlon-4", CK_Athlon4)
2268 .Case("athlon-xp", CK_AthlonXP)
2269 .Case("athlon-mp", CK_AthlonMP)
2270 .Case("athlon64", CK_Athlon64)
2271 .Case("athlon64-sse3", CK_Athlon64SSE3)
2272 .Case("athlon-fx", CK_AthlonFX)
2273 .Case("k8", CK_K8)
2274 .Case("k8-sse3", CK_K8SSE3)
2275 .Case("opteron", CK_Opteron)
2276 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002277 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002278 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002279 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002280 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002281 .Case("bdver1", CK_BDVER1)
2282 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002283 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002284 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002285 .Case("x86-64", CK_x86_64)
2286 .Case("geode", CK_Geode)
2287 .Default(CK_Generic);
2288
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002289 // Perform any per-CPU checks necessary to determine if this CPU is
2290 // acceptable.
2291 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2292 // invalid without explaining *why*.
2293 switch (CPU) {
2294 case CK_Generic:
2295 // No processor selected!
2296 return false;
2297
2298 case CK_i386:
2299 case CK_i486:
2300 case CK_WinChipC6:
2301 case CK_WinChip2:
2302 case CK_C3:
2303 case CK_i586:
2304 case CK_Pentium:
2305 case CK_PentiumMMX:
2306 case CK_i686:
2307 case CK_PentiumPro:
2308 case CK_Pentium2:
2309 case CK_Pentium3:
2310 case CK_Pentium3M:
2311 case CK_PentiumM:
2312 case CK_Yonah:
2313 case CK_C3_2:
2314 case CK_Pentium4:
2315 case CK_Pentium4M:
2316 case CK_Prescott:
2317 case CK_K6:
2318 case CK_K6_2:
2319 case CK_K6_3:
2320 case CK_Athlon:
2321 case CK_AthlonThunderbird:
2322 case CK_Athlon4:
2323 case CK_AthlonXP:
2324 case CK_AthlonMP:
2325 case CK_Geode:
2326 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002327 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002328 return false;
2329
2330 // Fallthrough
2331 case CK_Nocona:
2332 case CK_Core2:
2333 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002334 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002335 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002336 case CK_Nehalem:
2337 case CK_Westmere:
2338 case CK_SandyBridge:
2339 case CK_IvyBridge:
2340 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002341 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002342 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002343 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002344 case CK_Athlon64:
2345 case CK_Athlon64SSE3:
2346 case CK_AthlonFX:
2347 case CK_K8:
2348 case CK_K8SSE3:
2349 case CK_Opteron:
2350 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002351 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002352 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002353 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002354 case CK_BDVER1:
2355 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002356 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002357 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002358 case CK_x86_64:
2359 return true;
2360 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002361 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002362 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002363
Craig Topper3164f332014-03-11 03:39:26 +00002364 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002365
Craig Topper3164f332014-03-11 03:39:26 +00002366 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002367 // We accept all non-ARM calling conventions
2368 return (CC == CC_X86ThisCall ||
2369 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002370 CC == CC_X86StdCall ||
2371 CC == CC_X86VectorCall ||
2372 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002373 CC == CC_X86Pascal ||
2374 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002375 }
2376
Craig Topper3164f332014-03-11 03:39:26 +00002377 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002378 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002379 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002380
2381 bool hasSjLjLowering() const override {
2382 return true;
2383 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002384};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002385
Rafael Espindolaeb265472013-08-21 21:59:03 +00002386bool X86TargetInfo::setFPMath(StringRef Name) {
2387 if (Name == "387") {
2388 FPMath = FP_387;
2389 return true;
2390 }
2391 if (Name == "sse") {
2392 FPMath = FP_SSE;
2393 return true;
2394 }
2395 return false;
2396}
2397
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002398void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002399 // FIXME: This *really* should not be here.
2400
2401 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002402 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002403 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002404
Chandler Carruth212334f2011-09-28 08:55:37 +00002405 switch (CPU) {
2406 case CK_Generic:
2407 case CK_i386:
2408 case CK_i486:
2409 case CK_i586:
2410 case CK_Pentium:
2411 case CK_i686:
2412 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002413 break;
2414 case CK_PentiumMMX:
2415 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002416 case CK_K6:
2417 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002418 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002419 break;
2420 case CK_Pentium3:
2421 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002422 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002423 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002424 break;
2425 case CK_PentiumM:
2426 case CK_Pentium4:
2427 case CK_Pentium4M:
2428 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002429 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002430 break;
2431 case CK_Yonah:
2432 case CK_Prescott:
2433 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002434 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002435 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002436 break;
2437 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002438 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002439 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002440 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002441 break;
2442 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002443 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002444 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002445 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002446 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002447 setFeatureEnabledImpl(Features, "avx512f", true);
2448 setFeatureEnabledImpl(Features, "avx512cd", true);
2449 setFeatureEnabledImpl(Features, "avx512dq", true);
2450 setFeatureEnabledImpl(Features, "avx512bw", true);
2451 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002452 // FALLTHROUGH
2453 case CK_Broadwell:
2454 setFeatureEnabledImpl(Features, "rdseed", true);
2455 setFeatureEnabledImpl(Features, "adx", true);
2456 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002457 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002458 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002459 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002460 setFeatureEnabledImpl(Features, "bmi", true);
2461 setFeatureEnabledImpl(Features, "bmi2", true);
2462 setFeatureEnabledImpl(Features, "rtm", true);
2463 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002464 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002465 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002466 setFeatureEnabledImpl(Features, "rdrnd", true);
2467 setFeatureEnabledImpl(Features, "f16c", true);
2468 setFeatureEnabledImpl(Features, "fsgsbase", true);
2469 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002470 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002471 setFeatureEnabledImpl(Features, "avx", true);
2472 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002473 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002474 case CK_Silvermont:
2475 setFeatureEnabledImpl(Features, "aes", true);
2476 setFeatureEnabledImpl(Features, "pclmul", true);
2477 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002478 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002479 setFeatureEnabledImpl(Features, "sse4.2", true);
2480 setFeatureEnabledImpl(Features, "cx16", true);
2481 break;
2482 case CK_KNL:
2483 setFeatureEnabledImpl(Features, "avx512f", true);
2484 setFeatureEnabledImpl(Features, "avx512cd", true);
2485 setFeatureEnabledImpl(Features, "avx512er", true);
2486 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002487 setFeatureEnabledImpl(Features, "rdseed", true);
2488 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002489 setFeatureEnabledImpl(Features, "lzcnt", true);
2490 setFeatureEnabledImpl(Features, "bmi", true);
2491 setFeatureEnabledImpl(Features, "bmi2", true);
2492 setFeatureEnabledImpl(Features, "rtm", true);
2493 setFeatureEnabledImpl(Features, "fma", true);
2494 setFeatureEnabledImpl(Features, "rdrnd", true);
2495 setFeatureEnabledImpl(Features, "f16c", true);
2496 setFeatureEnabledImpl(Features, "fsgsbase", true);
2497 setFeatureEnabledImpl(Features, "aes", true);
2498 setFeatureEnabledImpl(Features, "pclmul", true);
2499 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002500 break;
2501 case CK_K6_2:
2502 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002503 case CK_WinChip2:
2504 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002505 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002506 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002507 case CK_Athlon:
2508 case CK_AthlonThunderbird:
2509 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002510 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002511 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002512 case CK_Athlon4:
2513 case CK_AthlonXP:
2514 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002515 setFeatureEnabledImpl(Features, "sse", true);
2516 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002517 break;
2518 case CK_K8:
2519 case CK_Opteron:
2520 case CK_Athlon64:
2521 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002522 setFeatureEnabledImpl(Features, "sse2", true);
2523 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002524 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002525 case CK_AMDFAM10:
2526 setFeatureEnabledImpl(Features, "sse4a", true);
2527 setFeatureEnabledImpl(Features, "lzcnt", true);
2528 setFeatureEnabledImpl(Features, "popcnt", true);
2529 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002530 case CK_K8SSE3:
2531 case CK_OpteronSSE3:
2532 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002533 setFeatureEnabledImpl(Features, "sse3", true);
2534 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002535 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002536 case CK_BTVER2:
2537 setFeatureEnabledImpl(Features, "avx", true);
2538 setFeatureEnabledImpl(Features, "aes", true);
2539 setFeatureEnabledImpl(Features, "pclmul", true);
2540 setFeatureEnabledImpl(Features, "bmi", true);
2541 setFeatureEnabledImpl(Features, "f16c", true);
2542 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002543 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002544 setFeatureEnabledImpl(Features, "ssse3", true);
2545 setFeatureEnabledImpl(Features, "sse4a", true);
2546 setFeatureEnabledImpl(Features, "lzcnt", true);
2547 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002548 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002549 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002550 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002551 case CK_BDVER4:
2552 setFeatureEnabledImpl(Features, "avx2", true);
2553 setFeatureEnabledImpl(Features, "bmi2", true);
2554 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002555 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002556 setFeatureEnabledImpl(Features, "fsgsbase", true);
2557 // FALLTHROUGH
2558 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002559 setFeatureEnabledImpl(Features, "bmi", true);
2560 setFeatureEnabledImpl(Features, "fma", true);
2561 setFeatureEnabledImpl(Features, "f16c", true);
2562 setFeatureEnabledImpl(Features, "tbm", true);
2563 // FALLTHROUGH
2564 case CK_BDVER1:
2565 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002566 setFeatureEnabledImpl(Features, "xop", true);
2567 setFeatureEnabledImpl(Features, "lzcnt", true);
2568 setFeatureEnabledImpl(Features, "aes", true);
2569 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002570 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002571 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002572 break;
Eli Friedman33465822011-07-08 23:31:17 +00002573 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002574}
2575
Rafael Espindolae62e2792013-08-20 13:44:29 +00002576void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002577 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002578 if (Enabled) {
2579 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002580 case AVX512F:
2581 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002582 case AVX2:
2583 Features["avx2"] = true;
2584 case AVX:
2585 Features["avx"] = true;
2586 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002587 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002588 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002589 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002590 case SSSE3:
2591 Features["ssse3"] = true;
2592 case SSE3:
2593 Features["sse3"] = true;
2594 case SSE2:
2595 Features["sse2"] = true;
2596 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002597 Features["sse"] = true;
2598 case NoSSE:
2599 break;
2600 }
2601 return;
2602 }
2603
2604 switch (Level) {
2605 case NoSSE:
2606 case SSE1:
2607 Features["sse"] = false;
2608 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002609 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2610 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002611 case SSE3:
2612 Features["sse3"] = false;
2613 setXOPLevel(Features, NoXOP, false);
2614 case SSSE3:
2615 Features["ssse3"] = false;
2616 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002617 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002618 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002619 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002620 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002621 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002622 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002623 case AVX2:
2624 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002625 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002626 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002627 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2628 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002629 }
2630}
2631
2632void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002633 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002634 if (Enabled) {
2635 switch (Level) {
2636 case AMD3DNowAthlon:
2637 Features["3dnowa"] = true;
2638 case AMD3DNow:
2639 Features["3dnow"] = true;
2640 case MMX:
2641 Features["mmx"] = true;
2642 case NoMMX3DNow:
2643 break;
2644 }
2645 return;
2646 }
2647
2648 switch (Level) {
2649 case NoMMX3DNow:
2650 case MMX:
2651 Features["mmx"] = false;
2652 case AMD3DNow:
2653 Features["3dnow"] = false;
2654 case AMD3DNowAthlon:
2655 Features["3dnowa"] = false;
2656 }
2657}
2658
2659void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002660 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002661 if (Enabled) {
2662 switch (Level) {
2663 case XOP:
2664 Features["xop"] = true;
2665 case FMA4:
2666 Features["fma4"] = true;
2667 setSSELevel(Features, AVX, true);
2668 case SSE4A:
2669 Features["sse4a"] = true;
2670 setSSELevel(Features, SSE3, true);
2671 case NoXOP:
2672 break;
2673 }
2674 return;
2675 }
2676
2677 switch (Level) {
2678 case NoXOP:
2679 case SSE4A:
2680 Features["sse4a"] = false;
2681 case FMA4:
2682 Features["fma4"] = false;
2683 case XOP:
2684 Features["xop"] = false;
2685 }
2686}
2687
Craig Topper86d79ef2013-09-17 04:51:29 +00002688void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2689 StringRef Name, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002690 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002691
Craig Topper29561122013-09-19 01:13:07 +00002692 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002693 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002694 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002695 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002696 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002697 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002698 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002699 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002700 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002701 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002702 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002703 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002704 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002705 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002706 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002707 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002708 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002709 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002710 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002711 if (Enabled)
2712 setSSELevel(Features, SSE2, Enabled);
2713 } else if (Name == "pclmul") {
2714 if (Enabled)
2715 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002716 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002717 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002718 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002719 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002720 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002721 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002722 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2723 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002724 if (Enabled)
2725 setSSELevel(Features, AVX512F, Enabled);
2726 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002727 if (Enabled)
2728 setSSELevel(Features, AVX, Enabled);
2729 } else if (Name == "fma4") {
2730 setXOPLevel(Features, FMA4, Enabled);
2731 } else if (Name == "xop") {
2732 setXOPLevel(Features, XOP, Enabled);
2733 } else if (Name == "sse4a") {
2734 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002735 } else if (Name == "f16c") {
2736 if (Enabled)
2737 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002738 } else if (Name == "sha") {
2739 if (Enabled)
2740 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002741 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002742}
2743
Eric Christopher3ff21b32013-10-16 21:26:26 +00002744/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002745/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002746bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002747 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002748 // Remember the maximum enabled sselevel.
2749 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2750 // Ignore disabled features.
2751 if (Features[i][0] == '-')
2752 continue;
2753
Benjamin Kramer27402c62012-03-05 15:10:44 +00002754 StringRef Feature = StringRef(Features[i]).substr(1);
2755
2756 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002757 HasAES = true;
2758 continue;
2759 }
2760
Craig Topper3f122a72012-05-31 05:18:48 +00002761 if (Feature == "pclmul") {
2762 HasPCLMUL = true;
2763 continue;
2764 }
2765
Benjamin Kramer27402c62012-03-05 15:10:44 +00002766 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002767 HasLZCNT = true;
2768 continue;
2769 }
2770
Rafael Espindola89049822013-08-23 20:21:37 +00002771 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002772 HasRDRND = true;
2773 continue;
2774 }
2775
Craig Topper8c7f2512014-11-03 06:51:41 +00002776 if (Feature == "fsgsbase") {
2777 HasFSGSBASE = true;
2778 continue;
2779 }
2780
Benjamin Kramer27402c62012-03-05 15:10:44 +00002781 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002782 HasBMI = true;
2783 continue;
2784 }
2785
Benjamin Kramer27402c62012-03-05 15:10:44 +00002786 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002787 HasBMI2 = true;
2788 continue;
2789 }
2790
Benjamin Kramer27402c62012-03-05 15:10:44 +00002791 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002792 HasPOPCNT = true;
2793 continue;
2794 }
2795
Michael Liao625a8752012-11-10 05:17:46 +00002796 if (Feature == "rtm") {
2797 HasRTM = true;
2798 continue;
2799 }
2800
Michael Liao74f4eaf2013-03-26 17:52:08 +00002801 if (Feature == "prfchw") {
2802 HasPRFCHW = true;
2803 continue;
2804 }
2805
Michael Liaoffaae352013-03-29 05:17:55 +00002806 if (Feature == "rdseed") {
2807 HasRDSEED = true;
2808 continue;
2809 }
2810
Robert Khasanov50e6f582014-09-19 09:53:48 +00002811 if (Feature == "adx") {
2812 HasADX = true;
2813 continue;
2814 }
2815
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002816 if (Feature == "tbm") {
2817 HasTBM = true;
2818 continue;
2819 }
2820
Craig Topperbba778b2012-06-03 21:46:30 +00002821 if (Feature == "fma") {
2822 HasFMA = true;
2823 continue;
2824 }
2825
Manman Rena45358c2012-10-11 00:59:55 +00002826 if (Feature == "f16c") {
2827 HasF16C = true;
2828 continue;
2829 }
2830
Craig Topper679b53a2013-08-21 05:29:10 +00002831 if (Feature == "avx512cd") {
2832 HasAVX512CD = true;
2833 continue;
2834 }
2835
2836 if (Feature == "avx512er") {
2837 HasAVX512ER = true;
2838 continue;
2839 }
2840
2841 if (Feature == "avx512pf") {
2842 HasAVX512PF = true;
2843 continue;
2844 }
2845
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002846 if (Feature == "avx512dq") {
2847 HasAVX512DQ = true;
2848 continue;
2849 }
2850
2851 if (Feature == "avx512bw") {
2852 HasAVX512BW = true;
2853 continue;
2854 }
2855
2856 if (Feature == "avx512vl") {
2857 HasAVX512VL = true;
2858 continue;
2859 }
2860
Ben Langmuir58078d02013-09-19 13:22:04 +00002861 if (Feature == "sha") {
2862 HasSHA = true;
2863 continue;
2864 }
2865
Nick Lewycky50e8f482013-10-05 20:14:27 +00002866 if (Feature == "cx16") {
2867 HasCX16 = true;
2868 continue;
2869 }
2870
Daniel Dunbar979586e2009-11-11 09:38:56 +00002871 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002872 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002873 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002874 .Case("avx2", AVX2)
2875 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002876 .Case("sse4.2", SSE42)
2877 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002878 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002879 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002880 .Case("sse2", SSE2)
2881 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002882 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002883 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002884
Eli Friedman33465822011-07-08 23:31:17 +00002885 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002886 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002887 .Case("3dnowa", AMD3DNowAthlon)
2888 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002889 .Case("mmx", MMX)
2890 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002891 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002892
2893 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2894 .Case("xop", XOP)
2895 .Case("fma4", FMA4)
2896 .Case("sse4a", SSE4A)
2897 .Default(NoXOP);
2898 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002899 }
Eli Friedman33465822011-07-08 23:31:17 +00002900
Craig Topper7481d8a2013-09-10 06:55:47 +00002901 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2902 // Can't do this earlier because we need to be able to explicitly enable
2903 // popcnt and still disable sse4.2.
2904 if (!HasPOPCNT && SSELevel >= SSE42 &&
2905 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2906 HasPOPCNT = true;
2907 Features.push_back("+popcnt");
2908 }
2909
Yunzhong Gao61089362013-10-16 19:07:02 +00002910 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2911 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2912 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2913 HasPRFCHW = true;
2914 Features.push_back("+prfchw");
2915 }
2916
Rafael Espindolaeb265472013-08-21 21:59:03 +00002917 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2918 // matches the selected sse level.
2919 if (FPMath == FP_SSE && SSELevel < SSE1) {
2920 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2921 return false;
2922 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2923 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2924 return false;
2925 }
2926
Eli Friedman33465822011-07-08 23:31:17 +00002927 // Don't tell the backend if we're turning off mmx; it will end up disabling
2928 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002929 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2930 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002931 std::vector<std::string>::iterator it;
2932 it = std::find(Features.begin(), Features.end(), "-mmx");
2933 if (it != Features.end())
2934 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002935 else if (SSELevel > NoSSE)
2936 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002937 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002938}
Chris Lattnerecd49032009-03-02 22:27:17 +00002939
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002940/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2941/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002942void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002943 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002944 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002945 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002946 Builder.defineMacro("__amd64__");
2947 Builder.defineMacro("__amd64");
2948 Builder.defineMacro("__x86_64");
2949 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002950 if (getTriple().getArchName() == "x86_64h") {
2951 Builder.defineMacro("__x86_64h");
2952 Builder.defineMacro("__x86_64h__");
2953 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002954 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002955 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002956 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002957
Chris Lattnerecd49032009-03-02 22:27:17 +00002958 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002959 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2960 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002961 switch (CPU) {
2962 case CK_Generic:
2963 break;
2964 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002965 // The rest are coming from the i386 define above.
2966 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002967 break;
2968 case CK_i486:
2969 case CK_WinChipC6:
2970 case CK_WinChip2:
2971 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002972 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002973 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002974 case CK_PentiumMMX:
2975 Builder.defineMacro("__pentium_mmx__");
2976 Builder.defineMacro("__tune_pentium_mmx__");
2977 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002978 case CK_i586:
2979 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002980 defineCPUMacros(Builder, "i586");
2981 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002982 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002983 case CK_Pentium3:
2984 case CK_Pentium3M:
2985 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002986 Builder.defineMacro("__tune_pentium3__");
2987 // Fallthrough
2988 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002989 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002990 Builder.defineMacro("__tune_pentium2__");
2991 // Fallthrough
2992 case CK_PentiumPro:
2993 Builder.defineMacro("__tune_i686__");
2994 Builder.defineMacro("__tune_pentiumpro__");
2995 // Fallthrough
2996 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002997 Builder.defineMacro("__i686");
2998 Builder.defineMacro("__i686__");
2999 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3000 Builder.defineMacro("__pentiumpro");
3001 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003002 break;
3003 case CK_Pentium4:
3004 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003005 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003006 break;
3007 case CK_Yonah:
3008 case CK_Prescott:
3009 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003010 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003011 break;
3012 case CK_Core2:
3013 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003014 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003015 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003016 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003017 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003018 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003019 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003020 defineCPUMacros(Builder, "slm");
3021 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003022 case CK_Nehalem:
3023 case CK_Westmere:
3024 case CK_SandyBridge:
3025 case CK_IvyBridge:
3026 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003027 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003028 // FIXME: Historically, we defined this legacy name, it would be nice to
3029 // remove it at some point. We've never exposed fine-grained names for
3030 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003031 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003032 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003033 case CK_Skylake:
3034 // FIXME: Historically, we defined this legacy name, it would be nice to
3035 // remove it at some point. This is the only fine-grained CPU macro in the
3036 // main intel CPU line, and it would be better to not have these and force
3037 // people to use ISA macros.
3038 defineCPUMacros(Builder, "skx");
3039 break;
Craig Topper449314e2013-08-20 07:09:39 +00003040 case CK_KNL:
3041 defineCPUMacros(Builder, "knl");
3042 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003043 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003044 Builder.defineMacro("__k6_2__");
3045 Builder.defineMacro("__tune_k6_2__");
3046 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003047 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003048 if (CPU != CK_K6_2) { // In case of fallthrough
3049 // FIXME: GCC may be enabling these in cases where some other k6
3050 // architecture is specified but -m3dnow is explicitly provided. The
3051 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003052 Builder.defineMacro("__k6_3__");
3053 Builder.defineMacro("__tune_k6_3__");
3054 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003055 // Fallthrough
3056 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003057 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003058 break;
3059 case CK_Athlon:
3060 case CK_AthlonThunderbird:
3061 case CK_Athlon4:
3062 case CK_AthlonXP:
3063 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003064 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003065 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003066 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003067 Builder.defineMacro("__tune_athlon_sse__");
3068 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003069 break;
3070 case CK_K8:
3071 case CK_K8SSE3:
3072 case CK_x86_64:
3073 case CK_Opteron:
3074 case CK_OpteronSSE3:
3075 case CK_Athlon64:
3076 case CK_Athlon64SSE3:
3077 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003078 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003079 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003080 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003081 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003082 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003083 case CK_BTVER1:
3084 defineCPUMacros(Builder, "btver1");
3085 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003086 case CK_BTVER2:
3087 defineCPUMacros(Builder, "btver2");
3088 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003089 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003090 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003091 break;
3092 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003093 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003094 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003095 case CK_BDVER3:
3096 defineCPUMacros(Builder, "bdver3");
3097 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003098 case CK_BDVER4:
3099 defineCPUMacros(Builder, "bdver4");
3100 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003101 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003102 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003103 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003104 }
Chris Lattner96e43572009-03-02 22:40:39 +00003105
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003106 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003107 Builder.defineMacro("__REGISTER_PREFIX__", "");
3108
Chris Lattner6df41af2009-04-19 17:32:33 +00003109 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3110 // functions in glibc header files that use FP Stack inline asm which the
3111 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003112 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003113
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003114 if (HasAES)
3115 Builder.defineMacro("__AES__");
3116
Craig Topper3f122a72012-05-31 05:18:48 +00003117 if (HasPCLMUL)
3118 Builder.defineMacro("__PCLMUL__");
3119
Craig Topper22967d42011-12-25 05:06:45 +00003120 if (HasLZCNT)
3121 Builder.defineMacro("__LZCNT__");
3122
Benjamin Kramer1e250392012-07-07 09:39:18 +00003123 if (HasRDRND)
3124 Builder.defineMacro("__RDRND__");
3125
Craig Topper8c7f2512014-11-03 06:51:41 +00003126 if (HasFSGSBASE)
3127 Builder.defineMacro("__FSGSBASE__");
3128
Craig Topper22967d42011-12-25 05:06:45 +00003129 if (HasBMI)
3130 Builder.defineMacro("__BMI__");
3131
3132 if (HasBMI2)
3133 Builder.defineMacro("__BMI2__");
3134
Craig Topper1de83482011-12-29 16:10:46 +00003135 if (HasPOPCNT)
3136 Builder.defineMacro("__POPCNT__");
3137
Michael Liao625a8752012-11-10 05:17:46 +00003138 if (HasRTM)
3139 Builder.defineMacro("__RTM__");
3140
Michael Liao74f4eaf2013-03-26 17:52:08 +00003141 if (HasPRFCHW)
3142 Builder.defineMacro("__PRFCHW__");
3143
Michael Liaoffaae352013-03-29 05:17:55 +00003144 if (HasRDSEED)
3145 Builder.defineMacro("__RDSEED__");
3146
Robert Khasanov50e6f582014-09-19 09:53:48 +00003147 if (HasADX)
3148 Builder.defineMacro("__ADX__");
3149
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003150 if (HasTBM)
3151 Builder.defineMacro("__TBM__");
3152
Rafael Espindolae62e2792013-08-20 13:44:29 +00003153 switch (XOPLevel) {
3154 case XOP:
3155 Builder.defineMacro("__XOP__");
3156 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003157 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003158 case SSE4A:
3159 Builder.defineMacro("__SSE4A__");
3160 case NoXOP:
3161 break;
3162 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003163
Craig Topperbba778b2012-06-03 21:46:30 +00003164 if (HasFMA)
3165 Builder.defineMacro("__FMA__");
3166
Manman Rena45358c2012-10-11 00:59:55 +00003167 if (HasF16C)
3168 Builder.defineMacro("__F16C__");
3169
Craig Topper679b53a2013-08-21 05:29:10 +00003170 if (HasAVX512CD)
3171 Builder.defineMacro("__AVX512CD__");
3172 if (HasAVX512ER)
3173 Builder.defineMacro("__AVX512ER__");
3174 if (HasAVX512PF)
3175 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003176 if (HasAVX512DQ)
3177 Builder.defineMacro("__AVX512DQ__");
3178 if (HasAVX512BW)
3179 Builder.defineMacro("__AVX512BW__");
3180 if (HasAVX512VL)
3181 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003182
Ben Langmuir58078d02013-09-19 13:22:04 +00003183 if (HasSHA)
3184 Builder.defineMacro("__SHA__");
3185
Nick Lewycky50e8f482013-10-05 20:14:27 +00003186 if (HasCX16)
3187 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3188
Chris Lattner96e43572009-03-02 22:40:39 +00003189 // Each case falls through to the previous one here.
3190 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003191 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003192 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003193 case AVX2:
3194 Builder.defineMacro("__AVX2__");
3195 case AVX:
3196 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003197 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003198 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003199 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003200 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003201 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003202 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003203 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003204 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003205 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003206 Builder.defineMacro("__SSE2__");
3207 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003208 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003209 Builder.defineMacro("__SSE__");
3210 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003211 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003212 break;
3213 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003214
Derek Schuffc7dd7222012-10-11 15:52:22 +00003215 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003216 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003217 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003218 case AVX2:
3219 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003220 case SSE42:
3221 case SSE41:
3222 case SSSE3:
3223 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003224 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003225 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003226 break;
3227 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003228 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003229 break;
3230 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003231 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003232 }
3233 }
3234
Anders Carlssone437c682010-01-27 03:47:49 +00003235 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003236 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003237 case AMD3DNowAthlon:
3238 Builder.defineMacro("__3dNOW_A__");
3239 case AMD3DNow:
3240 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003241 case MMX:
3242 Builder.defineMacro("__MMX__");
3243 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003244 break;
3245 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003246
3247 if (CPU >= CK_i486) {
3248 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3249 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3250 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3251 }
3252 if (CPU >= CK_i586)
3253 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003254}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003255
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003256bool X86TargetInfo::hasFeature(StringRef Feature) const {
3257 return llvm::StringSwitch<bool>(Feature)
3258 .Case("aes", HasAES)
3259 .Case("avx", SSELevel >= AVX)
3260 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003261 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003262 .Case("avx512cd", HasAVX512CD)
3263 .Case("avx512er", HasAVX512ER)
3264 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003265 .Case("avx512dq", HasAVX512DQ)
3266 .Case("avx512bw", HasAVX512BW)
3267 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003268 .Case("bmi", HasBMI)
3269 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003270 .Case("cx16", HasCX16)
3271 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003272 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003273 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003274 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003275 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003276 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3277 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3278 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003279 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003280 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003281 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003282 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003283 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003284 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003285 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003286 .Case("sse", SSELevel >= SSE1)
3287 .Case("sse2", SSELevel >= SSE2)
3288 .Case("sse3", SSELevel >= SSE3)
3289 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003290 .Case("sse4.1", SSELevel >= SSE41)
3291 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003292 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003293 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003294 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003295 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3296 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003297 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003298 .Default(false);
3299}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003300
Eli Friedman3fd920a2008-08-20 02:34:37 +00003301bool
Anders Carlsson58436352009-02-28 17:11:49 +00003302X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003303 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003304 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003305 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003306 case 'I':
3307 Info.setRequiresImmediate(0, 31);
3308 return true;
3309 case 'J':
3310 Info.setRequiresImmediate(0, 63);
3311 return true;
3312 case 'K':
3313 Info.setRequiresImmediate(-128, 127);
3314 return true;
3315 case 'L':
3316 // FIXME: properly analyze this constraint:
3317 // must be one of 0xff, 0xffff, or 0xffffffff
3318 return true;
3319 case 'M':
3320 Info.setRequiresImmediate(0, 3);
3321 return true;
3322 case 'N':
3323 Info.setRequiresImmediate(0, 255);
3324 return true;
3325 case 'O':
3326 Info.setRequiresImmediate(0, 127);
3327 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003328 case 'Y': // first letter of a pair:
3329 switch (*(Name+1)) {
3330 default: return false;
3331 case '0': // First SSE register.
3332 case 't': // Any SSE register, when SSE2 is enabled.
3333 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3334 case 'm': // any MMX register, when inter-unit moves enabled.
3335 break; // falls through to setAllowsRegister.
3336 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003337 case 'f': // any x87 floating point stack register.
3338 // Constraint 'f' cannot be used for output operands.
3339 if (Info.ConstraintStr[0] == '=')
3340 return false;
3341
3342 Info.setAllowsRegister();
3343 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003344 case 'a': // eax.
3345 case 'b': // ebx.
3346 case 'c': // ecx.
3347 case 'd': // edx.
3348 case 'S': // esi.
3349 case 'D': // edi.
3350 case 'A': // edx:eax.
3351 case 't': // top of floating point stack.
3352 case 'u': // second from top of floating point stack.
3353 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003354 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003355 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003356 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003357 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3358 case 'l': // "Index" registers: any general register that can be used as an
3359 // index in a base+index memory access.
3360 Info.setAllowsRegister();
3361 return true;
3362 case 'C': // SSE floating point constant.
3363 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003364 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003365 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003366 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003367 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003368 return true;
3369 }
3370}
3371
Akira Hatanaka974131e2014-09-18 18:17:18 +00003372bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3373 unsigned Size) const {
3374 // Strip off constraint modifiers.
3375 while (Constraint[0] == '=' ||
3376 Constraint[0] == '+' ||
3377 Constraint[0] == '&')
3378 Constraint = Constraint.substr(1);
3379
3380 return validateOperandSize(Constraint, Size);
3381}
3382
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003383bool X86TargetInfo::validateInputSize(StringRef Constraint,
3384 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003385 return validateOperandSize(Constraint, Size);
3386}
3387
3388bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3389 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003390 switch (Constraint[0]) {
3391 default: break;
3392 case 'y':
3393 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003394 case 'f':
3395 case 't':
3396 case 'u':
3397 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003398 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003399 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003400 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003401 }
3402
3403 return true;
3404}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003405
Eli Friedman3fd920a2008-08-20 02:34:37 +00003406std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003407X86TargetInfo::convertConstraint(const char *&Constraint) const {
3408 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003409 case 'a': return std::string("{ax}");
3410 case 'b': return std::string("{bx}");
3411 case 'c': return std::string("{cx}");
3412 case 'd': return std::string("{dx}");
3413 case 'S': return std::string("{si}");
3414 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003415 case 'p': // address
3416 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003417 case 't': // top of floating point stack.
3418 return std::string("{st}");
3419 case 'u': // second from top of floating point stack.
3420 return std::string("{st(1)}"); // second from top of floating point stack.
3421 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003422 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003423 }
3424}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003425
Eli Friedman3fd920a2008-08-20 02:34:37 +00003426// X86-32 generic target
3427class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003428public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003429 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003430 DoubleAlign = LongLongAlign = 32;
3431 LongDoubleWidth = 96;
3432 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003433 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003434 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003435 SizeType = UnsignedInt;
3436 PtrDiffType = SignedInt;
3437 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003438 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003439
3440 // Use fpret for all types.
3441 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3442 (1 << TargetInfo::Double) |
3443 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003444
3445 // x86-32 has atomics up to 8 bytes
3446 // FIXME: Check that we actually have cmpxchg8b before setting
3447 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3448 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003449 }
Craig Topper3164f332014-03-11 03:39:26 +00003450 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003451 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003452 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003453
Craig Topper3164f332014-03-11 03:39:26 +00003454 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003455 if (RegNo == 0) return 0;
3456 if (RegNo == 1) return 2;
3457 return -1;
3458 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003459 bool validateOperandSize(StringRef Constraint,
3460 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003461 switch (Constraint[0]) {
3462 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003463 case 'R':
3464 case 'q':
3465 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003466 case 'a':
3467 case 'b':
3468 case 'c':
3469 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003470 case 'S':
3471 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003472 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003473 case 'A':
3474 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003475 }
3476
Akira Hatanaka974131e2014-09-18 18:17:18 +00003477 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003478 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003479};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003480
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003481class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3482public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003483 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3484 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003485
Craig Topper3164f332014-03-11 03:39:26 +00003486 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003487 unsigned Major, Minor, Micro;
3488 getTriple().getOSVersion(Major, Minor, Micro);
3489 // New NetBSD uses the default rounding mode.
3490 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3491 return X86_32TargetInfo::getFloatEvalMethod();
3492 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003493 return 1;
3494 }
3495};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003496
Eli Friedmane3aa4542009-07-05 18:47:56 +00003497class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3498public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003499 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3500 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003501 SizeType = UnsignedLong;
3502 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003503 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003504 }
3505};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003506
Eli Friedman9fa28852012-08-08 23:57:20 +00003507class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3508public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003509 BitrigI386TargetInfo(const llvm::Triple &Triple)
3510 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003511 SizeType = UnsignedLong;
3512 IntPtrType = SignedLong;
3513 PtrDiffType = SignedLong;
3514 }
3515};
Eli Friedman9fa28852012-08-08 23:57:20 +00003516
Torok Edwinb2b37c62009-06-30 17:10:35 +00003517class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003518public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003519 DarwinI386TargetInfo(const llvm::Triple &Triple)
3520 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003521 LongDoubleWidth = 128;
3522 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003523 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003524 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003525 SizeType = UnsignedLong;
3526 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003527 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003528 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003529 }
3530
Eli Friedman3fd920a2008-08-20 02:34:37 +00003531};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003532
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003533// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003534class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003535public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003536 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3537 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003538 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003539 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003540 bool IsWinCOFF =
3541 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Reid Kleckneraf676022015-04-30 22:13:05 +00003542 DescriptionString = IsWinCOFF
3543 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3544 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003545 }
Craig Topper3164f332014-03-11 03:39:26 +00003546 void getTargetDefines(const LangOptions &Opts,
3547 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003548 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3549 }
3550};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003551
3552// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003553class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003554public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003555 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003556 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003557 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003558 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3559 }
Craig Topper3164f332014-03-11 03:39:26 +00003560 void getTargetDefines(const LangOptions &Opts,
3561 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003562 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3563 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3564 // The value of the following reflects processor type.
3565 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3566 // We lost the original triple, so we use the default.
3567 Builder.defineMacro("_M_IX86", "600");
3568 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003569};
3570} // end anonymous namespace
3571
Reid Kleckner47606832014-04-21 20:58:00 +00003572static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3573 Builder.defineMacro("__MSVCRT__");
3574 Builder.defineMacro("__MINGW32__");
3575
3576 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3577 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3578 // macro anyway for pre-processor compatibility.
3579 if (Opts.MicrosoftExt)
3580 Builder.defineMacro("__declspec", "__declspec");
3581 else
3582 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3583
3584 if (!Opts.MicrosoftExt) {
3585 // Provide macros for all the calling convention keywords. Provide both
3586 // single and double underscore prefixed variants. These are available on
3587 // x64 as well as x86, even though they have no effect.
3588 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3589 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003590 std::string GCCSpelling = "__attribute__((__";
3591 GCCSpelling += CC;
3592 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003593 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3594 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3595 }
3596 }
3597}
3598
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003599namespace {
3600// x86-32 MinGW target
3601class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3602public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003603 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3604 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003605 void getTargetDefines(const LangOptions &Opts,
3606 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003607 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003608 DefineStd(Builder, "WIN32", Opts);
3609 DefineStd(Builder, "WINNT", Opts);
3610 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003611 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003612 }
3613};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003614
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003615// x86-32 Cygwin target
3616class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3617public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003618 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3619 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003620 TLSSupported = false;
3621 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003622 DoubleAlign = LongLongAlign = 64;
Reid Kleckneraf676022015-04-30 22:13:05 +00003623 DescriptionString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003624 }
Craig Topper3164f332014-03-11 03:39:26 +00003625 void getTargetDefines(const LangOptions &Opts,
3626 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003627 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003628 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003629 Builder.defineMacro("__CYGWIN__");
3630 Builder.defineMacro("__CYGWIN32__");
3631 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003632 if (Opts.CPlusPlus)
3633 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003634 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003635};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003636
Chris Lattnerb986aba2010-04-11 19:29:39 +00003637// x86-32 Haiku target
3638class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3639public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003640 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003641 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003642 IntPtrType = SignedLong;
3643 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003644 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003645 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003646 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003647 }
Craig Topper3164f332014-03-11 03:39:26 +00003648 void getTargetDefines(const LangOptions &Opts,
3649 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003650 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3651 Builder.defineMacro("__INTEL__");
3652 Builder.defineMacro("__HAIKU__");
3653 }
3654};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003655
Douglas Gregor9fabd852011-07-01 22:41:14 +00003656// RTEMS Target
3657template<typename Target>
3658class RTEMSTargetInfo : public OSTargetInfo<Target> {
3659protected:
Craig Topper3164f332014-03-11 03:39:26 +00003660 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3661 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003662 // RTEMS defines; list based off of gcc output
3663
Douglas Gregor9fabd852011-07-01 22:41:14 +00003664 Builder.defineMacro("__rtems__");
3665 Builder.defineMacro("__ELF__");
3666 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003667
Douglas Gregor9fabd852011-07-01 22:41:14 +00003668public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003669 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3670 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003671
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003672 switch (Triple.getArch()) {
3673 default:
3674 case llvm::Triple::x86:
3675 // this->MCountName = ".mcount";
3676 break;
3677 case llvm::Triple::mips:
3678 case llvm::Triple::mipsel:
3679 case llvm::Triple::ppc:
3680 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003681 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003682 // this->MCountName = "_mcount";
3683 break;
3684 case llvm::Triple::arm:
3685 // this->MCountName = "__mcount";
3686 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003687 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003688 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003689};
3690
Douglas Gregor9fabd852011-07-01 22:41:14 +00003691// x86-32 RTEMS target
3692class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3693public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003694 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003695 SizeType = UnsignedLong;
3696 IntPtrType = SignedLong;
3697 PtrDiffType = SignedLong;
3698 this->UserLabelPrefix = "";
3699 }
Craig Topper3164f332014-03-11 03:39:26 +00003700 void getTargetDefines(const LangOptions &Opts,
3701 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003702 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3703 Builder.defineMacro("__INTEL__");
3704 Builder.defineMacro("__rtems__");
3705 }
3706};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003707
Eli Friedman3fd920a2008-08-20 02:34:37 +00003708// x86-64 generic target
3709class X86_64TargetInfo : public X86TargetInfo {
3710public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003711 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003712 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003713 bool IsWinCOFF =
3714 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003715 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003716 LongDoubleWidth = 128;
3717 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003718 LargeArrayMinWidth = 128;
3719 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003720 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003721 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3722 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3723 IntPtrType = IsX32 ? SignedInt : SignedLong;
3724 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003725 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003726 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003727
Eric Christopher917e9522014-11-18 22:36:15 +00003728 // Pointers are 32-bit in x32.
David Majnemer8fa8c382015-03-17 23:55:00 +00003729 DescriptionString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3730 : IsWinCOFF
3731 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3732 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003733
3734 // Use fpret only for long double.
3735 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003736
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003737 // Use fp2ret for _Complex long double.
3738 ComplexLongDoubleUsesFP2Ret = true;
3739
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003740 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003741 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003742 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003743 }
Craig Topper3164f332014-03-11 03:39:26 +00003744 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003745 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003746 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003747
Craig Topper3164f332014-03-11 03:39:26 +00003748 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003749 if (RegNo == 0) return 0;
3750 if (RegNo == 1) return 1;
3751 return -1;
3752 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003753
Craig Topper3164f332014-03-11 03:39:26 +00003754 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003755 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003756 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003757 CC == CC_IntelOclBicc ||
3758 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003759 }
3760
Craig Topper3164f332014-03-11 03:39:26 +00003761 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003762 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003763 }
3764
Pavel Chupinfd223e12014-08-04 12:39:43 +00003765 // for x32 we need it here explicitly
3766 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003767};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003768
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003769// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003770class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003771public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003772 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3773 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003774 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003775 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003776 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003777 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003778 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003779 SizeType = UnsignedLongLong;
3780 PtrDiffType = SignedLongLong;
3781 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003782 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003783 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003784
Craig Topper3164f332014-03-11 03:39:26 +00003785 void getTargetDefines(const LangOptions &Opts,
3786 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003787 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003788 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003789 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003790
Craig Topper3164f332014-03-11 03:39:26 +00003791 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003792 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003793 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003794
Craig Topper3164f332014-03-11 03:39:26 +00003795 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003796 switch (CC) {
3797 case CC_X86StdCall:
3798 case CC_X86ThisCall:
3799 case CC_X86FastCall:
3800 return CCCR_Ignore;
3801 case CC_C:
3802 case CC_X86VectorCall:
3803 case CC_IntelOclBicc:
3804 case CC_X86_64SysV:
3805 return CCCR_OK;
3806 default:
3807 return CCCR_Warning;
3808 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003809 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003810};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003811
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003812// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003813class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003814public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003815 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003816 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003817 LongDoubleWidth = LongDoubleAlign = 64;
3818 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003819 }
Craig Topper3164f332014-03-11 03:39:26 +00003820 void getTargetDefines(const LangOptions &Opts,
3821 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003822 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3823 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003824 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003825 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003826 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003827};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003828
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003829// x86-64 MinGW target
3830class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3831public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003832 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3833 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003834 void getTargetDefines(const LangOptions &Opts,
3835 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003836 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003837 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003838 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003839 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003840
3841 // GCC defines this macro when it is using __gxx_personality_seh0.
3842 if (!Opts.SjLjExceptions)
3843 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003844 }
3845};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003846
Eli Friedman2857ccb2009-07-01 03:36:11 +00003847class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3848public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003849 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3850 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003851 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003852 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003853 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3854 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003855 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003856 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003857 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003858 }
3859};
Eli Friedman2857ccb2009-07-01 03:36:11 +00003860
Eli Friedman245f2292009-07-05 22:31:18 +00003861class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3862public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003863 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3864 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003865 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003866 Int64Type = SignedLongLong;
3867 }
3868};
Eli Friedman245f2292009-07-05 22:31:18 +00003869
Eli Friedman9fa28852012-08-08 23:57:20 +00003870class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3871public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003872 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3873 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3874 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003875 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003876 }
3877};
Tim Northover9bb857a2013-01-31 12:13:10 +00003878
Eli Friedmanf05b7722008-08-20 07:44:10 +00003879class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003880 // Possible FPU choices.
3881 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003882 VFP2FPU = (1 << 0),
3883 VFP3FPU = (1 << 1),
3884 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003885 NeonFPU = (1 << 3),
3886 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003887 };
3888
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003889 // Possible HWDiv features.
3890 enum HWDivMode {
3891 HWDivThumb = (1 << 0),
3892 HWDivARM = (1 << 1)
3893 };
3894
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003895 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003896 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003897 }
3898
3899 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3900 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003901
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003902 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003903
Rafael Espindolaeb265472013-08-21 21:59:03 +00003904 enum {
3905 FP_Default,
3906 FP_VFP,
3907 FP_Neon
3908 } FPMath;
3909
Bernard Ogdenda13af32013-10-24 18:32:51 +00003910 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003911
Logan Chien57086ce2012-10-10 06:56:20 +00003912 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003913 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003914 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003915
3916 // Initialized via features.
3917 unsigned SoftFloat : 1;
3918 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003919
Bernard Ogden18b57012013-10-29 09:47:51 +00003920 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003921 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003922
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003923 // ACLE 6.5.1 Hardware floating point
3924 enum {
3925 HW_FP_HP = (1 << 1), /// half (16-bit)
3926 HW_FP_SP = (1 << 2), /// single (32-bit)
3927 HW_FP_DP = (1 << 3), /// double (64-bit)
3928 };
3929 uint32_t HW_FP;
3930
Chris Lattner5cc15e02010-03-03 19:03:45 +00003931 static const Builtin::Info BuiltinInfo[];
3932
Rafael Espindola101d5b92013-05-13 20:09:47 +00003933 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003934 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003935 if (T.getArch() == llvm::Triple::arm ||
3936 T.getArch() == llvm::Triple::armeb) {
3937 StringRef VersionStr;
3938 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003939 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003940 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003941 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003942 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003943 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003944 unsigned Version;
3945 if (VersionStr.getAsInteger(10, Version))
3946 return false;
3947 return Version >= 6;
3948 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003949 assert(T.getArch() == llvm::Triple::thumb ||
3950 T.getArch() == llvm::Triple::thumbeb);
3951 StringRef VersionStr;
3952 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003953 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003954 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003955 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003956 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003957 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003958 unsigned Version;
3959 if (VersionStr.getAsInteger(10, Version))
3960 return false;
3961 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003962 }
3963
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003964 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003965 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003966
3967 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003968 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003969
Renato Golin9ba39232015-02-27 16:35:48 +00003970 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
3971 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
3972 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003973 SizeType = UnsignedLong;
3974 else
3975 SizeType = UnsignedInt;
3976
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003977 switch (T.getOS()) {
3978 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003979 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003980 break;
3981 case llvm::Triple::Win32:
3982 WCharType = UnsignedShort;
3983 break;
3984 case llvm::Triple::Linux:
3985 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003986 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3987 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003988 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003989 }
3990
3991 UseBitFieldTypeAlignment = true;
3992
3993 ZeroLengthBitfieldBoundary = 0;
3994
Tim Northover147cd2f2014-10-14 22:12:21 +00003995 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3996 // so set preferred for small types to 32.
3997 if (T.isOSBinFormatMachO()) {
3998 DescriptionString =
3999 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4000 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4001 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004002 assert(!BigEndian && "Windows on ARM does not support big endian");
4003 DescriptionString = "e"
David Majnemer8fa8c382015-03-17 23:55:00 +00004004 "-m:w"
Tim Northover147cd2f2014-10-14 22:12:21 +00004005 "-p:32:32"
4006 "-i64:64"
4007 "-v128:64:128"
4008 "-a:0:32"
4009 "-n32"
4010 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004011 } else if (T.isOSNaCl()) {
4012 assert(!BigEndian && "NaCl on ARM does not support big endian");
4013 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004014 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00004015 DescriptionString =
4016 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4017 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004018 }
4019
4020 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004021 }
4022
4023 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004024 const llvm::Triple &T = getTriple();
4025
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004026 IsAAPCS = false;
4027
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004028 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004029
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004030 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004031 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004032 SizeType = UnsignedInt;
4033 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004034 SizeType = UnsignedLong;
4035
4036 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4037 WCharType = SignedInt;
4038
4039 // Do not respect the alignment of bit-field types when laying out
4040 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4041 UseBitFieldTypeAlignment = false;
4042
4043 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4044 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4045 /// gcc.
4046 ZeroLengthBitfieldBoundary = 32;
4047
Tim Northover147cd2f2014-10-14 22:12:21 +00004048 if (T.isOSBinFormatMachO())
4049 DescriptionString =
4050 BigEndian
4051 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4052 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4053 else
4054 DescriptionString =
4055 BigEndian
4056 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4057 : "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 +00004058
4059 // FIXME: Override "preferred align" for double and long long.
4060 }
4061
Chris Lattner17df24e2008-04-21 18:56:49 +00004062public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004063 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004064 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004065 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004066 BigEndian = IsBigEndian;
4067
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004068 switch (getTriple().getOS()) {
4069 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004070 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004071 break;
4072 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004073 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004074 break;
4075 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004076
Chris Lattner1a8f3942010-04-23 16:29:58 +00004077 // {} in inline assembly are neon specifiers, not assembly variant
4078 // specifiers.
4079 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004080
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004081 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00004082 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004083
Eric Christopher0e261882014-12-05 01:06:59 +00004084 // FIXME: This duplicates code from the driver that sets the -target-abi
4085 // option - this code is used if -target-abi isn't passed and should
4086 // be unified in some way.
4087 if (Triple.isOSBinFormatMachO()) {
4088 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4089 // the frontend matches that.
4090 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4091 Triple.getOS() == llvm::Triple::UnknownOS ||
4092 StringRef(CPU).startswith("cortex-m")) {
4093 setABI("aapcs");
4094 } else {
4095 setABI("apcs-gnu");
4096 }
4097 } else if (Triple.isOSWindows()) {
4098 // FIXME: this is invalid for WindowsCE
4099 setABI("aapcs");
4100 } else {
4101 // Select the default based on the platform.
4102 switch (Triple.getEnvironment()) {
4103 case llvm::Triple::Android:
4104 case llvm::Triple::GNUEABI:
4105 case llvm::Triple::GNUEABIHF:
4106 setABI("aapcs-linux");
4107 break;
4108 case llvm::Triple::EABIHF:
4109 case llvm::Triple::EABI:
4110 setABI("aapcs");
4111 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004112 case llvm::Triple::GNU:
4113 setABI("apcs-gnu");
4114 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004115 default:
4116 if (Triple.getOS() == llvm::Triple::NetBSD)
4117 setABI("apcs-gnu");
4118 else
4119 setABI("aapcs");
4120 break;
4121 }
4122 }
John McCall86353412010-08-21 22:46:04 +00004123
4124 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004125 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004126
4127 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004128 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00004129 if (shouldUseInlineAtomic(getTriple()))
4130 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00004131
4132 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004133 // the alignment of the zero-length bitfield is greater than the member
4134 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004135 // zero length bitfield.
4136 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004137 }
Alp Toker4925ba72014-06-07 23:30:42 +00004138 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00004139 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004140 ABI = Name;
4141
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004142 // The defaults (above) are for AAPCS, check if we need to change them.
4143 //
4144 // FIXME: We need support for -meabi... we could just mangle it into the
4145 // name.
4146 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004147 setABIAPCS();
4148 return true;
4149 }
4150 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4151 setABIAAPCS();
4152 return true;
4153 }
4154 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004155 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004156
Craig Topper3164f332014-03-11 03:39:26 +00004157 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004158 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004159 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4160 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004161 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004162 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004163 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004164 }
4165 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004166 Features["vfp4"] = true;
4167 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004168 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4169 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004170 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004171 Features["vfp4"] = true;
4172 Features["neon"] = true;
4173 Features["hwdiv"] = true;
4174 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004175 } else if (CPU == "cyclone") {
4176 Features["v8fp"] = true;
4177 Features["neon"] = true;
4178 Features["hwdiv"] = true;
4179 Features["hwdiv-arm"] = true;
Renato Golin84545d72015-02-04 13:31:56 +00004180 } else if (CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004181 Features["fp-armv8"] = true;
4182 Features["neon"] = true;
4183 Features["hwdiv"] = true;
4184 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004185 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004186 Features["crypto"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004187 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004188 // Enable the hwdiv extension for all v8a AArch32 cores by
4189 // default.
4190 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004191 ArchName == "armebv8a" || ArchName == "armebv8" ||
4192 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4193 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004194 Features["hwdiv"] = true;
4195 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004196 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
Javed Absar879d18b82015-04-09 14:12:10 +00004197 CPU == "sc300" || CPU == "cortex-r4" || CPU == "cortex-r4f") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004198 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004199 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004200 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004201
Craig Topper3164f332014-03-11 03:39:26 +00004202 bool handleTargetFeatures(std::vector<std::string> &Features,
4203 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004204 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004205 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004206 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004207 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004208 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004209
4210 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004211 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004212 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004213 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004214 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004215 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004216 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004217 HW_FP = HW_FP_SP | HW_FP_DP;
4218 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004219 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004220 HW_FP = HW_FP_SP | HW_FP_DP;
4221 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004222 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004223 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4224 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004225 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004226 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4227 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004228 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004229 HW_FP = HW_FP_SP | HW_FP_DP;
4230 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004231 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004232 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004233 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004234 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004235 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004236 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004237 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004238 } else if (Feature == "+fp-only-sp") {
4239 HW_FP &= ~HW_FP_DP;
4240 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004241 }
4242
Rafael Espindolaeb265472013-08-21 21:59:03 +00004243 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4244 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4245 return false;
4246 }
4247
4248 if (FPMath == FP_Neon)
4249 Features.push_back("+neonfp");
4250 else if (FPMath == FP_VFP)
4251 Features.push_back("-neonfp");
4252
Daniel Dunbar893d4752009-12-19 04:15:38 +00004253 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004254 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4255 for (const auto &FEFeature : FrontEndFeatures) {
4256 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4257 if (Feature != Features.end())
4258 Features.erase(Feature);
4259 }
4260
Rafael Espindolaeb265472013-08-21 21:59:03 +00004261 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004262 }
4263
Craig Topper3164f332014-03-11 03:39:26 +00004264 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004265 return llvm::StringSwitch<bool>(Feature)
4266 .Case("arm", true)
4267 .Case("softfloat", SoftFloat)
4268 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004269 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004270 .Case("hwdiv", HWDiv & HWDivThumb)
4271 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004272 .Default(false);
4273 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004274 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004275 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004276 return llvm::StringSwitch<const char *>(Name)
4277 .Cases("arm8", "arm810", "4")
4278 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4279 "4")
4280 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4281 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4282 .Case("ep9312", "4T")
4283 .Cases("arm10tdmi", "arm1020t", "5T")
4284 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4285 .Case("arm926ej-s", "5TEJ")
4286 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4287 .Cases("xscale", "iwmmxt", "5TE")
4288 .Case("arm1136j-s", "6J")
Renato Goline11531f2015-03-17 11:55:43 +00004289 .Case("arm1136jf-s", "6")
4290 .Cases("mpcorenovfp", "mpcore", "6K")
4291 .Cases("arm1176jz-s", "arm1176jzf-s", "6K")
Eric Christopher917e9522014-11-18 22:36:15 +00004292 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4293 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4294 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4295 "7A")
Javed Absar879d18b82015-04-09 14:12:10 +00004296 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "7R")
Eric Christopher917e9522014-11-18 22:36:15 +00004297 .Case("swift", "7S")
4298 .Case("cyclone", "8A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004299 .Cases("sc300", "cortex-m3", "7M")
Eric Christopher917e9522014-11-18 22:36:15 +00004300 .Cases("cortex-m4", "cortex-m7", "7EM")
Bradley Smithd86d6702015-02-18 10:34:48 +00004301 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "6M")
Renato Golin84545d72015-02-04 13:31:56 +00004302 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Eric Christopher917e9522014-11-18 22:36:15 +00004303 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004304 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004305 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004306 return llvm::StringSwitch<const char *>(Name)
4307 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4308 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4309 "A")
Renato Golin84545d72015-02-04 13:31:56 +00004310 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004311 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m0plus", "M")
4312 .Cases("cortex-m1", "cortex-m7", "sc000", "sc300", "M")
Javed Absar879d18b82015-04-09 14:12:10 +00004313 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "R")
Eric Christopher917e9522014-11-18 22:36:15 +00004314 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004315 }
Craig Topper3164f332014-03-11 03:39:26 +00004316 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004317 if (!getCPUDefineSuffix(Name))
4318 return false;
4319
Tim Northovere8c37212014-07-09 09:24:43 +00004320 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4321 StringRef Profile = getCPUProfile(Name);
4322 if (Profile == "M" && MaxAtomicInlineWidth) {
4323 MaxAtomicPromoteWidth = 32;
4324 MaxAtomicInlineWidth = 32;
4325 }
4326
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004327 CPU = Name;
4328 return true;
4329 }
Craig Topper3164f332014-03-11 03:39:26 +00004330 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004331 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4332 unsigned CPUArchVer) const {
4333 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4334 (CPUArch.find('M') != StringRef::npos);
4335 }
4336 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4337 unsigned CPUArchVer) const {
4338 // We check both CPUArchVer and ArchName because when only triple is
4339 // specified, the default CPU is arm1136j-s.
4340 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4341 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4342 }
Craig Topper3164f332014-03-11 03:39:26 +00004343 void getTargetDefines(const LangOptions &Opts,
4344 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004345 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004346 Builder.defineMacro("__arm");
4347 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004348
Chris Lattnerecd49032009-03-02 22:27:17 +00004349 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004350 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004351
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004352 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004353 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004354 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004355 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004356 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004357
4358 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004359 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004360 StringRef ArchName = getTriple().getArchName();
4361
4362 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4363 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004364 if (CPUArch[0] >= '8') {
4365 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4366 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004367 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004368
4369 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4370 // is not defined for the M-profile.
4371 // NOTE that the deffault profile is assumed to be 'A'
4372 if (CPUProfile.empty() || CPUProfile != "M")
4373 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4374
4375 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4376 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4377 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4378 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4379 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4380 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4381 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4382
4383 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4384 // instruction set such as ARM or Thumb.
4385 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4386
4387 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4388
4389 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004390 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004391 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004392
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004393 // ACLE 6.5.1 Hardware Floating Point
4394 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004395 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004396
Yi Konga44c4d72014-06-27 21:25:42 +00004397 // ACLE predefines.
4398 Builder.defineMacro("__ARM_ACLE", "200");
4399
Mike Stump9d54bd72009-04-08 02:07:04 +00004400 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004401
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004402 // FIXME: It's more complicated than this and we don't really support
4403 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004404 // Windows on ARM does not "support" interworking
4405 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004406 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004407
David Tweed8f676532012-10-25 13:33:01 +00004408 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004409 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004410 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4411 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004412 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004413 Builder.defineMacro("__ARM_PCS", "1");
4414
David Tweed8f676532012-10-25 13:33:01 +00004415 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004416 Builder.defineMacro("__ARM_PCS_VFP", "1");
4417 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004418
Daniel Dunbar893d4752009-12-19 04:15:38 +00004419 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004420 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004421
4422 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004423 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004424
4425 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004426 Builder.defineMacro("__THUMBEL__");
4427 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004428 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004429 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004430 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004431 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4432 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004433
4434 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004435 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004436
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004437 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004438 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004439 if (FPU & VFP2FPU)
4440 Builder.defineMacro("__ARM_VFPV2__");
4441 if (FPU & VFP3FPU)
4442 Builder.defineMacro("__ARM_VFPV3__");
4443 if (FPU & VFP4FPU)
4444 Builder.defineMacro("__ARM_VFPV4__");
4445 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004446
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004447 // This only gets set when Neon instructions are actually available, unlike
4448 // the VFP define, hence the soft float and arch check. This is subtly
4449 // different from gcc, we follow the intent which was that it should be set
4450 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004451 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4452 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004453 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004454 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004455
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004456 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4457 Opts.ShortWChar ? "2" : "4");
4458
4459 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4460 Opts.ShortEnums ? "1" : "4");
4461
Bernard Ogden18b57012013-10-29 09:47:51 +00004462 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004463 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004464
Tim Northover02e38602014-02-03 17:28:04 +00004465 if (Crypto)
4466 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4467
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004468 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004469 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4470 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4471 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4472 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4473 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004474
4475 bool is5EOrAbove = (CPUArchVer >= 6 ||
4476 (CPUArchVer == 5 &&
4477 CPUArch.find('E') != StringRef::npos));
4478 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4479 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4480 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004481 }
Craig Topper3164f332014-03-11 03:39:26 +00004482 void getTargetBuiltins(const Builtin::Info *&Records,
4483 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004484 Records = BuiltinInfo;
4485 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004486 }
Craig Topper3164f332014-03-11 03:39:26 +00004487 bool isCLZForZeroUndef() const override { return false; }
4488 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004489 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004490 }
Craig Topper3164f332014-03-11 03:39:26 +00004491 void getGCCRegNames(const char * const *&Names,
4492 unsigned &NumNames) const override;
4493 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4494 unsigned &NumAliases) const override;
4495 bool validateAsmConstraint(const char *&Name,
4496 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004497 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004498 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004499 case 'l': // r0-r7
4500 case 'h': // r8-r15
4501 case 'w': // VFP Floating point register single precision
4502 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004503 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004504 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004505 case 'I':
4506 case 'J':
4507 case 'K':
4508 case 'L':
4509 case 'M':
4510 // FIXME
4511 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004512 case 'Q': // A memory address that is a single base register.
4513 Info.setAllowsMemory();
4514 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004515 case 'U': // a memory reference...
4516 switch (Name[1]) {
4517 case 'q': // ...ARMV4 ldrsb
4518 case 'v': // ...VFP load/store (reg+constant offset)
4519 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004520 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004521 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004522 case 'n': // valid address for Neon doubleword vector load/store
4523 case 'm': // valid address for Neon element and structure load/store
4524 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004525 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004526 Info.setAllowsMemory();
4527 Name++;
4528 return true;
4529 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004530 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004531 return false;
4532 }
Craig Topper3164f332014-03-11 03:39:26 +00004533 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004534 std::string R;
4535 switch (*Constraint) {
4536 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004537 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004538 Constraint++;
4539 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004540 case 'p': // 'p' should be translated to 'r' by default.
4541 R = std::string("r");
4542 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004543 default:
4544 return std::string(1, *Constraint);
4545 }
4546 return R;
4547 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004548 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004549 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004550 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004551 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004552 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004553
Bill Wendling9d1ee112012-10-25 23:28:48 +00004554 // Strip off constraint modifiers.
4555 while (Constraint[0] == '=' ||
4556 Constraint[0] == '+' ||
4557 Constraint[0] == '&')
4558 Constraint = Constraint.substr(1);
4559
4560 switch (Constraint[0]) {
4561 default: break;
4562 case 'r': {
4563 switch (Modifier) {
4564 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004565 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004566 case 'q':
4567 // A register of size 32 cannot fit a vector type.
4568 return false;
4569 }
4570 }
4571 }
4572
4573 return true;
4574 }
Craig Topper3164f332014-03-11 03:39:26 +00004575 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004576 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004577 return "";
4578 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004579
Craig Topper3164f332014-03-11 03:39:26 +00004580 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004581 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4582 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004583
Craig Topper3164f332014-03-11 03:39:26 +00004584 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004585 if (RegNo == 0) return 0;
4586 if (RegNo == 1) return 1;
4587 return -1;
4588 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004589};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004590
Rafael Espindolaeb265472013-08-21 21:59:03 +00004591bool ARMTargetInfo::setFPMath(StringRef Name) {
4592 if (Name == "neon") {
4593 FPMath = FP_Neon;
4594 return true;
4595 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4596 Name == "vfp4") {
4597 FPMath = FP_VFP;
4598 return true;
4599 }
4600 return false;
4601}
4602
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004603const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004604 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004605 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004606 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4607
4608 // Float registers
4609 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4610 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4611 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004612 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004613
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004614 // Double registers
4615 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4616 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004617 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4618 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004619
4620 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004621 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4622 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004623};
4624
4625void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004626 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004627 Names = GCCRegNames;
4628 NumNames = llvm::array_lengthof(GCCRegNames);
4629}
4630
4631const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004632 { { "a1" }, "r0" },
4633 { { "a2" }, "r1" },
4634 { { "a3" }, "r2" },
4635 { { "a4" }, "r3" },
4636 { { "v1" }, "r4" },
4637 { { "v2" }, "r5" },
4638 { { "v3" }, "r6" },
4639 { { "v4" }, "r7" },
4640 { { "v5" }, "r8" },
4641 { { "v6", "rfp" }, "r9" },
4642 { { "sl" }, "r10" },
4643 { { "fp" }, "r11" },
4644 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004645 { { "r13" }, "sp" },
4646 { { "r14" }, "lr" },
4647 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004648 // The S, D and Q registers overlap, but aren't really aliases; we
4649 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004650};
4651
4652void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4653 unsigned &NumAliases) const {
4654 Aliases = GCCRegAliases;
4655 NumAliases = llvm::array_lengthof(GCCRegAliases);
4656}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004657
4658const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004659#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004660#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004661 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004662#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004663
4664#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004665#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004666#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4667 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004668#include "clang/Basic/BuiltinsARM.def"
4669};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004670
4671class ARMleTargetInfo : public ARMTargetInfo {
4672public:
4673 ARMleTargetInfo(const llvm::Triple &Triple)
4674 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004675 void getTargetDefines(const LangOptions &Opts,
4676 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004677 Builder.defineMacro("__ARMEL__");
4678 ARMTargetInfo::getTargetDefines(Opts, Builder);
4679 }
4680};
4681
4682class ARMbeTargetInfo : public ARMTargetInfo {
4683public:
4684 ARMbeTargetInfo(const llvm::Triple &Triple)
4685 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004686 void getTargetDefines(const LangOptions &Opts,
4687 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004688 Builder.defineMacro("__ARMEB__");
4689 Builder.defineMacro("__ARM_BIG_ENDIAN");
4690 ARMTargetInfo::getTargetDefines(Opts, Builder);
4691 }
4692};
Chris Lattner17df24e2008-04-21 18:56:49 +00004693
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004694class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4695 const llvm::Triple Triple;
4696public:
4697 WindowsARMTargetInfo(const llvm::Triple &Triple)
4698 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4699 TLSSupported = false;
4700 WCharType = UnsignedShort;
4701 SizeType = UnsignedInt;
4702 UserLabelPrefix = "";
4703 }
4704 void getVisualStudioDefines(const LangOptions &Opts,
4705 MacroBuilder &Builder) const {
4706 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4707
4708 // FIXME: this is invalid for WindowsCE
4709 Builder.defineMacro("_M_ARM_NT", "1");
4710 Builder.defineMacro("_M_ARMT", "_M_ARM");
4711 Builder.defineMacro("_M_THUMB", "_M_ARM");
4712
4713 assert((Triple.getArch() == llvm::Triple::arm ||
4714 Triple.getArch() == llvm::Triple::thumb) &&
4715 "invalid architecture for Windows ARM target info");
4716 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4717 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4718
4719 // TODO map the complete set of values
4720 // 31: VFPv3 40: VFPv4
4721 Builder.defineMacro("_M_ARM_FP", "31");
4722 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004723 BuiltinVaListKind getBuiltinVaListKind() const override {
4724 return TargetInfo::CharPtrBuiltinVaList;
4725 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004726};
4727
4728// Windows ARM + Itanium C++ ABI Target
4729class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4730public:
4731 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4732 : WindowsARMTargetInfo(Triple) {
4733 TheCXXABI.set(TargetCXXABI::GenericARM);
4734 }
4735
4736 void getTargetDefines(const LangOptions &Opts,
4737 MacroBuilder &Builder) const override {
4738 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4739
4740 if (Opts.MSVCCompat)
4741 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4742 }
4743};
4744
4745// Windows ARM, MS (C++) ABI
4746class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4747public:
4748 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4749 : WindowsARMTargetInfo(Triple) {
4750 TheCXXABI.set(TargetCXXABI::Microsoft);
4751 }
4752
4753 void getTargetDefines(const LangOptions &Opts,
4754 MacroBuilder &Builder) const override {
4755 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4756 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4757 }
4758};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004759
Mike Stump11289f42009-09-09 15:08:12 +00004760class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004761 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004762protected:
Craig Topper3164f332014-03-11 03:39:26 +00004763 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4764 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004765 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004766 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004767
Torok Edwinb2b37c62009-06-30 17:10:35 +00004768public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004769 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004770 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004771 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004772 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004773 // FIXME: This should be based off of the target features in
4774 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004775 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004776
4777 // Darwin on iOS uses a variant of the ARM C++ ABI.
4778 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004779 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004780};
Eli Friedmanf05b7722008-08-20 07:44:10 +00004781
Tim Northover573cbee2014-05-24 12:52:07 +00004782class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004783 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004784 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4785 static const char *const GCCRegNames[];
4786
James Molloy75f5f9e2014-04-16 15:33:48 +00004787 enum FPUModeEnum {
4788 FPUMode,
4789 NeonMode
4790 };
4791
4792 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004793 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004794 unsigned Crypto;
4795
Tim Northovera2ee4332014-03-29 15:09:45 +00004796 static const Builtin::Info BuiltinInfo[];
4797
4798 std::string ABI;
4799
4800public:
Tim Northover573cbee2014-05-24 12:52:07 +00004801 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004802 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004803
4804 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4805 WCharType = SignedInt;
4806
4807 // NetBSD apparently prefers consistency across ARM targets to consistency
4808 // across 64-bit targets.
4809 Int64Type = SignedLongLong;
4810 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004811 } else {
4812 WCharType = UnsignedInt;
4813 Int64Type = SignedLong;
4814 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004815 }
4816
Tim Northovera2ee4332014-03-29 15:09:45 +00004817 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004818 MaxVectorAlign = 128;
4819 RegParmMax = 8;
4820 MaxAtomicInlineWidth = 128;
4821 MaxAtomicPromoteWidth = 128;
4822
Tim Northovera6a19f12015-02-06 01:25:07 +00004823 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00004824 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4825
Tim Northovera2ee4332014-03-29 15:09:45 +00004826 // {} in inline assembly are neon specifiers, not assembly variant
4827 // specifiers.
4828 NoAsmVariants = true;
4829
Tim Northover7ad87af2015-01-16 18:44:04 +00004830 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4831 // contributes to the alignment of the containing aggregate in the same way
4832 // a plain (non bit-field) member of that type would, without exception for
4833 // zero-sized or anonymous bit-fields."
4834 UseBitFieldTypeAlignment = true;
4835 UseZeroLengthBitfieldAlignment = true;
4836
Tim Northover573cbee2014-05-24 12:52:07 +00004837 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004838 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4839 }
4840
Alp Toker4925ba72014-06-07 23:30:42 +00004841 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004842 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004843 if (Name != "aapcs" && Name != "darwinpcs")
4844 return false;
4845
4846 ABI = Name;
4847 return true;
4848 }
4849
David Blaikie1cbb9712014-11-14 19:09:44 +00004850 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004851 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004852 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004853 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004854 .Case("cyclone", true)
4855 .Default(false);
4856 return CPUKnown;
4857 }
4858
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004859 void getTargetDefines(const LangOptions &Opts,
4860 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004861 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004862 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004863
4864 // Target properties.
4865 Builder.defineMacro("_LP64");
4866 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004867
4868 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4869 Builder.defineMacro("__ARM_ACLE", "200");
4870 Builder.defineMacro("__ARM_ARCH", "8");
4871 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4872
4873 Builder.defineMacro("__ARM_64BIT_STATE");
4874 Builder.defineMacro("__ARM_PCS_AAPCS64");
4875 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4876
4877 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4878 Builder.defineMacro("__ARM_FEATURE_CLZ");
4879 Builder.defineMacro("__ARM_FEATURE_FMA");
4880 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004881 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4882 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4883 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4884 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004885
4886 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4887
4888 // 0xe implies support for half, single and double precision operations.
4889 Builder.defineMacro("__ARM_FP", "0xe");
4890
4891 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4892 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4893 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4894
4895 if (Opts.FastMath || Opts.FiniteMathOnly)
4896 Builder.defineMacro("__ARM_FP_FAST");
4897
Richard Smithab506ad2014-10-20 23:26:58 +00004898 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004899 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4900
4901 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4902
4903 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4904 Opts.ShortEnums ? "1" : "4");
4905
James Molloy75f5f9e2014-04-16 15:33:48 +00004906 if (FPU == NeonMode) {
4907 Builder.defineMacro("__ARM_NEON");
4908 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004909 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004910 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004911
Bradley Smith418c5932014-05-02 15:17:51 +00004912 if (CRC)
4913 Builder.defineMacro("__ARM_FEATURE_CRC32");
4914
James Molloy75f5f9e2014-04-16 15:33:48 +00004915 if (Crypto)
4916 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004917 }
4918
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004919 void getTargetBuiltins(const Builtin::Info *&Records,
4920 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004921 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004922 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004923 }
4924
David Blaikie1cbb9712014-11-14 19:09:44 +00004925 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004926 return Feature == "aarch64" ||
4927 Feature == "arm64" ||
4928 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004929 }
4930
James Molloy5e73df52014-04-16 15:06:20 +00004931 bool handleTargetFeatures(std::vector<std::string> &Features,
4932 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004933 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004934 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004935 Crypto = 0;
4936 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4937 if (Features[i] == "+neon")
4938 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004939 if (Features[i] == "+crc")
4940 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004941 if (Features[i] == "+crypto")
4942 Crypto = 1;
4943 }
4944
James Molloy5e73df52014-04-16 15:06:20 +00004945 setDescriptionString();
4946
4947 return true;
4948 }
4949
David Blaikie1cbb9712014-11-14 19:09:44 +00004950 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004951
David Blaikie1cbb9712014-11-14 19:09:44 +00004952 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004953 return TargetInfo::AArch64ABIBuiltinVaList;
4954 }
4955
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004956 void getGCCRegNames(const char *const *&Names,
4957 unsigned &NumNames) const override;
4958 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4959 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004960
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004961 bool validateAsmConstraint(const char *&Name,
4962 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004963 switch (*Name) {
4964 default:
4965 return false;
4966 case 'w': // Floating point and SIMD registers (V0-V31)
4967 Info.setAllowsRegister();
4968 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004969 case 'I': // Constant that can be used with an ADD instruction
4970 case 'J': // Constant that can be used with a SUB instruction
4971 case 'K': // Constant that can be used with a 32-bit logical instruction
4972 case 'L': // Constant that can be used with a 64-bit logical instruction
4973 case 'M': // Constant that can be used as a 32-bit MOV immediate
4974 case 'N': // Constant that can be used as a 64-bit MOV immediate
4975 case 'Y': // Floating point constant zero
4976 case 'Z': // Integer constant zero
4977 return true;
4978 case 'Q': // A memory reference with base register and no offset
4979 Info.setAllowsMemory();
4980 return true;
4981 case 'S': // A symbolic address
4982 Info.setAllowsRegister();
4983 return true;
4984 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004985 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4986 // Utf: A memory address suitable for ldp/stp in TF mode.
4987 // Usa: An absolute symbolic address.
4988 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4989 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004990 case 'z': // Zero register, wzr or xzr
4991 Info.setAllowsRegister();
4992 return true;
4993 case 'x': // Floating point and SIMD registers (V0-V15)
4994 Info.setAllowsRegister();
4995 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004996 }
4997 return false;
4998 }
4999
Akira Hatanaka987f1862014-08-22 06:05:21 +00005000 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005001 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005002 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005003 // Strip off constraint modifiers.
5004 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5005 Constraint = Constraint.substr(1);
5006
5007 switch (Constraint[0]) {
5008 default:
5009 return true;
5010 case 'z':
5011 case 'r': {
5012 switch (Modifier) {
5013 case 'x':
5014 case 'w':
5015 // For now assume that the person knows what they're
5016 // doing with the modifier.
5017 return true;
5018 default:
5019 // By default an 'r' constraint will be in the 'x'
5020 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005021 if (Size == 64)
5022 return true;
5023
5024 SuggestedModifier = "w";
5025 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005026 }
5027 }
5028 }
5029 }
5030
David Blaikie1cbb9712014-11-14 19:09:44 +00005031 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005032
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005033 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005034 if (RegNo == 0)
5035 return 0;
5036 if (RegNo == 1)
5037 return 1;
5038 return -1;
5039 }
5040};
5041
Tim Northover573cbee2014-05-24 12:52:07 +00005042const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005043 // 32-bit Integer registers
5044 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5045 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5046 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5047
5048 // 64-bit Integer registers
5049 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5050 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5051 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5052
5053 // 32-bit floating point regsisters
5054 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5055 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5056 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5057
5058 // 64-bit floating point regsisters
5059 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5060 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5061 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5062
5063 // Vector registers
5064 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5065 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5066 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5067};
5068
Tim Northover573cbee2014-05-24 12:52:07 +00005069void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005070 unsigned &NumNames) const {
5071 Names = GCCRegNames;
5072 NumNames = llvm::array_lengthof(GCCRegNames);
5073}
5074
Tim Northover573cbee2014-05-24 12:52:07 +00005075const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005076 { { "w31" }, "wsp" },
5077 { { "x29" }, "fp" },
5078 { { "x30" }, "lr" },
5079 { { "x31" }, "sp" },
5080 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5081 // don't want to substitute one of these for a different-sized one.
5082};
5083
Tim Northover573cbee2014-05-24 12:52:07 +00005084void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005085 unsigned &NumAliases) const {
5086 Aliases = GCCRegAliases;
5087 NumAliases = llvm::array_lengthof(GCCRegAliases);
5088}
5089
Tim Northover573cbee2014-05-24 12:52:07 +00005090const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005091#define BUILTIN(ID, TYPE, ATTRS) \
5092 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5093#include "clang/Basic/BuiltinsNEON.def"
5094
5095#define BUILTIN(ID, TYPE, ATTRS) \
5096 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00005097#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005098};
James Molloy5e73df52014-04-16 15:06:20 +00005099
Tim Northover573cbee2014-05-24 12:52:07 +00005100class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005101 void setDescriptionString() override {
5102 if (getTriple().isOSBinFormatMachO())
5103 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
5104 else
5105 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
5106 }
5107
5108public:
Tim Northover573cbee2014-05-24 12:52:07 +00005109 AArch64leTargetInfo(const llvm::Triple &Triple)
5110 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005111 BigEndian = false;
5112 }
5113 void getTargetDefines(const LangOptions &Opts,
5114 MacroBuilder &Builder) const override {
5115 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005116 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005117 }
5118};
5119
Tim Northover573cbee2014-05-24 12:52:07 +00005120class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005121 void setDescriptionString() override {
5122 assert(!getTriple().isOSBinFormatMachO());
5123 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
5124 }
5125
5126public:
Tim Northover573cbee2014-05-24 12:52:07 +00005127 AArch64beTargetInfo(const llvm::Triple &Triple)
5128 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005129 void getTargetDefines(const LangOptions &Opts,
5130 MacroBuilder &Builder) const override {
5131 Builder.defineMacro("__AARCH64EB__");
5132 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5133 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005134 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005135 }
5136};
Tim Northovera2ee4332014-03-29 15:09:45 +00005137
Tim Northover573cbee2014-05-24 12:52:07 +00005138class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005139protected:
5140 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5141 MacroBuilder &Builder) const override {
5142 Builder.defineMacro("__AARCH64_SIMD__");
5143 Builder.defineMacro("__ARM64_ARCH_8__");
5144 Builder.defineMacro("__ARM_NEON__");
5145 Builder.defineMacro("__LITTLE_ENDIAN__");
5146 Builder.defineMacro("__REGISTER_PREFIX__", "");
5147 Builder.defineMacro("__arm64", "1");
5148 Builder.defineMacro("__arm64__", "1");
5149
5150 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5151 }
5152
Tim Northovera2ee4332014-03-29 15:09:45 +00005153public:
Tim Northover573cbee2014-05-24 12:52:07 +00005154 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5155 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005156 Int64Type = SignedLongLong;
5157 WCharType = SignedInt;
5158 UseSignedCharForObjCBool = false;
5159
Tim Northovera6a19f12015-02-06 01:25:07 +00005160 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005161 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5162
5163 TheCXXABI.set(TargetCXXABI::iOS64);
5164 }
5165
David Blaikie1cbb9712014-11-14 19:09:44 +00005166 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005167 return TargetInfo::CharPtrBuiltinVaList;
5168 }
5169};
Tim Northovera2ee4332014-03-29 15:09:45 +00005170
Tony Linthicum76329bf2011-12-12 21:14:55 +00005171// Hexagon abstract base class
5172class HexagonTargetInfo : public TargetInfo {
5173 static const Builtin::Info BuiltinInfo[];
5174 static const char * const GCCRegNames[];
5175 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5176 std::string CPU;
5177public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005178 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005179 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005180 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005181
5182 // {} in inline assembly are packet specifiers, not assembly variant
5183 // specifiers.
5184 NoAsmVariants = true;
5185 }
5186
Craig Topper3164f332014-03-11 03:39:26 +00005187 void getTargetBuiltins(const Builtin::Info *&Records,
5188 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005189 Records = BuiltinInfo;
5190 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5191 }
5192
Craig Topper3164f332014-03-11 03:39:26 +00005193 bool validateAsmConstraint(const char *&Name,
5194 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005195 return true;
5196 }
5197
Craig Topper3164f332014-03-11 03:39:26 +00005198 void getTargetDefines(const LangOptions &Opts,
5199 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005200
Craig Topper3164f332014-03-11 03:39:26 +00005201 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005202 return Feature == "hexagon";
5203 }
Craig Topper3164f332014-03-11 03:39:26 +00005204
5205 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005206 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005207 }
Craig Topper3164f332014-03-11 03:39:26 +00005208 void getGCCRegNames(const char * const *&Names,
5209 unsigned &NumNames) const override;
5210 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5211 unsigned &NumAliases) const override;
5212 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005213 return "";
5214 }
Sebastian Pop86500282012-01-13 20:37:10 +00005215
5216 static const char *getHexagonCPUSuffix(StringRef Name) {
5217 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005218 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005219 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005220 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005221 }
5222
Craig Topper3164f332014-03-11 03:39:26 +00005223 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005224 if (!getHexagonCPUSuffix(Name))
5225 return false;
5226
Tony Linthicum76329bf2011-12-12 21:14:55 +00005227 CPU = Name;
5228 return true;
5229 }
5230};
5231
5232void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5233 MacroBuilder &Builder) const {
5234 Builder.defineMacro("qdsp6");
5235 Builder.defineMacro("__qdsp6", "1");
5236 Builder.defineMacro("__qdsp6__", "1");
5237
5238 Builder.defineMacro("hexagon");
5239 Builder.defineMacro("__hexagon", "1");
5240 Builder.defineMacro("__hexagon__", "1");
5241
5242 if(CPU == "hexagonv1") {
5243 Builder.defineMacro("__HEXAGON_V1__");
5244 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5245 if(Opts.HexagonQdsp6Compat) {
5246 Builder.defineMacro("__QDSP6_V1__");
5247 Builder.defineMacro("__QDSP6_ARCH__", "1");
5248 }
5249 }
5250 else if(CPU == "hexagonv2") {
5251 Builder.defineMacro("__HEXAGON_V2__");
5252 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5253 if(Opts.HexagonQdsp6Compat) {
5254 Builder.defineMacro("__QDSP6_V2__");
5255 Builder.defineMacro("__QDSP6_ARCH__", "2");
5256 }
5257 }
5258 else if(CPU == "hexagonv3") {
5259 Builder.defineMacro("__HEXAGON_V3__");
5260 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5261 if(Opts.HexagonQdsp6Compat) {
5262 Builder.defineMacro("__QDSP6_V3__");
5263 Builder.defineMacro("__QDSP6_ARCH__", "3");
5264 }
5265 }
5266 else if(CPU == "hexagonv4") {
5267 Builder.defineMacro("__HEXAGON_V4__");
5268 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5269 if(Opts.HexagonQdsp6Compat) {
5270 Builder.defineMacro("__QDSP6_V4__");
5271 Builder.defineMacro("__QDSP6_ARCH__", "4");
5272 }
5273 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005274 else if(CPU == "hexagonv5") {
5275 Builder.defineMacro("__HEXAGON_V5__");
5276 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5277 if(Opts.HexagonQdsp6Compat) {
5278 Builder.defineMacro("__QDSP6_V5__");
5279 Builder.defineMacro("__QDSP6_ARCH__", "5");
5280 }
5281 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005282}
5283
5284const char * const HexagonTargetInfo::GCCRegNames[] = {
5285 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5286 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5287 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5288 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5289 "p0", "p1", "p2", "p3",
5290 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5291};
5292
5293void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5294 unsigned &NumNames) const {
5295 Names = GCCRegNames;
5296 NumNames = llvm::array_lengthof(GCCRegNames);
5297}
5298
5299
5300const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5301 { { "sp" }, "r29" },
5302 { { "fp" }, "r30" },
5303 { { "lr" }, "r31" },
5304 };
5305
5306void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5307 unsigned &NumAliases) const {
5308 Aliases = GCCRegAliases;
5309 NumAliases = llvm::array_lengthof(GCCRegAliases);
5310}
5311
5312
5313const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5314#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5315#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5316 ALL_LANGUAGES },
5317#include "clang/Basic/BuiltinsHexagon.def"
5318};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005319
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005320// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5321class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005322 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5323 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005324 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005325public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005326 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005327
Craig Topper3164f332014-03-11 03:39:26 +00005328 bool handleTargetFeatures(std::vector<std::string> &Features,
5329 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005330 SoftFloat = false;
Eric Christopherfb481a42015-04-29 23:32:17 +00005331 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5332 if (Feature != Features.end()) {
5333 SoftFloat = true;
5334 Features.erase(Feature);
5335 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005336 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005337 }
Craig Topper3164f332014-03-11 03:39:26 +00005338 void getTargetDefines(const LangOptions &Opts,
5339 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005340 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005341 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005342
5343 if (SoftFloat)
5344 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005345 }
Craig Topper3164f332014-03-11 03:39:26 +00005346
5347 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005348 return llvm::StringSwitch<bool>(Feature)
5349 .Case("softfloat", SoftFloat)
5350 .Case("sparc", true)
5351 .Default(false);
5352 }
Craig Topper3164f332014-03-11 03:39:26 +00005353
5354 void getTargetBuiltins(const Builtin::Info *&Records,
5355 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005356 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005357 }
Craig Topper3164f332014-03-11 03:39:26 +00005358 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005359 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005360 }
Craig Topper3164f332014-03-11 03:39:26 +00005361 void getGCCRegNames(const char * const *&Names,
5362 unsigned &NumNames) const override;
5363 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5364 unsigned &NumAliases) const override;
5365 bool validateAsmConstraint(const char *&Name,
5366 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005367 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005368 switch (*Name) {
5369 case 'I': // Signed 13-bit constant
5370 case 'J': // Zero
5371 case 'K': // 32-bit constant with the low 12 bits clear
5372 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5373 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5374 case 'N': // Same as 'K' but zext (required for SIMode)
5375 case 'O': // The constant 4096
5376 return true;
5377 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005378 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005379 }
Craig Topper3164f332014-03-11 03:39:26 +00005380 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005381 // FIXME: Implement!
5382 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005383 }
5384};
5385
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005386const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005387 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5388 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5389 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5390 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5391};
5392
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005393void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5394 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005395 Names = GCCRegNames;
5396 NumNames = llvm::array_lengthof(GCCRegNames);
5397}
5398
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005399const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005400 { { "g0" }, "r0" },
5401 { { "g1" }, "r1" },
5402 { { "g2" }, "r2" },
5403 { { "g3" }, "r3" },
5404 { { "g4" }, "r4" },
5405 { { "g5" }, "r5" },
5406 { { "g6" }, "r6" },
5407 { { "g7" }, "r7" },
5408 { { "o0" }, "r8" },
5409 { { "o1" }, "r9" },
5410 { { "o2" }, "r10" },
5411 { { "o3" }, "r11" },
5412 { { "o4" }, "r12" },
5413 { { "o5" }, "r13" },
5414 { { "o6", "sp" }, "r14" },
5415 { { "o7" }, "r15" },
5416 { { "l0" }, "r16" },
5417 { { "l1" }, "r17" },
5418 { { "l2" }, "r18" },
5419 { { "l3" }, "r19" },
5420 { { "l4" }, "r20" },
5421 { { "l5" }, "r21" },
5422 { { "l6" }, "r22" },
5423 { { "l7" }, "r23" },
5424 { { "i0" }, "r24" },
5425 { { "i1" }, "r25" },
5426 { { "i2" }, "r26" },
5427 { { "i3" }, "r27" },
5428 { { "i4" }, "r28" },
5429 { { "i5" }, "r29" },
5430 { { "i6", "fp" }, "r30" },
5431 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005432};
5433
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005434void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5435 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005436 Aliases = GCCRegAliases;
5437 NumAliases = llvm::array_lengthof(GCCRegAliases);
5438}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005439
5440// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5441class SparcV8TargetInfo : public SparcTargetInfo {
5442public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005443 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005444 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005445 }
5446
Craig Topper3164f332014-03-11 03:39:26 +00005447 void getTargetDefines(const LangOptions &Opts,
5448 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005449 SparcTargetInfo::getTargetDefines(Opts, Builder);
5450 Builder.defineMacro("__sparcv8");
5451 }
5452};
5453
5454// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5455class SparcV9TargetInfo : public SparcTargetInfo {
5456public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005457 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005458 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005459 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005460 // This is an LP64 platform.
5461 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005462
5463 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005464 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005465 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005466 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005467 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005468 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005469
5470 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5471 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5472 LongDoubleWidth = 128;
5473 LongDoubleAlign = 128;
5474 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005475 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005476 }
5477
Craig Topper3164f332014-03-11 03:39:26 +00005478 void getTargetDefines(const LangOptions &Opts,
5479 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005480 SparcTargetInfo::getTargetDefines(Opts, Builder);
5481 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005482 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005483 // Solaris doesn't need these variants, but the BSDs do.
5484 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005485 Builder.defineMacro("__sparc64__");
5486 Builder.defineMacro("__sparc_v9__");
5487 Builder.defineMacro("__sparcv9__");
5488 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005489 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005490
Craig Topper3164f332014-03-11 03:39:26 +00005491 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005492 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5493 .Case("v9", true)
5494 .Case("ultrasparc", true)
5495 .Case("ultrasparc3", true)
5496 .Case("niagara", true)
5497 .Case("niagara2", true)
5498 .Case("niagara3", true)
5499 .Case("niagara4", true)
5500 .Default(false);
5501
5502 // No need to store the CPU yet. There aren't any CPU-specific
5503 // macros to define.
5504 return CPUKnown;
5505 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005506};
5507
Torok Edwinb2b37c62009-06-30 17:10:35 +00005508class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005509public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005510 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5511 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005512 SizeType = UnsignedInt;
5513 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005514 }
5515};
Chris Lattner5ba61f02006-10-14 07:39:34 +00005516
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005517class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005518 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005519 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005520 std::string CPU;
5521 bool HasTransactionalExecution;
Ulrich Weigand47445072013-05-06 16:26:41 +00005522
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005523public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005524 SystemZTargetInfo(const llvm::Triple &Triple)
5525 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005526 IntMaxType = SignedLong;
5527 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005528 TLSSupported = true;
5529 IntWidth = IntAlign = 32;
5530 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5531 PointerWidth = PointerAlign = 64;
5532 LongDoubleWidth = 128;
5533 LongDoubleAlign = 64;
5534 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005535 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005536 MinGlobalAlign = 16;
5537 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5538 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5539 }
5540 void getTargetDefines(const LangOptions &Opts,
5541 MacroBuilder &Builder) const override {
5542 Builder.defineMacro("__s390__");
5543 Builder.defineMacro("__s390x__");
5544 Builder.defineMacro("__zarch__");
5545 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005546 if (HasTransactionalExecution)
5547 Builder.defineMacro("__HTM__");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005548 }
5549 void getTargetBuiltins(const Builtin::Info *&Records,
5550 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005551 Records = BuiltinInfo;
5552 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005553 }
5554
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005555 void getGCCRegNames(const char *const *&Names,
5556 unsigned &NumNames) const override;
5557 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5558 unsigned &NumAliases) const override {
5559 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005560 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005561 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005562 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005563 bool validateAsmConstraint(const char *&Name,
5564 TargetInfo::ConstraintInfo &info) const override;
5565 const char *getClobbers() const override {
5566 // FIXME: Is this really right?
5567 return "";
5568 }
5569 BuiltinVaListKind getBuiltinVaListKind() const override {
5570 return TargetInfo::SystemZBuiltinVaList;
5571 }
5572 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005573 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005574 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5575 .Case("z10", true)
5576 .Case("z196", true)
5577 .Case("zEC12", true)
5578 .Default(false);
5579
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005580 return CPUKnown;
5581 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005582 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5583 if (CPU == "zEC12")
5584 Features["transactional-execution"] = true;
5585 }
5586
5587 bool handleTargetFeatures(std::vector<std::string> &Features,
5588 DiagnosticsEngine &Diags) override {
5589 HasTransactionalExecution = false;
5590 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5591 if (Features[i] == "+transactional-execution")
5592 HasTransactionalExecution = true;
5593 }
5594 return true;
5595 }
5596
5597 bool hasFeature(StringRef Feature) const override {
5598 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005599 .Case("systemz", true)
5600 .Case("htm", HasTransactionalExecution)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005601 .Default(false);
5602 }
5603};
5604
5605const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5606#define BUILTIN(ID, TYPE, ATTRS) \
5607 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5608#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005609};
5610
5611const char *const SystemZTargetInfo::GCCRegNames[] = {
5612 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5613 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5614 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5615 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5616};
5617
5618void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5619 unsigned &NumNames) const {
5620 Names = GCCRegNames;
5621 NumNames = llvm::array_lengthof(GCCRegNames);
5622}
5623
5624bool SystemZTargetInfo::
5625validateAsmConstraint(const char *&Name,
5626 TargetInfo::ConstraintInfo &Info) const {
5627 switch (*Name) {
5628 default:
5629 return false;
5630
5631 case 'a': // Address register
5632 case 'd': // Data register (equivalent to 'r')
5633 case 'f': // Floating-point register
5634 Info.setAllowsRegister();
5635 return true;
5636
5637 case 'I': // Unsigned 8-bit constant
5638 case 'J': // Unsigned 12-bit constant
5639 case 'K': // Signed 16-bit constant
5640 case 'L': // Signed 20-bit displacement (on all targets we support)
5641 case 'M': // 0x7fffffff
5642 return true;
5643
5644 case 'Q': // Memory with base and unsigned 12-bit displacement
5645 case 'R': // Likewise, plus an index
5646 case 'S': // Memory with base and signed 20-bit displacement
5647 case 'T': // Likewise, plus an index
5648 Info.setAllowsMemory();
5649 return true;
5650 }
5651}
Ulrich Weigand47445072013-05-06 16:26:41 +00005652
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005653 class MSP430TargetInfo : public TargetInfo {
5654 static const char * const GCCRegNames[];
5655 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005656 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005657 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005658 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005659 IntWidth = 16; IntAlign = 16;
5660 LongWidth = 32; LongLongWidth = 64;
5661 LongAlign = LongLongAlign = 16;
5662 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005663 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005664 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005665 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005666 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005667 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005668 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005669 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005670 }
5671 void getTargetDefines(const LangOptions &Opts,
5672 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005673 Builder.defineMacro("MSP430");
5674 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005675 // FIXME: defines for different 'flavours' of MCU
5676 }
Craig Topper3164f332014-03-11 03:39:26 +00005677 void getTargetBuiltins(const Builtin::Info *&Records,
5678 unsigned &NumRecords) const override {
5679 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005680 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005681 NumRecords = 0;
5682 }
Craig Topper3164f332014-03-11 03:39:26 +00005683 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005684 return Feature == "msp430";
5685 }
Craig Topper3164f332014-03-11 03:39:26 +00005686 void getGCCRegNames(const char * const *&Names,
5687 unsigned &NumNames) const override;
5688 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5689 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005690 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005691 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005692 NumAliases = 0;
5693 }
Eric Christopher917e9522014-11-18 22:36:15 +00005694 bool
5695 validateAsmConstraint(const char *&Name,
5696 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005697 // FIXME: implement
5698 switch (*Name) {
5699 case 'K': // the constant 1
5700 case 'L': // constant -1^20 .. 1^19
5701 case 'M': // constant 1-4:
5702 return true;
5703 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005704 // No target constraints for now.
5705 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005706 }
Craig Topper3164f332014-03-11 03:39:26 +00005707 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005708 // FIXME: Is this really right?
5709 return "";
5710 }
Craig Topper3164f332014-03-11 03:39:26 +00005711 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005712 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005713 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005714 }
5715 };
5716
5717 const char * const MSP430TargetInfo::GCCRegNames[] = {
5718 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5719 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5720 };
5721
5722 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5723 unsigned &NumNames) const {
5724 Names = GCCRegNames;
5725 NumNames = llvm::array_lengthof(GCCRegNames);
5726 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00005727
Mike Stump11289f42009-09-09 15:08:12 +00005728 // LLVM and Clang cannot be used directly to output native binaries for
5729 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005730 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005731 //
5732 // TCE uses the llvm bitcode as input and uses it for generating customized
5733 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005734 // publicly available in http://tce.cs.tut.fi
5735
Eli Friedman1f191002011-10-07 19:51:42 +00005736 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5737 3, // opencl_global
5738 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005739 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005740 // FIXME: generic has to be added to the target
5741 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005742 0, // cuda_device
5743 0, // cuda_constant
5744 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005745 };
5746
Eli Friedmana9c3d712009-08-19 20:47:07 +00005747 class TCETargetInfo : public TargetInfo{
5748 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005749 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005750 TLSSupported = false;
5751 IntWidth = 32;
5752 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005753 PointerWidth = 32;
5754 IntAlign = 32;
5755 LongAlign = LongLongAlign = 32;
5756 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005757 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005758 SizeType = UnsignedInt;
5759 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005760 IntPtrType = SignedInt;
5761 PtrDiffType = SignedInt;
5762 FloatWidth = 32;
5763 FloatAlign = 32;
5764 DoubleWidth = 32;
5765 DoubleAlign = 32;
5766 LongDoubleWidth = 32;
5767 LongDoubleAlign = 32;
5768 FloatFormat = &llvm::APFloat::IEEEsingle;
5769 DoubleFormat = &llvm::APFloat::IEEEsingle;
5770 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005771 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5772 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005773 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005774 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005775 }
5776
Craig Topper3164f332014-03-11 03:39:26 +00005777 void getTargetDefines(const LangOptions &Opts,
5778 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005779 DefineStd(Builder, "tce", Opts);
5780 Builder.defineMacro("__TCE__");
5781 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005782 }
Craig Topper3164f332014-03-11 03:39:26 +00005783 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005784 return Feature == "tce";
5785 }
Craig Topper3164f332014-03-11 03:39:26 +00005786
5787 void getTargetBuiltins(const Builtin::Info *&Records,
5788 unsigned &NumRecords) const override {}
5789 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005790 return "";
5791 }
Craig Topper3164f332014-03-11 03:39:26 +00005792 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005793 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005794 }
Craig Topper3164f332014-03-11 03:39:26 +00005795 void getGCCRegNames(const char * const *&Names,
5796 unsigned &NumNames) const override {}
5797 bool validateAsmConstraint(const char *&Name,
5798 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005799 return true;
5800 }
Craig Topper3164f332014-03-11 03:39:26 +00005801 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5802 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005803 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00005804
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005805class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005806 virtual void setDescriptionString() = 0;
5807
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005808 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005809 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005810 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005811 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005812 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005813 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005814 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005815 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005816 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005817 enum DspRevEnum {
5818 NoDSP, DSP1, DSP2
5819 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005820 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005821
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005822protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005823 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005824 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005825
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005826public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005827 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5828 const std::string &CPUStr)
5829 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005830 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00005831 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5832 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5833 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005834
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005835 bool isNaN2008Default() const {
5836 return CPU == "mips32r6" || CPU == "mips64r6";
5837 }
5838
5839 bool isFP64Default() const {
5840 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5841 }
5842
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00005843 bool isNan2008() const override {
5844 return IsNan2008;
5845 }
5846
Alp Toker4925ba72014-06-07 23:30:42 +00005847 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005848 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005849 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5850 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005851 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005852 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005853 .Case("mips1", IsMips32)
5854 .Case("mips2", IsMips32)
5855 .Case("mips3", true)
5856 .Case("mips4", true)
5857 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005858 .Case("mips32", IsMips32)
5859 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005860 .Case("mips32r3", IsMips32)
5861 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005862 .Case("mips32r6", IsMips32)
5863 .Case("mips64", true)
5864 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005865 .Case("mips64r3", true)
5866 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005867 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005868 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005869 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005870 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005871 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005872 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005873 if (CPU == "octeon")
5874 Features["mips64r2"] = Features["cnmips"] = true;
5875 else
5876 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005877 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005878
Craig Topper3164f332014-03-11 03:39:26 +00005879 void getTargetDefines(const LangOptions &Opts,
5880 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005881 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005882 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005883 if (Opts.GNUMode)
5884 Builder.defineMacro("mips");
5885
Simon Atanasyan683535b2012-08-29 19:14:58 +00005886 Builder.defineMacro("__REGISTER_PREFIX__", "");
5887
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005888 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005889 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005890 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005891 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005892 case SoftFloat:
5893 Builder.defineMacro("__mips_soft_float", Twine(1));
5894 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005895 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005896
Simon Atanasyan16071912013-04-14 14:07:30 +00005897 if (IsSingleFloat)
5898 Builder.defineMacro("__mips_single_float", Twine(1));
5899
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005900 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5901 Builder.defineMacro("_MIPS_FPSET",
5902 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5903
Simon Atanasyan72244b62012-07-05 16:06:06 +00005904 if (IsMips16)
5905 Builder.defineMacro("__mips16", Twine(1));
5906
Simon Atanasyan60777612013-04-14 14:07:51 +00005907 if (IsMicromips)
5908 Builder.defineMacro("__mips_micromips", Twine(1));
5909
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005910 if (IsNan2008)
5911 Builder.defineMacro("__mips_nan2008", Twine(1));
5912
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005913 switch (DspRev) {
5914 default:
5915 break;
5916 case DSP1:
5917 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5918 Builder.defineMacro("__mips_dsp", Twine(1));
5919 break;
5920 case DSP2:
5921 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5922 Builder.defineMacro("__mips_dspr2", Twine(1));
5923 Builder.defineMacro("__mips_dsp", Twine(1));
5924 break;
5925 }
5926
Jack Carter44ff1e52013-08-12 17:20:29 +00005927 if (HasMSA)
5928 Builder.defineMacro("__mips_msa", Twine(1));
5929
Simon Atanasyan26f19672012-04-05 19:28:31 +00005930 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5931 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5932 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005933
5934 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5935 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005936 }
5937
Craig Topper3164f332014-03-11 03:39:26 +00005938 void getTargetBuiltins(const Builtin::Info *&Records,
5939 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005940 Records = BuiltinInfo;
5941 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005942 }
Craig Topper3164f332014-03-11 03:39:26 +00005943 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005944 return llvm::StringSwitch<bool>(Feature)
5945 .Case("mips", true)
5946 .Case("fp64", HasFP64)
5947 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005948 }
Craig Topper3164f332014-03-11 03:39:26 +00005949 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005950 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005951 }
Craig Topper3164f332014-03-11 03:39:26 +00005952 void getGCCRegNames(const char * const *&Names,
5953 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005954 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005955 // CPU register names
5956 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005957 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5958 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5959 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005960 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5961 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005962 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5963 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5964 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5965 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005966 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005967 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005968 "$fcc5","$fcc6","$fcc7",
5969 // MSA register names
5970 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5971 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5972 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5973 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5974 // MSA control register names
5975 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5976 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005977 };
5978 Names = GCCRegNames;
5979 NumNames = llvm::array_lengthof(GCCRegNames);
5980 }
Craig Topper3164f332014-03-11 03:39:26 +00005981 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5982 unsigned &NumAliases) const override = 0;
5983 bool validateAsmConstraint(const char *&Name,
5984 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005985 switch (*Name) {
5986 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005987 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005988 case 'r': // CPU registers.
5989 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005990 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005991 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005992 case 'c': // $25 for indirect jumps
5993 case 'l': // lo register
5994 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005995 Info.setAllowsRegister();
5996 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005997 case 'I': // Signed 16-bit constant
5998 case 'J': // Integer 0
5999 case 'K': // Unsigned 16-bit constant
6000 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6001 case 'M': // Constants not loadable via lui, addiu, or ori
6002 case 'N': // Constant -1 to -65535
6003 case 'O': // A signed 15-bit constant
6004 case 'P': // A constant between 1 go 65535
6005 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006006 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006007 Info.setAllowsMemory();
6008 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006009 case 'Z':
6010 if (Name[1] == 'C') { // An address usable by ll, and sc.
6011 Info.setAllowsMemory();
6012 Name++; // Skip over 'Z'.
6013 return true;
6014 }
6015 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006016 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006017 }
6018
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006019 std::string convertConstraint(const char *&Constraint) const override {
6020 std::string R;
6021 switch (*Constraint) {
6022 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6023 if (Constraint[1] == 'C') {
6024 R = std::string("^") + std::string(Constraint, 2);
6025 Constraint++;
6026 return R;
6027 }
6028 break;
6029 }
6030 return TargetInfo::convertConstraint(Constraint);
6031 }
6032
Craig Topper3164f332014-03-11 03:39:26 +00006033 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006034 // In GCC, $1 is not widely used in generated code (it's used only in a few
6035 // specific situations), so there is no real need for users to add it to
6036 // the clobbers list if they want to use it in their inline assembly code.
6037 //
6038 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6039 // code generation, so using it in inline assembly without adding it to the
6040 // clobbers list can cause conflicts between the inline assembly code and
6041 // the surrounding generated code.
6042 //
6043 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6044 // operands, which will conflict with the ".set at" assembler option (which
6045 // we use only for inline assembly, in order to maintain compatibility with
6046 // GCC) and will also conflict with the user's usage of $1.
6047 //
6048 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6049 // register for generated code is to automatically clobber $1 for all inline
6050 // assembly code.
6051 //
6052 // FIXME: We should automatically clobber $1 only for inline assembly code
6053 // which actually uses it. This would allow LLVM to use $1 for inline
6054 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006055 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006056 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006057
Craig Topper3164f332014-03-11 03:39:26 +00006058 bool handleTargetFeatures(std::vector<std::string> &Features,
6059 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006060 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006061 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006062 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006063 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006064 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006065 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006066 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006067
6068 for (std::vector<std::string>::iterator it = Features.begin(),
6069 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006070 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006071 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006072 else if (*it == "+soft-float")
6073 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006074 else if (*it == "+mips16")
6075 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00006076 else if (*it == "+micromips")
6077 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006078 else if (*it == "+dsp")
6079 DspRev = std::max(DspRev, DSP1);
6080 else if (*it == "+dspr2")
6081 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00006082 else if (*it == "+msa")
6083 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006084 else if (*it == "+fp64")
6085 HasFP64 = true;
6086 else if (*it == "-fp64")
6087 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006088 else if (*it == "+nan2008")
6089 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006090 else if (*it == "-nan2008")
6091 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006092 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006093
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006094 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006095 std::vector<std::string>::iterator it =
6096 std::find(Features.begin(), Features.end(), "+soft-float");
6097 if (it != Features.end())
6098 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00006099
Akira Hatanaka9064e362013-10-29 18:30:33 +00006100 setDescriptionString();
6101
Rafael Espindolaeb265472013-08-21 21:59:03 +00006102 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006103 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006104
Craig Topper3164f332014-03-11 03:39:26 +00006105 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006106 if (RegNo == 0) return 4;
6107 if (RegNo == 1) return 5;
6108 return -1;
6109 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006110
6111 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006112};
6113
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006114const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
6115#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6116#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6117 ALL_LANGUAGES },
6118#include "clang/Basic/BuiltinsMips.def"
6119};
6120
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006121class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006122public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006123 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006124 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006125 SizeType = UnsignedInt;
6126 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006127 Int64Type = SignedLongLong;
6128 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006129 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006130 }
Craig Topper3164f332014-03-11 03:39:26 +00006131 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006132 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006133 ABI = Name;
6134 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006135 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006136 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006137 }
Craig Topper3164f332014-03-11 03:39:26 +00006138 void getTargetDefines(const LangOptions &Opts,
6139 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006140 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006141
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006142 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006143 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6144
6145 const std::string& CPUStr = getCPU();
6146 if (CPUStr == "mips32")
6147 Builder.defineMacro("__mips_isa_rev", "1");
6148 else if (CPUStr == "mips32r2")
6149 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006150 else if (CPUStr == "mips32r3")
6151 Builder.defineMacro("__mips_isa_rev", "3");
6152 else if (CPUStr == "mips32r5")
6153 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006154 else if (CPUStr == "mips32r6")
6155 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006156
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006157 if (ABI == "o32") {
6158 Builder.defineMacro("__mips_o32");
6159 Builder.defineMacro("_ABIO32", "1");
6160 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6161 }
6162 else if (ABI == "eabi")
6163 Builder.defineMacro("__mips_eabi");
6164 else
David Blaikie83d382b2011-09-23 05:06:16 +00006165 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006166 }
Craig Topper3164f332014-03-11 03:39:26 +00006167 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6168 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006169 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6170 { { "at" }, "$1" },
6171 { { "v0" }, "$2" },
6172 { { "v1" }, "$3" },
6173 { { "a0" }, "$4" },
6174 { { "a1" }, "$5" },
6175 { { "a2" }, "$6" },
6176 { { "a3" }, "$7" },
6177 { { "t0" }, "$8" },
6178 { { "t1" }, "$9" },
6179 { { "t2" }, "$10" },
6180 { { "t3" }, "$11" },
6181 { { "t4" }, "$12" },
6182 { { "t5" }, "$13" },
6183 { { "t6" }, "$14" },
6184 { { "t7" }, "$15" },
6185 { { "s0" }, "$16" },
6186 { { "s1" }, "$17" },
6187 { { "s2" }, "$18" },
6188 { { "s3" }, "$19" },
6189 { { "s4" }, "$20" },
6190 { { "s5" }, "$21" },
6191 { { "s6" }, "$22" },
6192 { { "s7" }, "$23" },
6193 { { "t8" }, "$24" },
6194 { { "t9" }, "$25" },
6195 { { "k0" }, "$26" },
6196 { { "k1" }, "$27" },
6197 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006198 { { "sp","$sp" }, "$29" },
6199 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006200 { { "ra" }, "$31" }
6201 };
6202 Aliases = GCCRegAliases;
6203 NumAliases = llvm::array_lengthof(GCCRegAliases);
6204 }
6205};
6206
6207class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006208 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006209 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006210 }
6211
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006212public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006213 Mips32EBTargetInfo(const llvm::Triple &Triple)
6214 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006215 }
Craig Topper3164f332014-03-11 03:39:26 +00006216 void getTargetDefines(const LangOptions &Opts,
6217 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006218 DefineStd(Builder, "MIPSEB", Opts);
6219 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006220 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006221 }
6222};
6223
6224class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006225 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006226 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006227 }
6228
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006229public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006230 Mips32ELTargetInfo(const llvm::Triple &Triple)
6231 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006232 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006233 }
Craig Topper3164f332014-03-11 03:39:26 +00006234 void getTargetDefines(const LangOptions &Opts,
6235 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006236 DefineStd(Builder, "MIPSEL", Opts);
6237 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006238 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006239 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006240};
Akira Hatanakabef17452011-09-20 19:21:49 +00006241
6242class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006243public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006244 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006245 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006246 LongDoubleWidth = LongDoubleAlign = 128;
6247 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006248 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6249 LongDoubleWidth = LongDoubleAlign = 64;
6250 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6251 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006252 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006253 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006254 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006255 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006256
6257 void setN64ABITypes() {
6258 LongWidth = LongAlign = 64;
6259 PointerWidth = PointerAlign = 64;
6260 SizeType = UnsignedLong;
6261 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006262 Int64Type = SignedLong;
6263 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006264 }
6265
6266 void setN32ABITypes() {
6267 LongWidth = LongAlign = 32;
6268 PointerWidth = PointerAlign = 32;
6269 SizeType = UnsignedInt;
6270 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006271 Int64Type = SignedLongLong;
6272 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006273 }
6274
Craig Topper3164f332014-03-11 03:39:26 +00006275 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006276 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006277 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006278 ABI = Name;
6279 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006280 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006281 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006282 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006283 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006284 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006285 }
6286 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006287 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006288
Craig Topper3164f332014-03-11 03:39:26 +00006289 void getTargetDefines(const LangOptions &Opts,
6290 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006291 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006292
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006293 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006294 Builder.defineMacro("__mips64");
6295 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006296 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6297
6298 const std::string& CPUStr = getCPU();
6299 if (CPUStr == "mips64")
6300 Builder.defineMacro("__mips_isa_rev", "1");
6301 else if (CPUStr == "mips64r2")
6302 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006303 else if (CPUStr == "mips64r3")
6304 Builder.defineMacro("__mips_isa_rev", "3");
6305 else if (CPUStr == "mips64r5")
6306 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006307 else if (CPUStr == "mips64r6")
6308 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006309
Akira Hatanakabef17452011-09-20 19:21:49 +00006310 if (ABI == "n32") {
6311 Builder.defineMacro("__mips_n32");
6312 Builder.defineMacro("_ABIN32", "2");
6313 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6314 }
6315 else if (ABI == "n64") {
6316 Builder.defineMacro("__mips_n64");
6317 Builder.defineMacro("_ABI64", "3");
6318 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6319 }
6320 else
David Blaikie83d382b2011-09-23 05:06:16 +00006321 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006322 }
Craig Topper3164f332014-03-11 03:39:26 +00006323 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6324 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006325 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6326 { { "at" }, "$1" },
6327 { { "v0" }, "$2" },
6328 { { "v1" }, "$3" },
6329 { { "a0" }, "$4" },
6330 { { "a1" }, "$5" },
6331 { { "a2" }, "$6" },
6332 { { "a3" }, "$7" },
6333 { { "a4" }, "$8" },
6334 { { "a5" }, "$9" },
6335 { { "a6" }, "$10" },
6336 { { "a7" }, "$11" },
6337 { { "t0" }, "$12" },
6338 { { "t1" }, "$13" },
6339 { { "t2" }, "$14" },
6340 { { "t3" }, "$15" },
6341 { { "s0" }, "$16" },
6342 { { "s1" }, "$17" },
6343 { { "s2" }, "$18" },
6344 { { "s3" }, "$19" },
6345 { { "s4" }, "$20" },
6346 { { "s5" }, "$21" },
6347 { { "s6" }, "$22" },
6348 { { "s7" }, "$23" },
6349 { { "t8" }, "$24" },
6350 { { "t9" }, "$25" },
6351 { { "k0" }, "$26" },
6352 { { "k1" }, "$27" },
6353 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006354 { { "sp","$sp" }, "$29" },
6355 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006356 { { "ra" }, "$31" }
6357 };
6358 Aliases = GCCRegAliases;
6359 NumAliases = llvm::array_lengthof(GCCRegAliases);
6360 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006361
6362 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006363};
6364
6365class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006366 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006367 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006368 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 +00006369 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006370 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006371
Akira Hatanakabef17452011-09-20 19:21:49 +00006372 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006373
Akira Hatanakabef17452011-09-20 19:21:49 +00006374public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006375 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006376 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006377 void getTargetDefines(const LangOptions &Opts,
6378 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006379 DefineStd(Builder, "MIPSEB", Opts);
6380 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006381 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006382 }
6383};
6384
6385class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006386 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006387 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006388 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 +00006389 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006390 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006391 }
6392public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006393 Mips64ELTargetInfo(const llvm::Triple &Triple)
6394 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006395 // Default ABI is n64.
6396 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006397 }
Craig Topper3164f332014-03-11 03:39:26 +00006398 void getTargetDefines(const LangOptions &Opts,
6399 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006400 DefineStd(Builder, "MIPSEL", Opts);
6401 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006402 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006403 }
6404};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006405
Ivan Krasindd7403e2011-08-24 20:22:22 +00006406class PNaClTargetInfo : public TargetInfo {
6407public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006408 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006409 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006410 this->UserLabelPrefix = "";
6411 this->LongAlign = 32;
6412 this->LongWidth = 32;
6413 this->PointerAlign = 32;
6414 this->PointerWidth = 32;
6415 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006416 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006417 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006418 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006419 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006420 this->SizeType = TargetInfo::UnsignedInt;
6421 this->PtrDiffType = TargetInfo::SignedInt;
6422 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006423 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006424 }
6425
Craig Topper3164f332014-03-11 03:39:26 +00006426 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006427 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006428 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006429 Builder.defineMacro("__le32__");
6430 Builder.defineMacro("__pnacl__");
6431 }
Craig Topper3164f332014-03-11 03:39:26 +00006432 void getTargetDefines(const LangOptions &Opts,
6433 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006434 getArchDefines(Opts, Builder);
6435 }
Craig Topper3164f332014-03-11 03:39:26 +00006436 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006437 return Feature == "pnacl";
6438 }
Craig Topper3164f332014-03-11 03:39:26 +00006439 void getTargetBuiltins(const Builtin::Info *&Records,
6440 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006441 }
Craig Topper3164f332014-03-11 03:39:26 +00006442 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006443 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006444 }
Craig Topper3164f332014-03-11 03:39:26 +00006445 void getGCCRegNames(const char * const *&Names,
6446 unsigned &NumNames) const override;
6447 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6448 unsigned &NumAliases) const override;
6449 bool validateAsmConstraint(const char *&Name,
6450 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006451 return false;
6452 }
6453
Craig Topper3164f332014-03-11 03:39:26 +00006454 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006455 return "";
6456 }
6457};
6458
6459void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6460 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006461 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006462 NumNames = 0;
6463}
6464
6465void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6466 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006467 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006468 NumAliases = 0;
6469}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006470
JF Bastien643817d2014-09-12 17:52:47 +00006471class Le64TargetInfo : public TargetInfo {
6472 static const Builtin::Info BuiltinInfo[];
6473
6474public:
6475 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6476 BigEndian = false;
6477 NoAsmVariants = true;
6478 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6479 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6480 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006481 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006482 }
6483
6484 void getTargetDefines(const LangOptions &Opts,
6485 MacroBuilder &Builder) const override {
6486 DefineStd(Builder, "unix", Opts);
6487 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6488 Builder.defineMacro("__ELF__");
6489 }
6490 void getTargetBuiltins(const Builtin::Info *&Records,
6491 unsigned &NumRecords) const override {
6492 Records = BuiltinInfo;
6493 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6494 }
6495 BuiltinVaListKind getBuiltinVaListKind() const override {
6496 return TargetInfo::PNaClABIBuiltinVaList;
6497 }
6498 const char *getClobbers() const override { return ""; }
6499 void getGCCRegNames(const char *const *&Names,
6500 unsigned &NumNames) const override {
6501 Names = nullptr;
6502 NumNames = 0;
6503 }
6504 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6505 unsigned &NumAliases) const override {
6506 Aliases = nullptr;
6507 NumAliases = 0;
6508 }
6509 bool validateAsmConstraint(const char *&Name,
6510 TargetInfo::ConstraintInfo &Info) const override {
6511 return false;
6512 }
6513
6514 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006515};
6516} // end anonymous namespace.
6517
6518const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6519#define BUILTIN(ID, TYPE, ATTRS) \
6520 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6521#include "clang/Basic/BuiltinsLe64.def"
6522};
6523
6524namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006525 static const unsigned SPIRAddrSpaceMap[] = {
6526 1, // opencl_global
6527 3, // opencl_local
6528 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006529 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006530 0, // cuda_device
6531 0, // cuda_constant
6532 0 // cuda_shared
6533 };
6534 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006535 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006536 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006537 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6538 "SPIR target must use unknown OS");
6539 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6540 "SPIR target must use unknown environment type");
6541 BigEndian = false;
6542 TLSSupported = false;
6543 LongWidth = LongAlign = 64;
6544 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006545 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006546 // Define available target features
6547 // These must be defined in sorted order!
6548 NoAsmVariants = true;
6549 }
Craig Topper3164f332014-03-11 03:39:26 +00006550 void getTargetDefines(const LangOptions &Opts,
6551 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006552 DefineStd(Builder, "SPIR", Opts);
6553 }
Craig Topper3164f332014-03-11 03:39:26 +00006554 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006555 return Feature == "spir";
6556 }
Craig Topper3164f332014-03-11 03:39:26 +00006557
6558 void getTargetBuiltins(const Builtin::Info *&Records,
6559 unsigned &NumRecords) const override {}
6560 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006561 return "";
6562 }
Craig Topper3164f332014-03-11 03:39:26 +00006563 void getGCCRegNames(const char * const *&Names,
6564 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006565 bool
6566 validateAsmConstraint(const char *&Name,
6567 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006568 return true;
6569 }
Craig Topper3164f332014-03-11 03:39:26 +00006570 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6571 unsigned &NumAliases) const override {}
6572 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006573 return TargetInfo::VoidPtrBuiltinVaList;
6574 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006575
6576 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6577 return (CC == CC_SpirFunction ||
6578 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6579 }
6580
6581 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6582 return CC_SpirFunction;
6583 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006584 };
6585
6586
6587 class SPIR32TargetInfo : public SPIRTargetInfo {
6588 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006589 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006590 PointerWidth = PointerAlign = 32;
6591 SizeType = TargetInfo::UnsignedInt;
6592 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6593 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006594 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6595 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006596 }
Craig Topper3164f332014-03-11 03:39:26 +00006597 void getTargetDefines(const LangOptions &Opts,
6598 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006599 DefineStd(Builder, "SPIR32", Opts);
6600 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006601 };
6602
6603 class SPIR64TargetInfo : public SPIRTargetInfo {
6604 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006605 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006606 PointerWidth = PointerAlign = 64;
6607 SizeType = TargetInfo::UnsignedLong;
6608 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006609 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6610 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006611 }
Craig Topper3164f332014-03-11 03:39:26 +00006612 void getTargetDefines(const LangOptions &Opts,
6613 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006614 DefineStd(Builder, "SPIR64", Opts);
6615 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006616 };
Guy Benyeib798fc92012-12-11 21:38:14 +00006617
Robert Lytton0e076492013-08-13 09:43:10 +00006618class XCoreTargetInfo : public TargetInfo {
6619 static const Builtin::Info BuiltinInfo[];
6620public:
6621 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6622 BigEndian = false;
6623 NoAsmVariants = true;
6624 LongLongAlign = 32;
6625 SuitableAlign = 32;
6626 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006627 SizeType = UnsignedInt;
6628 PtrDiffType = SignedInt;
6629 IntPtrType = SignedInt;
6630 WCharType = UnsignedChar;
6631 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006632 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006633 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 +00006634 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006635 }
Craig Topper3164f332014-03-11 03:39:26 +00006636 void getTargetDefines(const LangOptions &Opts,
6637 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006638 Builder.defineMacro("__XS1B__");
6639 }
Craig Topper3164f332014-03-11 03:39:26 +00006640 void getTargetBuiltins(const Builtin::Info *&Records,
6641 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006642 Records = BuiltinInfo;
6643 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6644 }
Craig Topper3164f332014-03-11 03:39:26 +00006645 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006646 return TargetInfo::VoidPtrBuiltinVaList;
6647 }
Craig Topper3164f332014-03-11 03:39:26 +00006648 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006649 return "";
6650 }
Craig Topper3164f332014-03-11 03:39:26 +00006651 void getGCCRegNames(const char * const *&Names,
6652 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006653 static const char * const GCCRegNames[] = {
6654 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6655 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6656 };
6657 Names = GCCRegNames;
6658 NumNames = llvm::array_lengthof(GCCRegNames);
6659 }
Craig Topper3164f332014-03-11 03:39:26 +00006660 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6661 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006662 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006663 NumAliases = 0;
6664 }
Craig Topper3164f332014-03-11 03:39:26 +00006665 bool validateAsmConstraint(const char *&Name,
6666 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006667 return false;
6668 }
Craig Topper3164f332014-03-11 03:39:26 +00006669 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006670 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6671 return (RegNo < 2)? RegNo : -1;
6672 }
Robert Lytton0e076492013-08-13 09:43:10 +00006673};
6674
6675const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6676#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6677#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6678 ALL_LANGUAGES },
6679#include "clang/Basic/BuiltinsXCore.def"
6680};
6681} // end anonymous namespace.
6682
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006683namespace {
6684// x86_32 Android target
6685class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
6686public:
6687 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
6688 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
6689 SuitableAlign = 32;
6690 LongDoubleWidth = 64;
6691 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6692 }
6693};
6694} // end anonymous namespace
6695
6696namespace {
6697// x86_64 Android target
6698class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
6699public:
6700 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
6701 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
6702 LongDoubleFormat = &llvm::APFloat::IEEEquad;
6703 }
6704};
6705} // end anonymous namespace
6706
Ivan Krasindd7403e2011-08-24 20:22:22 +00006707
Chris Lattner5ba61f02006-10-14 07:39:34 +00006708//===----------------------------------------------------------------------===//
6709// Driver code
6710//===----------------------------------------------------------------------===//
6711
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006712static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006713 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006714
Daniel Dunbar52322032009-08-18 05:47:58 +00006715 switch (Triple.getArch()) {
6716 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006717 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006718
Tim Northover2a0783d2014-05-30 14:14:07 +00006719 case llvm::Triple::xcore:
6720 return new XCoreTargetInfo(Triple);
6721
6722 case llvm::Triple::hexagon:
6723 return new HexagonTargetInfo(Triple);
6724
6725 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006726 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006727 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006728
6729 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006730 case llvm::Triple::FreeBSD:
6731 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006732 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006733 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006734 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006735 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006736 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006737 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006738 }
6739
Christian Pirker9b019ae2014-02-25 13:51:00 +00006740 case llvm::Triple::aarch64_be:
6741 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006742 case llvm::Triple::FreeBSD:
6743 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006744 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006745 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006746 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006747 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006748 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006749 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006750 }
6751
Daniel Dunbar52322032009-08-18 05:47:58 +00006752 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006753 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006754 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006755 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006756
Daniel Dunbar52322032009-08-18 05:47:58 +00006757 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006758 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006759 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006760 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006761 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006762 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006763 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006764 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006765 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006766 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006767 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006768 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006769 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006770 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006771 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006772 case llvm::Triple::Win32:
6773 switch (Triple.getEnvironment()) {
6774 default:
6775 return new ARMleTargetInfo(Triple);
6776 case llvm::Triple::Itanium:
6777 return new ItaniumWindowsARMleTargetInfo(Triple);
6778 case llvm::Triple::MSVC:
6779 return new MicrosoftARMleTargetInfo(Triple);
6780 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006781 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006782 return new ARMleTargetInfo(Triple);
6783 }
6784
6785 case llvm::Triple::armeb:
6786 case llvm::Triple::thumbeb:
6787 if (Triple.isOSDarwin())
6788 return new DarwinARMTargetInfo(Triple);
6789
6790 switch (os) {
6791 case llvm::Triple::Linux:
6792 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6793 case llvm::Triple::FreeBSD:
6794 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6795 case llvm::Triple::NetBSD:
6796 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6797 case llvm::Triple::OpenBSD:
6798 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6799 case llvm::Triple::Bitrig:
6800 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6801 case llvm::Triple::RTEMS:
6802 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6803 case llvm::Triple::NaCl:
6804 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6805 default:
6806 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006807 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006808
Daniel Dunbar52322032009-08-18 05:47:58 +00006809 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006810 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006811
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006812 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006813 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006814 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006815 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006816 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006817 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006818 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006819 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006820 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006821 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006822 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006823 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006824 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006825
6826 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006827 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006828 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006829 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006830 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006831 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006832 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006833 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006834 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006835 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006836 case llvm::Triple::NaCl:
6837 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006838 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006839 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006840 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006841
Akira Hatanakabef17452011-09-20 19:21:49 +00006842 case llvm::Triple::mips64:
6843 switch (os) {
6844 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006845 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006846 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006847 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006848 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006849 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006850 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006851 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006852 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006853 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006854 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006855 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006856 }
6857
6858 case llvm::Triple::mips64el:
6859 switch (os) {
6860 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006861 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006862 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006863 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006864 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006865 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006866 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006867 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006868 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006869 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006870 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006871 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006872 }
6873
Ivan Krasindd7403e2011-08-24 20:22:22 +00006874 case llvm::Triple::le32:
6875 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006876 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006877 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006878 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006879 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006880 }
6881
JF Bastien643817d2014-09-12 17:52:47 +00006882 case llvm::Triple::le64:
6883 return new Le64TargetInfo(Triple);
6884
Daniel Dunbar52322032009-08-18 05:47:58 +00006885 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006886 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006887 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006888 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006889 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006890 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006891 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006892 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006893 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006894 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006895 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006896 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006897 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006898 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006899 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006900 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006901 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006902
6903 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006904 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006905 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006906 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006907 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006908 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006909 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006910 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006911 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006912 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006913 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006914 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006915 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006916 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006917 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006918
Bill Schmidt778d3872013-07-26 01:36:11 +00006919 case llvm::Triple::ppc64le:
6920 switch (os) {
6921 case llvm::Triple::Linux:
6922 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00006923 case llvm::Triple::NetBSD:
6924 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00006925 default:
6926 return new PPC64TargetInfo(Triple);
6927 }
6928
Peter Collingbournec947aae2012-05-20 23:28:41 +00006929 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006930 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006931 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006932 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006933
Tom Stellardd8e38a32015-01-06 20:34:47 +00006934 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00006935 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006936 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006937
Daniel Dunbar52322032009-08-18 05:47:58 +00006938 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006939 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006940 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006941 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006942 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006943 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006944 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006945 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006946 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006947 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006948 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006949 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006950 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006951 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006952 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006953
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006954 case llvm::Triple::sparcv9:
6955 switch (os) {
6956 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006957 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006958 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006959 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006960 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006961 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006962 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006963 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006964 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006965 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006966 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006967 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006968 }
6969
Ulrich Weigand47445072013-05-06 16:26:41 +00006970 case llvm::Triple::systemz:
6971 switch (os) {
6972 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006973 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006974 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006975 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006976 }
6977
Eli Friedmana9c3d712009-08-19 20:47:07 +00006978 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006979 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006980
Daniel Dunbar52322032009-08-18 05:47:58 +00006981 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006982 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006983 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006984
Daniel Dunbar52322032009-08-18 05:47:58 +00006985 switch (os) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006986 case llvm::Triple::Linux: {
6987 switch (Triple.getEnvironment()) {
6988 default:
6989 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
6990 case llvm::Triple::Android:
6991 return new AndroidX86_32TargetInfo(Triple);
6992 }
6993 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006994 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006995 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006996 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006997 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006998 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006999 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007000 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007001 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007002 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007003 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007004 case llvm::Triple::KFreeBSD:
7005 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007006 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007007 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007008 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007009 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007010 case llvm::Triple::Win32: {
7011 switch (Triple.getEnvironment()) {
7012 default:
7013 return new X86_32TargetInfo(Triple);
7014 case llvm::Triple::Cygnus:
7015 return new CygwinX86_32TargetInfo(Triple);
7016 case llvm::Triple::GNU:
7017 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007018 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007019 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007020 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007021 }
7022 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007023 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007024 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007025 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007026 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007027 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007028 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007029 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007030 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007031 }
7032
7033 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007034 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007035 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007036
Daniel Dunbar52322032009-08-18 05:47:58 +00007037 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007038 case llvm::Triple::CloudABI:
7039 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007040 case llvm::Triple::Linux: {
7041 switch (Triple.getEnvironment()) {
7042 default:
7043 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7044 case llvm::Triple::Android:
7045 return new AndroidX86_64TargetInfo(Triple);
7046 }
7047 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007048 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007049 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007050 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007051 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007052 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007053 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007054 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007055 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007056 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007057 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007058 case llvm::Triple::KFreeBSD:
7059 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007060 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007061 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007062 case llvm::Triple::Win32: {
7063 switch (Triple.getEnvironment()) {
7064 default:
7065 return new X86_64TargetInfo(Triple);
7066 case llvm::Triple::GNU:
7067 return new MinGWX86_64TargetInfo(Triple);
7068 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007069 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007070 }
7071 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007072 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007073 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007074 case llvm::Triple::PS4:
7075 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007076 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007077 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007078 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007079
7080 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00007081 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007082 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00007083 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007084 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00007085 }
7086 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00007087 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007088 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00007089 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007090 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00007091 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007092 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007093}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007094
7095/// CreateTargetInfo - Return the target info object for the specified target
7096/// triple.
Alp Toker80758082014-07-06 05:26:44 +00007097TargetInfo *
7098TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7099 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007100 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007101
7102 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007103 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007104 if (!Target) {
7105 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007106 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007107 }
Alp Toker80758082014-07-06 05:26:44 +00007108 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007109
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007110 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007111 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7112 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007113 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007114 }
7115
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007116 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007117 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7118 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007119 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007120 }
7121
Rafael Espindolaeb265472013-08-21 21:59:03 +00007122 // Set the fp math unit.
7123 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7124 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007125 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007126 }
7127
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007128 // Compute the default target features, we need the target to handle this
7129 // because features may have dependencies on one another.
7130 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00007131 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007132
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007133 // Apply the user specified deltas.
7134 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
7135 I < N; ++I) {
7136 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00007137 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007138 bool Enabled = Name[0] == '+';
7139 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007140 }
7141
7142 // Add the features to the compile options.
7143 //
7144 // FIXME: If we are completely confident that we have the right set, we only
7145 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007146 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007147 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
7148 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00007149 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00007150 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007151 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007152
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007153 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007154}