blob: 082520583cce3a9bc98cedd03e3fa1bf4c7698a3 [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;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000746 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000747 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000748 bool HasBPERMD;
749 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000750
Ulrich Weigand8afad612014-07-28 13:17:52 +0000751protected:
752 std::string ABI;
753
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000754public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000755 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000756 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000757 HasP8Crypto(false), HasQPX(false), HasHTM(false),
758 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000759 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000760 LongDoubleWidth = LongDoubleAlign = 128;
761 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
762 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000763
Hal Finkel6b984f02012-07-03 16:51:04 +0000764 /// \brief Flags for architecture specific defines.
765 typedef enum {
766 ArchDefineNone = 0,
767 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
768 ArchDefinePpcgr = 1 << 1,
769 ArchDefinePpcsq = 1 << 2,
770 ArchDefine440 = 1 << 3,
771 ArchDefine603 = 1 << 4,
772 ArchDefine604 = 1 << 5,
773 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000774 ArchDefinePwr5 = 1 << 7,
775 ArchDefinePwr5x = 1 << 8,
776 ArchDefinePwr6 = 1 << 9,
777 ArchDefinePwr6x = 1 << 10,
778 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000779 ArchDefinePwr8 = 1 << 12,
780 ArchDefineA2 = 1 << 13,
781 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000782 } ArchDefineTypes;
783
Bill Schmidt38378a02013-02-01 20:23:10 +0000784 // Note: GCC recognizes the following additional cpus:
785 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
786 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
787 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000788 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000789 bool CPUKnown = llvm::StringSwitch<bool>(Name)
790 .Case("generic", true)
791 .Case("440", true)
792 .Case("450", true)
793 .Case("601", true)
794 .Case("602", true)
795 .Case("603", true)
796 .Case("603e", true)
797 .Case("603ev", true)
798 .Case("604", true)
799 .Case("604e", true)
800 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000801 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000802 .Case("g3", true)
803 .Case("7400", true)
804 .Case("g4", true)
805 .Case("7450", true)
806 .Case("g4+", true)
807 .Case("750", true)
808 .Case("970", true)
809 .Case("g5", true)
810 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000811 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000812 .Case("e500mc", true)
813 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000814 .Case("power3", true)
815 .Case("pwr3", true)
816 .Case("power4", true)
817 .Case("pwr4", true)
818 .Case("power5", true)
819 .Case("pwr5", true)
820 .Case("power5x", true)
821 .Case("pwr5x", true)
822 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000823 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000824 .Case("power6x", true)
825 .Case("pwr6x", true)
826 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000827 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000828 .Case("power8", true)
829 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000830 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000831 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000832 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000833 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000834 .Case("powerpc64le", true)
835 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000836 .Default(false);
837
838 if (CPUKnown)
839 CPU = Name;
840
841 return CPUKnown;
842 }
843
Ulrich Weigand8afad612014-07-28 13:17:52 +0000844
845 StringRef getABI() const override { return ABI; }
846
Craig Topper3164f332014-03-11 03:39:26 +0000847 void getTargetBuiltins(const Builtin::Info *&Records,
848 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000849 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000850 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000851 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000852
Craig Topper3164f332014-03-11 03:39:26 +0000853 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000854
Craig Topper3164f332014-03-11 03:39:26 +0000855 void getTargetDefines(const LangOptions &Opts,
856 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000857
Craig Topper3164f332014-03-11 03:39:26 +0000858 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000859
Craig Topper3164f332014-03-11 03:39:26 +0000860 bool handleTargetFeatures(std::vector<std::string> &Features,
861 DiagnosticsEngine &Diags) override;
862 bool hasFeature(StringRef Feature) const override;
863
864 void getGCCRegNames(const char * const *&Names,
865 unsigned &NumNames) const override;
866 void getGCCRegAliases(const GCCRegAlias *&Aliases,
867 unsigned &NumAliases) const override;
868 bool validateAsmConstraint(const char *&Name,
869 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000870 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000871 default: return false;
872 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000873 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000874 case 'b': // Base register
875 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000876 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000877 break;
878 // FIXME: The following are added to allow parsing.
879 // I just took a guess at what the actions should be.
880 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000881 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000882 case 'v': // Altivec vector register
883 Info.setAllowsRegister();
884 break;
885 case 'w':
886 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000887 case 'd':// VSX vector register to hold vector double data
888 case 'f':// VSX vector register to hold vector float data
889 case 's':// VSX vector register to hold scalar float data
890 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000891 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000892 break;
893 default:
894 return false;
895 }
896 Info.setAllowsRegister();
897 Name++; // Skip over 'w'.
898 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000899 case 'h': // `MQ', `CTR', or `LINK' register
900 case 'q': // `MQ' register
901 case 'c': // `CTR' register
902 case 'l': // `LINK' register
903 case 'x': // `CR' register (condition register) number 0
904 case 'y': // `CR' register (condition register)
905 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000906 Info.setAllowsRegister();
907 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000908 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000909 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000910 // (use `L' instead for SImode constants)
911 case 'K': // Unsigned 16-bit constant
912 case 'L': // Signed 16-bit constant shifted left 16 bits
913 case 'M': // Constant larger than 31
914 case 'N': // Exact power of 2
915 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000916 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000917 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000918 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000919 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000920 break;
921 case 'm': // Memory operand. Note that on PowerPC targets, m can
922 // include addresses that update the base register. It
923 // is therefore only safe to use `m' in an asm statement
924 // if that asm statement accesses the operand exactly once.
925 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000926 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000927 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000928 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000929 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000930 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
931 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000932 // register to be updated.
933 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000934 if (Name[1] != 's')
935 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000936 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000937 // include any automodification of the base register. Unlike
938 // `m', this constraint can be used in asm statements that
939 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000940 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000941 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000942 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000943 break;
944 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000945 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000946 case 'Z': // Memory operand that is an indexed or indirect from a
947 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000948 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000949 Info.setAllowsMemory();
950 Info.setAllowsRegister();
951 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000952 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000953 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000954 // register (`p' is preferable for asm statements)
955 case 'S': // Constant suitable as a 64-bit mask operand
956 case 'T': // Constant suitable as a 32-bit mask operand
957 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000958 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000959 // instructions
960 case 'W': // Vector constant that does not require memory
961 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000962 break;
963 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000964 }
John Thompson07a61a42010-06-24 22:44:13 +0000965 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000966 }
Craig Topper3164f332014-03-11 03:39:26 +0000967 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000968 std::string R;
969 switch (*Constraint) {
970 case 'e':
971 case 'w':
972 // Two-character constraint; add "^" hint for later parsing.
973 R = std::string("^") + std::string(Constraint, 2);
974 Constraint++;
975 break;
976 default:
977 return TargetInfo::convertConstraint(Constraint);
978 }
979 return R;
980 }
Craig Topper3164f332014-03-11 03:39:26 +0000981 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000982 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000983 }
Craig Topper3164f332014-03-11 03:39:26 +0000984 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000985 if (RegNo == 0) return 3;
986 if (RegNo == 1) return 4;
987 return -1;
988 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +0000989
990 bool hasSjLjLowering() const override {
991 return true;
992 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000993};
Anders Carlssonf511f642007-11-27 04:11:28 +0000994
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000995const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000996#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000997#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000998 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000999#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001000};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001001
Eric Christopher917e9522014-11-18 22:36:15 +00001002/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001003/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001004bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001005 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001006 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1007 // Ignore disabled features.
1008 if (Features[i][0] == '-')
1009 continue;
1010
1011 StringRef Feature = StringRef(Features[i]).substr(1);
1012
1013 if (Feature == "vsx") {
1014 HasVSX = true;
1015 continue;
1016 }
1017
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001018 if (Feature == "bpermd") {
1019 HasBPERMD = true;
1020 continue;
1021 }
1022
1023 if (Feature == "extdiv") {
1024 HasExtDiv = true;
1025 continue;
1026 }
1027
Bill Schmidt59eb7672014-10-10 15:09:43 +00001028 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001029 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +00001030 continue;
1031 }
1032
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001033 if (Feature == "crypto") {
1034 HasP8Crypto = true;
1035 continue;
1036 }
1037
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001038 if (Feature == "qpx") {
1039 HasQPX = true;
1040 continue;
1041 }
1042
Kit Barton8246f282015-03-25 19:41:41 +00001043 if (Feature == "htm") {
1044 HasHTM = true;
1045 continue;
1046 }
1047
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001048 // TODO: Finish this list and add an assert that we've handled them
1049 // all.
1050 }
1051
1052 return true;
1053}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001054
Chris Lattnerecd49032009-03-02 22:27:17 +00001055/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1056/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001057void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001058 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001059 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001060 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001061 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001062 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001063 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001064 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001065 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001066 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001067 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001068 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001069 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001070 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001071
Chris Lattnerecd49032009-03-02 22:27:17 +00001072 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001073 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1074 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001075 } else {
1076 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1077 getTriple().getOS() != llvm::Triple::OpenBSD)
1078 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001079 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001080
Ulrich Weigand8afad612014-07-28 13:17:52 +00001081 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001082 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001083 Builder.defineMacro("_CALL_ELF", "1");
1084 if (ABI == "elfv2")
1085 Builder.defineMacro("_CALL_ELF", "2");
1086
Chris Lattnerecd49032009-03-02 22:27:17 +00001087 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001088 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1089 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001090
Chris Lattnerecd49032009-03-02 22:27:17 +00001091 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001092 if (LongDoubleWidth == 128)
1093 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001094
John Thompsone467e192009-11-19 17:18:50 +00001095 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001096 Builder.defineMacro("__VEC__", "10206");
1097 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001098 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001099
1100 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001101 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1102 .Case("440", ArchDefineName)
1103 .Case("450", ArchDefineName | ArchDefine440)
1104 .Case("601", ArchDefineName)
1105 .Case("602", ArchDefineName | ArchDefinePpcgr)
1106 .Case("603", ArchDefineName | ArchDefinePpcgr)
1107 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1108 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1109 .Case("604", ArchDefineName | ArchDefinePpcgr)
1110 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1111 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001112 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001113 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1114 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1115 .Case("750", ArchDefineName | ArchDefinePpcgr)
1116 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1117 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001118 .Case("a2", ArchDefineA2)
1119 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001120 .Case("pwr3", ArchDefinePpcgr)
1121 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1122 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1123 | ArchDefinePpcsq)
1124 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1125 | ArchDefinePpcgr | ArchDefinePpcsq)
1126 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1127 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1128 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1129 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1130 | ArchDefinePpcsq)
1131 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1132 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001133 | ArchDefinePpcgr | ArchDefinePpcsq)
1134 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1135 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1136 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001137 .Case("power3", ArchDefinePpcgr)
1138 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1139 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1140 | ArchDefinePpcsq)
1141 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1142 | ArchDefinePpcgr | ArchDefinePpcsq)
1143 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1144 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1145 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1146 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1147 | ArchDefinePpcsq)
1148 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1149 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001150 | ArchDefinePpcgr | ArchDefinePpcsq)
1151 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1152 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1153 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001154 .Default(ArchDefineNone);
1155
1156 if (defs & ArchDefineName)
1157 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1158 if (defs & ArchDefinePpcgr)
1159 Builder.defineMacro("_ARCH_PPCGR");
1160 if (defs & ArchDefinePpcsq)
1161 Builder.defineMacro("_ARCH_PPCSQ");
1162 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001163 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001164 if (defs & ArchDefine603)
1165 Builder.defineMacro("_ARCH_603");
1166 if (defs & ArchDefine604)
1167 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001168 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001169 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001170 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001171 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001172 if (defs & ArchDefinePwr5x)
1173 Builder.defineMacro("_ARCH_PWR5X");
1174 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001175 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001176 if (defs & ArchDefinePwr6x)
1177 Builder.defineMacro("_ARCH_PWR6X");
1178 if (defs & ArchDefinePwr7)
1179 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001180 if (defs & ArchDefinePwr8)
1181 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001182 if (defs & ArchDefineA2)
1183 Builder.defineMacro("_ARCH_A2");
1184 if (defs & ArchDefineA2q) {
1185 Builder.defineMacro("_ARCH_A2Q");
1186 Builder.defineMacro("_ARCH_QP");
1187 }
1188
1189 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1190 Builder.defineMacro("__bg__");
1191 Builder.defineMacro("__THW_BLUEGENE__");
1192 Builder.defineMacro("__bgq__");
1193 Builder.defineMacro("__TOS_BGQ__");
1194 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001195
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001196 if (HasVSX)
1197 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001198 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001199 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001200 if (HasP8Crypto)
1201 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001202 if (HasHTM)
1203 Builder.defineMacro("__HTM__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001204
Bill Schmidt38378a02013-02-01 20:23:10 +00001205 // FIXME: The following are not yet generated here by Clang, but are
1206 // generated by GCC:
1207 //
1208 // _SOFT_FLOAT_
1209 // __RECIP_PRECISION__
1210 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001211 // __RECIP__
1212 // __RECIPF__
1213 // __RSQRTE__
1214 // __RSQRTEF__
1215 // _SOFT_DOUBLE_
1216 // __NO_LWSYNC__
1217 // __HAVE_BSWAP__
1218 // __LONGDOUBLE128
1219 // __CMODEL_MEDIUM__
1220 // __CMODEL_LARGE__
1221 // _CALL_SYSV
1222 // _CALL_DARWIN
1223 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001224}
1225
1226void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1227 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1228 .Case("7400", true)
1229 .Case("g4", true)
1230 .Case("7450", true)
1231 .Case("g4+", true)
1232 .Case("970", true)
1233 .Case("g5", true)
1234 .Case("pwr6", true)
1235 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001236 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001237 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001238 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001239 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001240
1241 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001242 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1243 .Case("ppc64le", true)
1244 .Case("pwr8", true)
1245 .Default(false);
1246 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1247 .Case("ppc64le", true)
1248 .Case("pwr8", true)
1249 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001250 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1251 .Case("ppc64le", true)
1252 .Case("pwr8", true)
1253 .Case("pwr7", true)
1254 .Default(false);
1255 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1256 .Case("ppc64le", true)
1257 .Case("pwr8", true)
1258 .Case("pwr7", true)
1259 .Default(false);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001260}
1261
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001262bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001263 return llvm::StringSwitch<bool>(Feature)
1264 .Case("powerpc", true)
1265 .Case("vsx", HasVSX)
1266 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001267 .Case("crypto", HasP8Crypto)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001268 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001269 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001270 .Case("bpermd", HasBPERMD)
1271 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001272 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001273}
Chris Lattner17df24e2008-04-21 18:56:49 +00001274
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001275const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001276 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1277 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1278 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1279 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1280 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1281 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1282 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1283 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001284 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001285 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001286 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001287 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1288 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1289 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1290 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001291 "vrsave", "vscr",
1292 "spe_acc", "spefscr",
1293 "sfp"
1294};
Chris Lattner10a5b382007-01-29 05:24:35 +00001295
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001296void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001297 unsigned &NumNames) const {
1298 Names = GCCRegNames;
1299 NumNames = llvm::array_lengthof(GCCRegNames);
1300}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001301
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001302const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1303 // While some of these aliases do map to different registers
1304 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001305 { { "0" }, "r0" },
1306 { { "1"}, "r1" },
1307 { { "2" }, "r2" },
1308 { { "3" }, "r3" },
1309 { { "4" }, "r4" },
1310 { { "5" }, "r5" },
1311 { { "6" }, "r6" },
1312 { { "7" }, "r7" },
1313 { { "8" }, "r8" },
1314 { { "9" }, "r9" },
1315 { { "10" }, "r10" },
1316 { { "11" }, "r11" },
1317 { { "12" }, "r12" },
1318 { { "13" }, "r13" },
1319 { { "14" }, "r14" },
1320 { { "15" }, "r15" },
1321 { { "16" }, "r16" },
1322 { { "17" }, "r17" },
1323 { { "18" }, "r18" },
1324 { { "19" }, "r19" },
1325 { { "20" }, "r20" },
1326 { { "21" }, "r21" },
1327 { { "22" }, "r22" },
1328 { { "23" }, "r23" },
1329 { { "24" }, "r24" },
1330 { { "25" }, "r25" },
1331 { { "26" }, "r26" },
1332 { { "27" }, "r27" },
1333 { { "28" }, "r28" },
1334 { { "29" }, "r29" },
1335 { { "30" }, "r30" },
1336 { { "31" }, "r31" },
1337 { { "fr0" }, "f0" },
1338 { { "fr1" }, "f1" },
1339 { { "fr2" }, "f2" },
1340 { { "fr3" }, "f3" },
1341 { { "fr4" }, "f4" },
1342 { { "fr5" }, "f5" },
1343 { { "fr6" }, "f6" },
1344 { { "fr7" }, "f7" },
1345 { { "fr8" }, "f8" },
1346 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001347 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001348 { { "fr11" }, "f11" },
1349 { { "fr12" }, "f12" },
1350 { { "fr13" }, "f13" },
1351 { { "fr14" }, "f14" },
1352 { { "fr15" }, "f15" },
1353 { { "fr16" }, "f16" },
1354 { { "fr17" }, "f17" },
1355 { { "fr18" }, "f18" },
1356 { { "fr19" }, "f19" },
1357 { { "fr20" }, "f20" },
1358 { { "fr21" }, "f21" },
1359 { { "fr22" }, "f22" },
1360 { { "fr23" }, "f23" },
1361 { { "fr24" }, "f24" },
1362 { { "fr25" }, "f25" },
1363 { { "fr26" }, "f26" },
1364 { { "fr27" }, "f27" },
1365 { { "fr28" }, "f28" },
1366 { { "fr29" }, "f29" },
1367 { { "fr30" }, "f30" },
1368 { { "fr31" }, "f31" },
1369 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001370};
1371
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001372void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001373 unsigned &NumAliases) const {
1374 Aliases = GCCRegAliases;
1375 NumAliases = llvm::array_lengthof(GCCRegAliases);
1376}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001377
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001378class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001379public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001380 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001381 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001382
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001383 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001384 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001385 case llvm::Triple::FreeBSD:
1386 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001387 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001388 PtrDiffType = SignedInt;
1389 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001390 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001391 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001392 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001393 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001394
Roman Divacky3ffe7462012-03-13 19:20:17 +00001395 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1396 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001397 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001398 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001399
1400 // PPC32 supports atomics up to 4 bytes.
1401 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001402 }
1403
Craig Topper3164f332014-03-11 03:39:26 +00001404 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001405 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001406 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001407 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001408};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001409
Bill Schmidt778d3872013-07-26 01:36:11 +00001410// Note: ABI differences may eventually require us to have a separate
1411// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001412class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001413public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001414 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001415 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001416 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001417 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001418
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001419 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1420 DescriptionString = "e-m:e-i64:64-n32:64";
1421 ABI = "elfv2";
1422 } else {
1423 DescriptionString = "E-m:e-i64:64-n32:64";
1424 ABI = "elfv1";
1425 }
1426
1427 switch (getTriple().getOS()) {
1428 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001429 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001430 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001431 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001432 case llvm::Triple::NetBSD:
1433 IntMaxType = SignedLongLong;
1434 Int64Type = SignedLongLong;
1435 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001436 default:
1437 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001438 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001439
1440 // PPC64 supports atomics up to 8 bytes.
1441 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001442 }
Craig Topper3164f332014-03-11 03:39:26 +00001443 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001444 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001445 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001446 // PPC64 Linux-specifc ABI options.
1447 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001448 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001449 ABI = Name;
1450 return true;
1451 }
1452 return false;
1453 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001454};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001455
Roman Divacky965b0b72011-01-06 08:27:10 +00001456class DarwinPPC32TargetInfo :
1457 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001458public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001459 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1460 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001461 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001462 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001463 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001464 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001465 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001466 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001467 }
Craig Topper3164f332014-03-11 03:39:26 +00001468 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001469 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001470 }
1471};
1472
1473class DarwinPPC64TargetInfo :
1474 public DarwinTargetInfo<PPC64TargetInfo> {
1475public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001476 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1477 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001478 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001479 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001480 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001481 }
1482};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001483
Peter Collingbournec947aae2012-05-20 23:28:41 +00001484 static const unsigned NVPTXAddrSpaceMap[] = {
1485 1, // opencl_global
1486 3, // opencl_local
1487 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001488 // FIXME: generic has to be added to the target
1489 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001490 1, // cuda_device
1491 4, // cuda_constant
1492 3, // cuda_shared
1493 };
1494 class NVPTXTargetInfo : public TargetInfo {
1495 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001496 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001497
1498 // The GPU profiles supported by the NVPTX backend
1499 enum GPUKind {
1500 GK_NONE,
1501 GK_SM20,
1502 GK_SM21,
1503 GK_SM30,
1504 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001505 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001506 } GPU;
1507
Peter Collingbournec947aae2012-05-20 23:28:41 +00001508 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001509 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001510 BigEndian = false;
1511 TLSSupported = false;
1512 LongWidth = LongAlign = 64;
1513 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001514 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001515 // Define available target features
1516 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001517 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001518 // Set the default GPU to sm20
1519 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001520 }
Craig Topper3164f332014-03-11 03:39:26 +00001521 void getTargetDefines(const LangOptions &Opts,
1522 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001523 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001524 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001525 if (Opts.CUDAIsDevice) {
1526 // Set __CUDA_ARCH__ for the GPU specified.
1527 std::string CUDAArchCode;
1528 switch (GPU) {
1529 case GK_SM20:
1530 CUDAArchCode = "200";
1531 break;
1532 case GK_SM21:
1533 CUDAArchCode = "210";
1534 break;
1535 case GK_SM30:
1536 CUDAArchCode = "300";
1537 break;
1538 case GK_SM35:
1539 CUDAArchCode = "350";
1540 break;
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001541 case GK_SM37:
1542 CUDAArchCode = "370";
1543 break;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001544 default:
1545 llvm_unreachable("Unhandled target CPU");
1546 }
1547 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1548 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001549 }
Craig Topper3164f332014-03-11 03:39:26 +00001550 void getTargetBuiltins(const Builtin::Info *&Records,
1551 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001552 Records = BuiltinInfo;
1553 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001554 }
Craig Topper3164f332014-03-11 03:39:26 +00001555 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001556 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001557 }
Craig Topper3164f332014-03-11 03:39:26 +00001558
1559 void getGCCRegNames(const char * const *&Names,
1560 unsigned &NumNames) const override;
1561 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1562 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001563 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001564 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001565 NumAliases = 0;
1566 }
Eric Christopher917e9522014-11-18 22:36:15 +00001567 bool
1568 validateAsmConstraint(const char *&Name,
1569 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001570 switch (*Name) {
1571 default: return false;
1572 case 'c':
1573 case 'h':
1574 case 'r':
1575 case 'l':
1576 case 'f':
1577 case 'd':
1578 Info.setAllowsRegister();
1579 return true;
1580 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001581 }
Craig Topper3164f332014-03-11 03:39:26 +00001582 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001583 // FIXME: Is this really right?
1584 return "";
1585 }
Craig Topper3164f332014-03-11 03:39:26 +00001586 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001587 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001588 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001589 }
Craig Topper3164f332014-03-11 03:39:26 +00001590 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001591 GPU = llvm::StringSwitch<GPUKind>(Name)
1592 .Case("sm_20", GK_SM20)
1593 .Case("sm_21", GK_SM21)
1594 .Case("sm_30", GK_SM30)
1595 .Case("sm_35", GK_SM35)
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001596 .Case("sm_37", GK_SM37)
Reid Klecknerbbc01782014-12-03 21:53:36 +00001597 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001598
Reid Klecknerbbc01782014-12-03 21:53:36 +00001599 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001600 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001601 };
1602
1603 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1604#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1605#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1606 ALL_LANGUAGES },
1607#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001608 };
1609
1610 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1611 "r0"
1612 };
1613
1614 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1615 unsigned &NumNames) const {
1616 Names = GCCRegNames;
1617 NumNames = llvm::array_lengthof(GCCRegNames);
1618 }
1619
1620 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1621 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001622 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001623 PointerWidth = PointerAlign = 32;
Eli Bendersky13467172015-04-01 20:29:18 +00001624 SizeType = TargetInfo::UnsignedInt;
1625 PtrDiffType = TargetInfo::SignedInt;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001626 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001627 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001628 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001629 };
1630
1631 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1632 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001633 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001634 PointerWidth = PointerAlign = 64;
Eli Bendersky13467172015-04-01 20:29:18 +00001635 SizeType = TargetInfo::UnsignedLong;
1636 PtrDiffType = TargetInfo::SignedLong;
Eli Bendersky15f63422015-04-01 18:29:27 +00001637 IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001638 DescriptionString = "e-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 };
Eli Friedmand13b41e2012-10-12 23:32:00 +00001641
1642static const unsigned R600AddrSpaceMap[] = {
1643 1, // opencl_global
1644 3, // opencl_local
1645 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001646 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001647 1, // cuda_device
1648 2, // cuda_constant
1649 3 // cuda_shared
1650};
1651
Tom Stellarda96344b2014-08-21 13:58:40 +00001652// If you edit the description strings, make sure you update
1653// getPointerWidthV().
1654
Tom Stellardc74b1e02013-03-04 17:40:53 +00001655static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001656 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1657 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001658
1659static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001660 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1661 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001662
1663static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001664 "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 +00001665 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1666 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001667
Eli Friedmand13b41e2012-10-12 23:32:00 +00001668class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001669 static const Builtin::Info BuiltinInfo[];
1670
Tom Stellardc74b1e02013-03-04 17:40:53 +00001671 /// \brief The GPU profiles supported by the R600 target.
1672 enum GPUKind {
1673 GK_NONE,
1674 GK_R600,
1675 GK_R600_DOUBLE_OPS,
1676 GK_R700,
1677 GK_R700_DOUBLE_OPS,
1678 GK_EVERGREEN,
1679 GK_EVERGREEN_DOUBLE_OPS,
1680 GK_NORTHERN_ISLANDS,
1681 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001682 GK_SOUTHERN_ISLANDS,
1683 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001684 } GPU;
1685
Eli Friedmand13b41e2012-10-12 23:32:00 +00001686public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001687 R600TargetInfo(const llvm::Triple &Triple)
Tom Stellardd99fb952015-01-28 15:38:44 +00001688 : TargetInfo(Triple) {
1689
1690 if (Triple.getArch() == llvm::Triple::amdgcn) {
1691 DescriptionString = DescriptionStringSI;
1692 GPU = GK_SOUTHERN_ISLANDS;
1693 } else {
1694 DescriptionString = DescriptionStringR600;
1695 GPU = GK_R600;
1696 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001697 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001698 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001699 }
1700
Tom Stellarda96344b2014-08-21 13:58:40 +00001701 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1702 if (GPU <= GK_CAYMAN)
1703 return 32;
1704
1705 switch(AddrSpace) {
1706 default:
1707 return 64;
1708 case 0:
1709 case 3:
1710 case 5:
1711 return 32;
1712 }
1713 }
1714
Craig Topper3164f332014-03-11 03:39:26 +00001715 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001716 return "";
1717 }
1718
Craig Topper3164f332014-03-11 03:39:26 +00001719 void getGCCRegNames(const char * const *&Names,
1720 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001721 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001722 numNames = 0;
1723 }
1724
Craig Topper3164f332014-03-11 03:39:26 +00001725 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1726 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001727 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001728 NumAliases = 0;
1729 }
1730
Craig Topper3164f332014-03-11 03:39:26 +00001731 bool validateAsmConstraint(const char *&Name,
1732 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001733 return true;
1734 }
1735
Craig Topper3164f332014-03-11 03:39:26 +00001736 void getTargetBuiltins(const Builtin::Info *&Records,
1737 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001738 Records = BuiltinInfo;
1739 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001740 }
1741
Craig Topper3164f332014-03-11 03:39:26 +00001742 void getTargetDefines(const LangOptions &Opts,
1743 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001744 Builder.defineMacro("__R600__");
Tom Stellardfded50f2015-02-27 15:10:19 +00001745 if (GPU >= GK_SOUTHERN_ISLANDS && Opts.OpenCL)
1746 Builder.defineMacro("cl_khr_fp64");
Eli Friedmand13b41e2012-10-12 23:32:00 +00001747 }
1748
Craig Topper3164f332014-03-11 03:39:26 +00001749 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001750 return TargetInfo::CharPtrBuiltinVaList;
1751 }
1752
Craig Topper3164f332014-03-11 03:39:26 +00001753 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001754 GPU = llvm::StringSwitch<GPUKind>(Name)
1755 .Case("r600" , GK_R600)
1756 .Case("rv610", GK_R600)
1757 .Case("rv620", GK_R600)
1758 .Case("rv630", GK_R600)
1759 .Case("rv635", GK_R600)
1760 .Case("rs780", GK_R600)
1761 .Case("rs880", GK_R600)
1762 .Case("rv670", GK_R600_DOUBLE_OPS)
1763 .Case("rv710", GK_R700)
1764 .Case("rv730", GK_R700)
1765 .Case("rv740", GK_R700_DOUBLE_OPS)
1766 .Case("rv770", GK_R700_DOUBLE_OPS)
1767 .Case("palm", GK_EVERGREEN)
1768 .Case("cedar", GK_EVERGREEN)
1769 .Case("sumo", GK_EVERGREEN)
1770 .Case("sumo2", GK_EVERGREEN)
1771 .Case("redwood", GK_EVERGREEN)
1772 .Case("juniper", GK_EVERGREEN)
1773 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1774 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1775 .Case("barts", GK_NORTHERN_ISLANDS)
1776 .Case("turks", GK_NORTHERN_ISLANDS)
1777 .Case("caicos", GK_NORTHERN_ISLANDS)
1778 .Case("cayman", GK_CAYMAN)
1779 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001780 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001781 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1782 .Case("verde", GK_SOUTHERN_ISLANDS)
1783 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001784 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001785 .Case("bonaire", GK_SEA_ISLANDS)
1786 .Case("kabini", GK_SEA_ISLANDS)
1787 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001788 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001789 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001790 .Default(GK_NONE);
1791
1792 if (GPU == GK_NONE) {
1793 return false;
1794 }
1795
1796 // Set the correct data layout
1797 switch (GPU) {
1798 case GK_NONE:
1799 case GK_R600:
1800 case GK_R700:
1801 case GK_EVERGREEN:
1802 case GK_NORTHERN_ISLANDS:
1803 DescriptionString = DescriptionStringR600;
1804 break;
1805 case GK_R600_DOUBLE_OPS:
1806 case GK_R700_DOUBLE_OPS:
1807 case GK_EVERGREEN_DOUBLE_OPS:
1808 case GK_CAYMAN:
1809 DescriptionString = DescriptionStringR600DoubleOps;
1810 break;
1811 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001812 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001813 DescriptionString = DescriptionStringSI;
1814 break;
1815 }
1816
1817 return true;
1818 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001819};
1820
Matt Arsenault56f008d2014-06-24 20:45:01 +00001821const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1822#define BUILTIN(ID, TYPE, ATTRS) \
1823 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1824#include "clang/Basic/BuiltinsR600.def"
1825};
1826
Eli Friedman3fd920a2008-08-20 02:34:37 +00001827// Namespace for x86 abstract base class
1828const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001829#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001830#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001831 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001832#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001833};
Eli Friedmanb5366062008-05-20 14:21:01 +00001834
Nuno Lopescfca1f02009-12-23 17:49:57 +00001835static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001836 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1837 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001838 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001839 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1840 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1841 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001842 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001843 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1844 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001845};
1846
Eric Christophercdd36352011-06-21 00:05:20 +00001847const TargetInfo::AddlRegName AddlRegNames[] = {
1848 { { "al", "ah", "eax", "rax" }, 0 },
1849 { { "bl", "bh", "ebx", "rbx" }, 3 },
1850 { { "cl", "ch", "ecx", "rcx" }, 2 },
1851 { { "dl", "dh", "edx", "rdx" }, 1 },
1852 { { "esi", "rsi" }, 4 },
1853 { { "edi", "rdi" }, 5 },
1854 { { "esp", "rsp" }, 7 },
1855 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001856};
1857
1858// X86 target abstract base class; x86-32 and x86-64 are very close, so
1859// most of the implementation can be shared.
1860class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001861 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001862 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001863 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001864 enum MMX3DNowEnum {
1865 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1866 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001867 enum XOPEnum {
1868 NoXOP,
1869 SSE4A,
1870 FMA4,
1871 XOP
1872 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001873
Eric Christophere1ddaf92010-04-02 23:50:19 +00001874 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001875 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001876 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001877 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001878 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001879 bool HasBMI;
1880 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001881 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001882 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001883 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001884 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001885 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001886 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001887 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001888 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001889 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1890 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001891 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001892 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001893
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001894 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1895 ///
1896 /// Each enumeration represents a particular CPU supported by Clang. These
1897 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1898 enum CPUKind {
1899 CK_Generic,
1900
1901 /// \name i386
1902 /// i386-generation processors.
1903 //@{
1904 CK_i386,
1905 //@}
1906
1907 /// \name i486
1908 /// i486-generation processors.
1909 //@{
1910 CK_i486,
1911 CK_WinChipC6,
1912 CK_WinChip2,
1913 CK_C3,
1914 //@}
1915
1916 /// \name i586
1917 /// i586-generation processors, P5 microarchitecture based.
1918 //@{
1919 CK_i586,
1920 CK_Pentium,
1921 CK_PentiumMMX,
1922 //@}
1923
1924 /// \name i686
1925 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1926 //@{
1927 CK_i686,
1928 CK_PentiumPro,
1929 CK_Pentium2,
1930 CK_Pentium3,
1931 CK_Pentium3M,
1932 CK_PentiumM,
1933 CK_C3_2,
1934
1935 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1936 /// Clang however has some logic to suport this.
1937 // FIXME: Warn, deprecate, and potentially remove this.
1938 CK_Yonah,
1939 //@}
1940
1941 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001942 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001943 //@{
1944 CK_Pentium4,
1945 CK_Pentium4M,
1946 CK_Prescott,
1947 CK_Nocona,
1948 //@}
1949
1950 /// \name Core
1951 /// Core microarchitecture based processors.
1952 //@{
1953 CK_Core2,
1954
1955 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1956 /// codename which GCC no longer accepts as an option to -march, but Clang
1957 /// has some logic for recognizing it.
1958 // FIXME: Warn, deprecate, and potentially remove this.
1959 CK_Penryn,
1960 //@}
1961
1962 /// \name Atom
1963 /// Atom processors
1964 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001965 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00001966 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001967 //@}
1968
1969 /// \name Nehalem
1970 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001971 CK_Nehalem,
1972
1973 /// \name Westmere
1974 /// Westmere microarchitecture based processors.
1975 CK_Westmere,
1976
1977 /// \name Sandy Bridge
1978 /// Sandy Bridge microarchitecture based processors.
1979 CK_SandyBridge,
1980
1981 /// \name Ivy Bridge
1982 /// Ivy Bridge microarchitecture based processors.
1983 CK_IvyBridge,
1984
1985 /// \name Haswell
1986 /// Haswell microarchitecture based processors.
1987 CK_Haswell,
1988
1989 /// \name Broadwell
1990 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00001991 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001992
1993 /// \name Skylake
1994 /// Skylake microarchitecture based processors.
1995 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001996
Craig Topper449314e2013-08-20 07:09:39 +00001997 /// \name Knights Landing
1998 /// Knights Landing processor.
1999 CK_KNL,
2000
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002001 /// \name K6
2002 /// K6 architecture processors.
2003 //@{
2004 CK_K6,
2005 CK_K6_2,
2006 CK_K6_3,
2007 //@}
2008
2009 /// \name K7
2010 /// K7 architecture processors.
2011 //@{
2012 CK_Athlon,
2013 CK_AthlonThunderbird,
2014 CK_Athlon4,
2015 CK_AthlonXP,
2016 CK_AthlonMP,
2017 //@}
2018
2019 /// \name K8
2020 /// K8 architecture processors.
2021 //@{
2022 CK_Athlon64,
2023 CK_Athlon64SSE3,
2024 CK_AthlonFX,
2025 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002026 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002027 CK_Opteron,
2028 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002029 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002030 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002031
Benjamin Kramer569f2152012-01-10 11:50:18 +00002032 /// \name Bobcat
2033 /// Bobcat architecture processors.
2034 //@{
2035 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002036 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002037 //@}
2038
2039 /// \name Bulldozer
2040 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002041 //@{
2042 CK_BDVER1,
2043 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002044 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002045 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002046 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002047
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002048 /// This specification is deprecated and will be removed in the future.
2049 /// Users should prefer \see CK_K8.
2050 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002051 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002052 CK_x86_64,
2053 //@}
2054
2055 /// \name Geode
2056 /// Geode processors.
2057 //@{
2058 CK_Geode
2059 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002060 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002061
Rafael Espindolaeb265472013-08-21 21:59:03 +00002062 enum FPMathKind {
2063 FP_Default,
2064 FP_SSE,
2065 FP_387
2066 } FPMath;
2067
Eli Friedman3fd920a2008-08-20 02:34:37 +00002068public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002069 X86TargetInfo(const llvm::Triple &Triple)
2070 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002071 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002072 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2073 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2074 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2075 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2076 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2077 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002078 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002079 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002080 }
Craig Topper3164f332014-03-11 03:39:26 +00002081 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002082 // X87 evaluates with 80 bits "long double" precision.
2083 return SSELevel == NoSSE ? 2 : 0;
2084 }
Craig Topper3164f332014-03-11 03:39:26 +00002085 void getTargetBuiltins(const Builtin::Info *&Records,
2086 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002087 Records = BuiltinInfo;
2088 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002089 }
Craig Topper3164f332014-03-11 03:39:26 +00002090 void getGCCRegNames(const char * const *&Names,
2091 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002092 Names = GCCRegNames;
2093 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002094 }
Craig Topper3164f332014-03-11 03:39:26 +00002095 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2096 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002097 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002098 NumAliases = 0;
2099 }
Craig Topper3164f332014-03-11 03:39:26 +00002100 void getGCCAddlRegNames(const AddlRegName *&Names,
2101 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002102 Names = AddlRegNames;
2103 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002104 }
Craig Topper3164f332014-03-11 03:39:26 +00002105 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002106 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002107
Akira Hatanaka974131e2014-09-18 18:17:18 +00002108 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2109
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002110 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2111
Akira Hatanaka974131e2014-09-18 18:17:18 +00002112 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2113
Craig Topper3164f332014-03-11 03:39:26 +00002114 std::string convertConstraint(const char *&Constraint) const override;
2115 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002116 return "~{dirflag},~{fpsr},~{flags}";
2117 }
Craig Topper3164f332014-03-11 03:39:26 +00002118 void getTargetDefines(const LangOptions &Opts,
2119 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002120 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2121 bool Enabled);
2122 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2123 bool Enabled);
2124 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2125 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002126 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2127 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002128 setFeatureEnabledImpl(Features, Name, Enabled);
2129 }
2130 // This exists purely to cut down on the number of virtual calls in
2131 // getDefaultFeatures which calls this repeatedly.
2132 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2133 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002134 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2135 bool hasFeature(StringRef Feature) const override;
2136 bool handleTargetFeatures(std::vector<std::string> &Features,
2137 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002138 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002139 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002140 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002141 else if (getTriple().getArch() == llvm::Triple::x86 &&
2142 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002143 return "no-mmx";
2144 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002145 }
Craig Topper3164f332014-03-11 03:39:26 +00002146 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002147 CPU = llvm::StringSwitch<CPUKind>(Name)
2148 .Case("i386", CK_i386)
2149 .Case("i486", CK_i486)
2150 .Case("winchip-c6", CK_WinChipC6)
2151 .Case("winchip2", CK_WinChip2)
2152 .Case("c3", CK_C3)
2153 .Case("i586", CK_i586)
2154 .Case("pentium", CK_Pentium)
2155 .Case("pentium-mmx", CK_PentiumMMX)
2156 .Case("i686", CK_i686)
2157 .Case("pentiumpro", CK_PentiumPro)
2158 .Case("pentium2", CK_Pentium2)
2159 .Case("pentium3", CK_Pentium3)
2160 .Case("pentium3m", CK_Pentium3M)
2161 .Case("pentium-m", CK_PentiumM)
2162 .Case("c3-2", CK_C3_2)
2163 .Case("yonah", CK_Yonah)
2164 .Case("pentium4", CK_Pentium4)
2165 .Case("pentium4m", CK_Pentium4M)
2166 .Case("prescott", CK_Prescott)
2167 .Case("nocona", CK_Nocona)
2168 .Case("core2", CK_Core2)
2169 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002170 .Case("bonnell", CK_Bonnell)
2171 .Case("atom", CK_Bonnell) // Legacy name.
2172 .Case("silvermont", CK_Silvermont)
2173 .Case("slm", CK_Silvermont) // Legacy name.
2174 .Case("nehalem", CK_Nehalem)
2175 .Case("corei7", CK_Nehalem) // Legacy name.
2176 .Case("westmere", CK_Westmere)
2177 .Case("sandybridge", CK_SandyBridge)
2178 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2179 .Case("ivybridge", CK_IvyBridge)
2180 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2181 .Case("haswell", CK_Haswell)
2182 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002183 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002184 .Case("skylake", CK_Skylake)
2185 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002186 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002187 .Case("k6", CK_K6)
2188 .Case("k6-2", CK_K6_2)
2189 .Case("k6-3", CK_K6_3)
2190 .Case("athlon", CK_Athlon)
2191 .Case("athlon-tbird", CK_AthlonThunderbird)
2192 .Case("athlon-4", CK_Athlon4)
2193 .Case("athlon-xp", CK_AthlonXP)
2194 .Case("athlon-mp", CK_AthlonMP)
2195 .Case("athlon64", CK_Athlon64)
2196 .Case("athlon64-sse3", CK_Athlon64SSE3)
2197 .Case("athlon-fx", CK_AthlonFX)
2198 .Case("k8", CK_K8)
2199 .Case("k8-sse3", CK_K8SSE3)
2200 .Case("opteron", CK_Opteron)
2201 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002202 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002203 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002204 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002205 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002206 .Case("bdver1", CK_BDVER1)
2207 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002208 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002209 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002210 .Case("x86-64", CK_x86_64)
2211 .Case("geode", CK_Geode)
2212 .Default(CK_Generic);
2213
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002214 // Perform any per-CPU checks necessary to determine if this CPU is
2215 // acceptable.
2216 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2217 // invalid without explaining *why*.
2218 switch (CPU) {
2219 case CK_Generic:
2220 // No processor selected!
2221 return false;
2222
2223 case CK_i386:
2224 case CK_i486:
2225 case CK_WinChipC6:
2226 case CK_WinChip2:
2227 case CK_C3:
2228 case CK_i586:
2229 case CK_Pentium:
2230 case CK_PentiumMMX:
2231 case CK_i686:
2232 case CK_PentiumPro:
2233 case CK_Pentium2:
2234 case CK_Pentium3:
2235 case CK_Pentium3M:
2236 case CK_PentiumM:
2237 case CK_Yonah:
2238 case CK_C3_2:
2239 case CK_Pentium4:
2240 case CK_Pentium4M:
2241 case CK_Prescott:
2242 case CK_K6:
2243 case CK_K6_2:
2244 case CK_K6_3:
2245 case CK_Athlon:
2246 case CK_AthlonThunderbird:
2247 case CK_Athlon4:
2248 case CK_AthlonXP:
2249 case CK_AthlonMP:
2250 case CK_Geode:
2251 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002252 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002253 return false;
2254
2255 // Fallthrough
2256 case CK_Nocona:
2257 case CK_Core2:
2258 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002259 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002260 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002261 case CK_Nehalem:
2262 case CK_Westmere:
2263 case CK_SandyBridge:
2264 case CK_IvyBridge:
2265 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002266 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002267 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002268 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002269 case CK_Athlon64:
2270 case CK_Athlon64SSE3:
2271 case CK_AthlonFX:
2272 case CK_K8:
2273 case CK_K8SSE3:
2274 case CK_Opteron:
2275 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002276 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002277 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002278 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002279 case CK_BDVER1:
2280 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002281 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002282 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002283 case CK_x86_64:
2284 return true;
2285 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002286 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002287 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002288
Craig Topper3164f332014-03-11 03:39:26 +00002289 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002290
Craig Topper3164f332014-03-11 03:39:26 +00002291 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002292 // We accept all non-ARM calling conventions
2293 return (CC == CC_X86ThisCall ||
2294 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002295 CC == CC_X86StdCall ||
2296 CC == CC_X86VectorCall ||
2297 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002298 CC == CC_X86Pascal ||
2299 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002300 }
2301
Craig Topper3164f332014-03-11 03:39:26 +00002302 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002303 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002304 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002305
2306 bool hasSjLjLowering() const override {
2307 return true;
2308 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002309};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002310
Rafael Espindolaeb265472013-08-21 21:59:03 +00002311bool X86TargetInfo::setFPMath(StringRef Name) {
2312 if (Name == "387") {
2313 FPMath = FP_387;
2314 return true;
2315 }
2316 if (Name == "sse") {
2317 FPMath = FP_SSE;
2318 return true;
2319 }
2320 return false;
2321}
2322
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002323void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002324 // FIXME: This *really* should not be here.
2325
2326 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002327 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002328 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002329
Chandler Carruth212334f2011-09-28 08:55:37 +00002330 switch (CPU) {
2331 case CK_Generic:
2332 case CK_i386:
2333 case CK_i486:
2334 case CK_i586:
2335 case CK_Pentium:
2336 case CK_i686:
2337 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002338 break;
2339 case CK_PentiumMMX:
2340 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002341 case CK_K6:
2342 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002343 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002344 break;
2345 case CK_Pentium3:
2346 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002347 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002348 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002349 break;
2350 case CK_PentiumM:
2351 case CK_Pentium4:
2352 case CK_Pentium4M:
2353 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002354 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002355 break;
2356 case CK_Yonah:
2357 case CK_Prescott:
2358 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002359 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002360 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002361 break;
2362 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002363 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002364 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002365 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002366 break;
2367 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002368 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002369 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002370 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002371 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002372 setFeatureEnabledImpl(Features, "avx512f", true);
2373 setFeatureEnabledImpl(Features, "avx512cd", true);
2374 setFeatureEnabledImpl(Features, "avx512dq", true);
2375 setFeatureEnabledImpl(Features, "avx512bw", true);
2376 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002377 // FALLTHROUGH
2378 case CK_Broadwell:
2379 setFeatureEnabledImpl(Features, "rdseed", true);
2380 setFeatureEnabledImpl(Features, "adx", true);
2381 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002382 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002383 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002384 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002385 setFeatureEnabledImpl(Features, "bmi", true);
2386 setFeatureEnabledImpl(Features, "bmi2", true);
2387 setFeatureEnabledImpl(Features, "rtm", true);
2388 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002389 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002390 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002391 setFeatureEnabledImpl(Features, "rdrnd", true);
2392 setFeatureEnabledImpl(Features, "f16c", true);
2393 setFeatureEnabledImpl(Features, "fsgsbase", true);
2394 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002395 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002396 setFeatureEnabledImpl(Features, "avx", true);
2397 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002398 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002399 case CK_Silvermont:
2400 setFeatureEnabledImpl(Features, "aes", true);
2401 setFeatureEnabledImpl(Features, "pclmul", true);
2402 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002403 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002404 setFeatureEnabledImpl(Features, "sse4.2", true);
2405 setFeatureEnabledImpl(Features, "cx16", true);
2406 break;
2407 case CK_KNL:
2408 setFeatureEnabledImpl(Features, "avx512f", true);
2409 setFeatureEnabledImpl(Features, "avx512cd", true);
2410 setFeatureEnabledImpl(Features, "avx512er", true);
2411 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002412 setFeatureEnabledImpl(Features, "rdseed", true);
2413 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002414 setFeatureEnabledImpl(Features, "lzcnt", true);
2415 setFeatureEnabledImpl(Features, "bmi", true);
2416 setFeatureEnabledImpl(Features, "bmi2", true);
2417 setFeatureEnabledImpl(Features, "rtm", true);
2418 setFeatureEnabledImpl(Features, "fma", true);
2419 setFeatureEnabledImpl(Features, "rdrnd", true);
2420 setFeatureEnabledImpl(Features, "f16c", true);
2421 setFeatureEnabledImpl(Features, "fsgsbase", true);
2422 setFeatureEnabledImpl(Features, "aes", true);
2423 setFeatureEnabledImpl(Features, "pclmul", true);
2424 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002425 break;
2426 case CK_K6_2:
2427 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002428 case CK_WinChip2:
2429 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002430 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002431 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002432 case CK_Athlon:
2433 case CK_AthlonThunderbird:
2434 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002435 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002436 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002437 case CK_Athlon4:
2438 case CK_AthlonXP:
2439 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002440 setFeatureEnabledImpl(Features, "sse", true);
2441 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002442 break;
2443 case CK_K8:
2444 case CK_Opteron:
2445 case CK_Athlon64:
2446 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002447 setFeatureEnabledImpl(Features, "sse2", true);
2448 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002449 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002450 case CK_AMDFAM10:
2451 setFeatureEnabledImpl(Features, "sse4a", true);
2452 setFeatureEnabledImpl(Features, "lzcnt", true);
2453 setFeatureEnabledImpl(Features, "popcnt", true);
2454 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002455 case CK_K8SSE3:
2456 case CK_OpteronSSE3:
2457 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002458 setFeatureEnabledImpl(Features, "sse3", true);
2459 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002460 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002461 case CK_BTVER2:
2462 setFeatureEnabledImpl(Features, "avx", true);
2463 setFeatureEnabledImpl(Features, "aes", true);
2464 setFeatureEnabledImpl(Features, "pclmul", true);
2465 setFeatureEnabledImpl(Features, "bmi", true);
2466 setFeatureEnabledImpl(Features, "f16c", true);
2467 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002468 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002469 setFeatureEnabledImpl(Features, "ssse3", true);
2470 setFeatureEnabledImpl(Features, "sse4a", true);
2471 setFeatureEnabledImpl(Features, "lzcnt", true);
2472 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002473 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002474 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002475 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002476 case CK_BDVER4:
2477 setFeatureEnabledImpl(Features, "avx2", true);
2478 setFeatureEnabledImpl(Features, "bmi2", true);
2479 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002480 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002481 setFeatureEnabledImpl(Features, "fsgsbase", true);
2482 // FALLTHROUGH
2483 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002484 setFeatureEnabledImpl(Features, "bmi", true);
2485 setFeatureEnabledImpl(Features, "fma", true);
2486 setFeatureEnabledImpl(Features, "f16c", true);
2487 setFeatureEnabledImpl(Features, "tbm", true);
2488 // FALLTHROUGH
2489 case CK_BDVER1:
2490 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002491 setFeatureEnabledImpl(Features, "xop", true);
2492 setFeatureEnabledImpl(Features, "lzcnt", true);
2493 setFeatureEnabledImpl(Features, "aes", true);
2494 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002495 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002496 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002497 break;
Eli Friedman33465822011-07-08 23:31:17 +00002498 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002499}
2500
Rafael Espindolae62e2792013-08-20 13:44:29 +00002501void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002502 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002503 if (Enabled) {
2504 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002505 case AVX512F:
2506 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002507 case AVX2:
2508 Features["avx2"] = true;
2509 case AVX:
2510 Features["avx"] = true;
2511 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002512 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002513 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002514 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002515 case SSSE3:
2516 Features["ssse3"] = true;
2517 case SSE3:
2518 Features["sse3"] = true;
2519 case SSE2:
2520 Features["sse2"] = true;
2521 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002522 Features["sse"] = true;
2523 case NoSSE:
2524 break;
2525 }
2526 return;
2527 }
2528
2529 switch (Level) {
2530 case NoSSE:
2531 case SSE1:
2532 Features["sse"] = false;
2533 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002534 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2535 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002536 case SSE3:
2537 Features["sse3"] = false;
2538 setXOPLevel(Features, NoXOP, false);
2539 case SSSE3:
2540 Features["ssse3"] = false;
2541 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002542 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002543 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002544 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002545 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002546 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002547 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002548 case AVX2:
2549 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002550 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002551 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002552 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2553 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002554 }
2555}
2556
2557void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002558 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002559 if (Enabled) {
2560 switch (Level) {
2561 case AMD3DNowAthlon:
2562 Features["3dnowa"] = true;
2563 case AMD3DNow:
2564 Features["3dnow"] = true;
2565 case MMX:
2566 Features["mmx"] = true;
2567 case NoMMX3DNow:
2568 break;
2569 }
2570 return;
2571 }
2572
2573 switch (Level) {
2574 case NoMMX3DNow:
2575 case MMX:
2576 Features["mmx"] = false;
2577 case AMD3DNow:
2578 Features["3dnow"] = false;
2579 case AMD3DNowAthlon:
2580 Features["3dnowa"] = false;
2581 }
2582}
2583
2584void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002585 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002586 if (Enabled) {
2587 switch (Level) {
2588 case XOP:
2589 Features["xop"] = true;
2590 case FMA4:
2591 Features["fma4"] = true;
2592 setSSELevel(Features, AVX, true);
2593 case SSE4A:
2594 Features["sse4a"] = true;
2595 setSSELevel(Features, SSE3, true);
2596 case NoXOP:
2597 break;
2598 }
2599 return;
2600 }
2601
2602 switch (Level) {
2603 case NoXOP:
2604 case SSE4A:
2605 Features["sse4a"] = false;
2606 case FMA4:
2607 Features["fma4"] = false;
2608 case XOP:
2609 Features["xop"] = false;
2610 }
2611}
2612
Craig Topper86d79ef2013-09-17 04:51:29 +00002613void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2614 StringRef Name, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002615 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002616
Craig Topper29561122013-09-19 01:13:07 +00002617 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002618 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002619 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002620 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002621 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002622 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002623 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002624 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002625 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002626 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002627 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002628 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002629 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002630 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002631 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002632 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002633 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002634 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002635 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002636 if (Enabled)
2637 setSSELevel(Features, SSE2, Enabled);
2638 } else if (Name == "pclmul") {
2639 if (Enabled)
2640 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002641 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002642 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002643 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002644 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002645 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002646 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002647 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2648 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002649 if (Enabled)
2650 setSSELevel(Features, AVX512F, Enabled);
2651 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002652 if (Enabled)
2653 setSSELevel(Features, AVX, Enabled);
2654 } else if (Name == "fma4") {
2655 setXOPLevel(Features, FMA4, Enabled);
2656 } else if (Name == "xop") {
2657 setXOPLevel(Features, XOP, Enabled);
2658 } else if (Name == "sse4a") {
2659 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002660 } else if (Name == "f16c") {
2661 if (Enabled)
2662 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002663 } else if (Name == "sha") {
2664 if (Enabled)
2665 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002666 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002667}
2668
Eric Christopher3ff21b32013-10-16 21:26:26 +00002669/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002670/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002671bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002672 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002673 // Remember the maximum enabled sselevel.
2674 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2675 // Ignore disabled features.
2676 if (Features[i][0] == '-')
2677 continue;
2678
Benjamin Kramer27402c62012-03-05 15:10:44 +00002679 StringRef Feature = StringRef(Features[i]).substr(1);
2680
2681 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002682 HasAES = true;
2683 continue;
2684 }
2685
Craig Topper3f122a72012-05-31 05:18:48 +00002686 if (Feature == "pclmul") {
2687 HasPCLMUL = true;
2688 continue;
2689 }
2690
Benjamin Kramer27402c62012-03-05 15:10:44 +00002691 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002692 HasLZCNT = true;
2693 continue;
2694 }
2695
Rafael Espindola89049822013-08-23 20:21:37 +00002696 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002697 HasRDRND = true;
2698 continue;
2699 }
2700
Craig Topper8c7f2512014-11-03 06:51:41 +00002701 if (Feature == "fsgsbase") {
2702 HasFSGSBASE = true;
2703 continue;
2704 }
2705
Benjamin Kramer27402c62012-03-05 15:10:44 +00002706 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002707 HasBMI = true;
2708 continue;
2709 }
2710
Benjamin Kramer27402c62012-03-05 15:10:44 +00002711 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002712 HasBMI2 = true;
2713 continue;
2714 }
2715
Benjamin Kramer27402c62012-03-05 15:10:44 +00002716 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002717 HasPOPCNT = true;
2718 continue;
2719 }
2720
Michael Liao625a8752012-11-10 05:17:46 +00002721 if (Feature == "rtm") {
2722 HasRTM = true;
2723 continue;
2724 }
2725
Michael Liao74f4eaf2013-03-26 17:52:08 +00002726 if (Feature == "prfchw") {
2727 HasPRFCHW = true;
2728 continue;
2729 }
2730
Michael Liaoffaae352013-03-29 05:17:55 +00002731 if (Feature == "rdseed") {
2732 HasRDSEED = true;
2733 continue;
2734 }
2735
Robert Khasanov50e6f582014-09-19 09:53:48 +00002736 if (Feature == "adx") {
2737 HasADX = true;
2738 continue;
2739 }
2740
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002741 if (Feature == "tbm") {
2742 HasTBM = true;
2743 continue;
2744 }
2745
Craig Topperbba778b2012-06-03 21:46:30 +00002746 if (Feature == "fma") {
2747 HasFMA = true;
2748 continue;
2749 }
2750
Manman Rena45358c2012-10-11 00:59:55 +00002751 if (Feature == "f16c") {
2752 HasF16C = true;
2753 continue;
2754 }
2755
Craig Topper679b53a2013-08-21 05:29:10 +00002756 if (Feature == "avx512cd") {
2757 HasAVX512CD = true;
2758 continue;
2759 }
2760
2761 if (Feature == "avx512er") {
2762 HasAVX512ER = true;
2763 continue;
2764 }
2765
2766 if (Feature == "avx512pf") {
2767 HasAVX512PF = true;
2768 continue;
2769 }
2770
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002771 if (Feature == "avx512dq") {
2772 HasAVX512DQ = true;
2773 continue;
2774 }
2775
2776 if (Feature == "avx512bw") {
2777 HasAVX512BW = true;
2778 continue;
2779 }
2780
2781 if (Feature == "avx512vl") {
2782 HasAVX512VL = true;
2783 continue;
2784 }
2785
Ben Langmuir58078d02013-09-19 13:22:04 +00002786 if (Feature == "sha") {
2787 HasSHA = true;
2788 continue;
2789 }
2790
Nick Lewycky50e8f482013-10-05 20:14:27 +00002791 if (Feature == "cx16") {
2792 HasCX16 = true;
2793 continue;
2794 }
2795
Daniel Dunbar979586e2009-11-11 09:38:56 +00002796 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002797 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002798 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002799 .Case("avx2", AVX2)
2800 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002801 .Case("sse4.2", SSE42)
2802 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002803 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002804 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002805 .Case("sse2", SSE2)
2806 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002807 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002808 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002809
Eli Friedman33465822011-07-08 23:31:17 +00002810 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002811 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002812 .Case("3dnowa", AMD3DNowAthlon)
2813 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002814 .Case("mmx", MMX)
2815 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002816 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002817
2818 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2819 .Case("xop", XOP)
2820 .Case("fma4", FMA4)
2821 .Case("sse4a", SSE4A)
2822 .Default(NoXOP);
2823 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002824 }
Eli Friedman33465822011-07-08 23:31:17 +00002825
Craig Topper7481d8a2013-09-10 06:55:47 +00002826 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2827 // Can't do this earlier because we need to be able to explicitly enable
2828 // popcnt and still disable sse4.2.
2829 if (!HasPOPCNT && SSELevel >= SSE42 &&
2830 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2831 HasPOPCNT = true;
2832 Features.push_back("+popcnt");
2833 }
2834
Yunzhong Gao61089362013-10-16 19:07:02 +00002835 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2836 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2837 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2838 HasPRFCHW = true;
2839 Features.push_back("+prfchw");
2840 }
2841
Rafael Espindolaeb265472013-08-21 21:59:03 +00002842 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2843 // matches the selected sse level.
2844 if (FPMath == FP_SSE && SSELevel < SSE1) {
2845 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2846 return false;
2847 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2848 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2849 return false;
2850 }
2851
Eli Friedman33465822011-07-08 23:31:17 +00002852 // Don't tell the backend if we're turning off mmx; it will end up disabling
2853 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002854 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2855 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002856 std::vector<std::string>::iterator it;
2857 it = std::find(Features.begin(), Features.end(), "-mmx");
2858 if (it != Features.end())
2859 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002860 else if (SSELevel > NoSSE)
2861 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002862 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002863}
Chris Lattnerecd49032009-03-02 22:27:17 +00002864
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002865/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2866/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002867void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002868 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002869 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002870 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002871 Builder.defineMacro("__amd64__");
2872 Builder.defineMacro("__amd64");
2873 Builder.defineMacro("__x86_64");
2874 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002875 if (getTriple().getArchName() == "x86_64h") {
2876 Builder.defineMacro("__x86_64h");
2877 Builder.defineMacro("__x86_64h__");
2878 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002879 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002880 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002881 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002882
Chris Lattnerecd49032009-03-02 22:27:17 +00002883 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002884 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2885 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002886 switch (CPU) {
2887 case CK_Generic:
2888 break;
2889 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002890 // The rest are coming from the i386 define above.
2891 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002892 break;
2893 case CK_i486:
2894 case CK_WinChipC6:
2895 case CK_WinChip2:
2896 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002897 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002898 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002899 case CK_PentiumMMX:
2900 Builder.defineMacro("__pentium_mmx__");
2901 Builder.defineMacro("__tune_pentium_mmx__");
2902 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002903 case CK_i586:
2904 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002905 defineCPUMacros(Builder, "i586");
2906 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002907 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002908 case CK_Pentium3:
2909 case CK_Pentium3M:
2910 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002911 Builder.defineMacro("__tune_pentium3__");
2912 // Fallthrough
2913 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002914 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002915 Builder.defineMacro("__tune_pentium2__");
2916 // Fallthrough
2917 case CK_PentiumPro:
2918 Builder.defineMacro("__tune_i686__");
2919 Builder.defineMacro("__tune_pentiumpro__");
2920 // Fallthrough
2921 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002922 Builder.defineMacro("__i686");
2923 Builder.defineMacro("__i686__");
2924 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2925 Builder.defineMacro("__pentiumpro");
2926 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002927 break;
2928 case CK_Pentium4:
2929 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002930 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002931 break;
2932 case CK_Yonah:
2933 case CK_Prescott:
2934 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002935 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002936 break;
2937 case CK_Core2:
2938 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002939 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002940 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002941 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002942 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002943 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002944 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002945 defineCPUMacros(Builder, "slm");
2946 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002947 case CK_Nehalem:
2948 case CK_Westmere:
2949 case CK_SandyBridge:
2950 case CK_IvyBridge:
2951 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002952 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002953 // FIXME: Historically, we defined this legacy name, it would be nice to
2954 // remove it at some point. We've never exposed fine-grained names for
2955 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002956 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002957 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002958 case CK_Skylake:
2959 // FIXME: Historically, we defined this legacy name, it would be nice to
2960 // remove it at some point. This is the only fine-grained CPU macro in the
2961 // main intel CPU line, and it would be better to not have these and force
2962 // people to use ISA macros.
2963 defineCPUMacros(Builder, "skx");
2964 break;
Craig Topper449314e2013-08-20 07:09:39 +00002965 case CK_KNL:
2966 defineCPUMacros(Builder, "knl");
2967 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002968 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002969 Builder.defineMacro("__k6_2__");
2970 Builder.defineMacro("__tune_k6_2__");
2971 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002972 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002973 if (CPU != CK_K6_2) { // In case of fallthrough
2974 // FIXME: GCC may be enabling these in cases where some other k6
2975 // architecture is specified but -m3dnow is explicitly provided. The
2976 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002977 Builder.defineMacro("__k6_3__");
2978 Builder.defineMacro("__tune_k6_3__");
2979 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002980 // Fallthrough
2981 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002982 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002983 break;
2984 case CK_Athlon:
2985 case CK_AthlonThunderbird:
2986 case CK_Athlon4:
2987 case CK_AthlonXP:
2988 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002989 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002990 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002991 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002992 Builder.defineMacro("__tune_athlon_sse__");
2993 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002994 break;
2995 case CK_K8:
2996 case CK_K8SSE3:
2997 case CK_x86_64:
2998 case CK_Opteron:
2999 case CK_OpteronSSE3:
3000 case CK_Athlon64:
3001 case CK_Athlon64SSE3:
3002 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003003 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003004 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003005 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003006 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003007 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003008 case CK_BTVER1:
3009 defineCPUMacros(Builder, "btver1");
3010 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003011 case CK_BTVER2:
3012 defineCPUMacros(Builder, "btver2");
3013 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003014 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003015 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003016 break;
3017 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003018 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003019 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003020 case CK_BDVER3:
3021 defineCPUMacros(Builder, "bdver3");
3022 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003023 case CK_BDVER4:
3024 defineCPUMacros(Builder, "bdver4");
3025 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003026 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003027 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003028 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003029 }
Chris Lattner96e43572009-03-02 22:40:39 +00003030
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003031 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003032 Builder.defineMacro("__REGISTER_PREFIX__", "");
3033
Chris Lattner6df41af2009-04-19 17:32:33 +00003034 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3035 // functions in glibc header files that use FP Stack inline asm which the
3036 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003037 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003038
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003039 if (HasAES)
3040 Builder.defineMacro("__AES__");
3041
Craig Topper3f122a72012-05-31 05:18:48 +00003042 if (HasPCLMUL)
3043 Builder.defineMacro("__PCLMUL__");
3044
Craig Topper22967d42011-12-25 05:06:45 +00003045 if (HasLZCNT)
3046 Builder.defineMacro("__LZCNT__");
3047
Benjamin Kramer1e250392012-07-07 09:39:18 +00003048 if (HasRDRND)
3049 Builder.defineMacro("__RDRND__");
3050
Craig Topper8c7f2512014-11-03 06:51:41 +00003051 if (HasFSGSBASE)
3052 Builder.defineMacro("__FSGSBASE__");
3053
Craig Topper22967d42011-12-25 05:06:45 +00003054 if (HasBMI)
3055 Builder.defineMacro("__BMI__");
3056
3057 if (HasBMI2)
3058 Builder.defineMacro("__BMI2__");
3059
Craig Topper1de83482011-12-29 16:10:46 +00003060 if (HasPOPCNT)
3061 Builder.defineMacro("__POPCNT__");
3062
Michael Liao625a8752012-11-10 05:17:46 +00003063 if (HasRTM)
3064 Builder.defineMacro("__RTM__");
3065
Michael Liao74f4eaf2013-03-26 17:52:08 +00003066 if (HasPRFCHW)
3067 Builder.defineMacro("__PRFCHW__");
3068
Michael Liaoffaae352013-03-29 05:17:55 +00003069 if (HasRDSEED)
3070 Builder.defineMacro("__RDSEED__");
3071
Robert Khasanov50e6f582014-09-19 09:53:48 +00003072 if (HasADX)
3073 Builder.defineMacro("__ADX__");
3074
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003075 if (HasTBM)
3076 Builder.defineMacro("__TBM__");
3077
Rafael Espindolae62e2792013-08-20 13:44:29 +00003078 switch (XOPLevel) {
3079 case XOP:
3080 Builder.defineMacro("__XOP__");
3081 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003082 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003083 case SSE4A:
3084 Builder.defineMacro("__SSE4A__");
3085 case NoXOP:
3086 break;
3087 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003088
Craig Topperbba778b2012-06-03 21:46:30 +00003089 if (HasFMA)
3090 Builder.defineMacro("__FMA__");
3091
Manman Rena45358c2012-10-11 00:59:55 +00003092 if (HasF16C)
3093 Builder.defineMacro("__F16C__");
3094
Craig Topper679b53a2013-08-21 05:29:10 +00003095 if (HasAVX512CD)
3096 Builder.defineMacro("__AVX512CD__");
3097 if (HasAVX512ER)
3098 Builder.defineMacro("__AVX512ER__");
3099 if (HasAVX512PF)
3100 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003101 if (HasAVX512DQ)
3102 Builder.defineMacro("__AVX512DQ__");
3103 if (HasAVX512BW)
3104 Builder.defineMacro("__AVX512BW__");
3105 if (HasAVX512VL)
3106 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003107
Ben Langmuir58078d02013-09-19 13:22:04 +00003108 if (HasSHA)
3109 Builder.defineMacro("__SHA__");
3110
Nick Lewycky50e8f482013-10-05 20:14:27 +00003111 if (HasCX16)
3112 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3113
Chris Lattner96e43572009-03-02 22:40:39 +00003114 // Each case falls through to the previous one here.
3115 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003116 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003117 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003118 case AVX2:
3119 Builder.defineMacro("__AVX2__");
3120 case AVX:
3121 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003122 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003123 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003124 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003125 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003126 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003127 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003128 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003129 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003130 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003131 Builder.defineMacro("__SSE2__");
3132 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003133 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003134 Builder.defineMacro("__SSE__");
3135 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003136 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003137 break;
3138 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003139
Derek Schuffc7dd7222012-10-11 15:52:22 +00003140 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003141 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003142 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003143 case AVX2:
3144 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003145 case SSE42:
3146 case SSE41:
3147 case SSSE3:
3148 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003149 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003150 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003151 break;
3152 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003153 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003154 break;
3155 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003156 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003157 }
3158 }
3159
Anders Carlssone437c682010-01-27 03:47:49 +00003160 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003161 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003162 case AMD3DNowAthlon:
3163 Builder.defineMacro("__3dNOW_A__");
3164 case AMD3DNow:
3165 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003166 case MMX:
3167 Builder.defineMacro("__MMX__");
3168 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003169 break;
3170 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003171
3172 if (CPU >= CK_i486) {
3173 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3174 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3175 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3176 }
3177 if (CPU >= CK_i586)
3178 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003179}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003180
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003181bool X86TargetInfo::hasFeature(StringRef Feature) const {
3182 return llvm::StringSwitch<bool>(Feature)
3183 .Case("aes", HasAES)
3184 .Case("avx", SSELevel >= AVX)
3185 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003186 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003187 .Case("avx512cd", HasAVX512CD)
3188 .Case("avx512er", HasAVX512ER)
3189 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003190 .Case("avx512dq", HasAVX512DQ)
3191 .Case("avx512bw", HasAVX512BW)
3192 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003193 .Case("bmi", HasBMI)
3194 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003195 .Case("cx16", HasCX16)
3196 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003197 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003198 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003199 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003200 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003201 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3202 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3203 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003204 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003205 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003206 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003207 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003208 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003209 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003210 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003211 .Case("sse", SSELevel >= SSE1)
3212 .Case("sse2", SSELevel >= SSE2)
3213 .Case("sse3", SSELevel >= SSE3)
3214 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003215 .Case("sse4.1", SSELevel >= SSE41)
3216 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003217 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003218 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003219 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003220 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3221 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003222 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003223 .Default(false);
3224}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003225
Eli Friedman3fd920a2008-08-20 02:34:37 +00003226bool
Anders Carlsson58436352009-02-28 17:11:49 +00003227X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003228 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003229 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003230 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003231 case 'I':
3232 Info.setRequiresImmediate(0, 31);
3233 return true;
3234 case 'J':
3235 Info.setRequiresImmediate(0, 63);
3236 return true;
3237 case 'K':
3238 Info.setRequiresImmediate(-128, 127);
3239 return true;
3240 case 'L':
3241 // FIXME: properly analyze this constraint:
3242 // must be one of 0xff, 0xffff, or 0xffffffff
3243 return true;
3244 case 'M':
3245 Info.setRequiresImmediate(0, 3);
3246 return true;
3247 case 'N':
3248 Info.setRequiresImmediate(0, 255);
3249 return true;
3250 case 'O':
3251 Info.setRequiresImmediate(0, 127);
3252 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003253 case 'Y': // first letter of a pair:
3254 switch (*(Name+1)) {
3255 default: return false;
3256 case '0': // First SSE register.
3257 case 't': // Any SSE register, when SSE2 is enabled.
3258 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3259 case 'm': // any MMX register, when inter-unit moves enabled.
3260 break; // falls through to setAllowsRegister.
3261 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003262 case 'f': // any x87 floating point stack register.
3263 // Constraint 'f' cannot be used for output operands.
3264 if (Info.ConstraintStr[0] == '=')
3265 return false;
3266
3267 Info.setAllowsRegister();
3268 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003269 case 'a': // eax.
3270 case 'b': // ebx.
3271 case 'c': // ecx.
3272 case 'd': // edx.
3273 case 'S': // esi.
3274 case 'D': // edi.
3275 case 'A': // edx:eax.
3276 case 't': // top of floating point stack.
3277 case 'u': // second from top of floating point stack.
3278 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003279 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003280 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003281 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003282 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3283 case 'l': // "Index" registers: any general register that can be used as an
3284 // index in a base+index memory access.
3285 Info.setAllowsRegister();
3286 return true;
3287 case 'C': // SSE floating point constant.
3288 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003289 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003290 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003291 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003292 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003293 return true;
3294 }
3295}
3296
Akira Hatanaka974131e2014-09-18 18:17:18 +00003297bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3298 unsigned Size) const {
3299 // Strip off constraint modifiers.
3300 while (Constraint[0] == '=' ||
3301 Constraint[0] == '+' ||
3302 Constraint[0] == '&')
3303 Constraint = Constraint.substr(1);
3304
3305 return validateOperandSize(Constraint, Size);
3306}
3307
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003308bool X86TargetInfo::validateInputSize(StringRef Constraint,
3309 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003310 return validateOperandSize(Constraint, Size);
3311}
3312
3313bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3314 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003315 switch (Constraint[0]) {
3316 default: break;
3317 case 'y':
3318 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003319 case 'f':
3320 case 't':
3321 case 'u':
3322 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003323 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003324 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003325 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003326 }
3327
3328 return true;
3329}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003330
Eli Friedman3fd920a2008-08-20 02:34:37 +00003331std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003332X86TargetInfo::convertConstraint(const char *&Constraint) const {
3333 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003334 case 'a': return std::string("{ax}");
3335 case 'b': return std::string("{bx}");
3336 case 'c': return std::string("{cx}");
3337 case 'd': return std::string("{dx}");
3338 case 'S': return std::string("{si}");
3339 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003340 case 'p': // address
3341 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003342 case 't': // top of floating point stack.
3343 return std::string("{st}");
3344 case 'u': // second from top of floating point stack.
3345 return std::string("{st(1)}"); // second from top of floating point stack.
3346 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003347 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003348 }
3349}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003350
Eli Friedman3fd920a2008-08-20 02:34:37 +00003351// X86-32 generic target
3352class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003353public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003354 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003355 DoubleAlign = LongLongAlign = 32;
3356 LongDoubleWidth = 96;
3357 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003358 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003359 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003360 SizeType = UnsignedInt;
3361 PtrDiffType = SignedInt;
3362 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003363 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003364
3365 // Use fpret for all types.
3366 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3367 (1 << TargetInfo::Double) |
3368 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003369
3370 // x86-32 has atomics up to 8 bytes
3371 // FIXME: Check that we actually have cmpxchg8b before setting
3372 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3373 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003374 }
Craig Topper3164f332014-03-11 03:39:26 +00003375 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003376 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003377 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003378
Craig Topper3164f332014-03-11 03:39:26 +00003379 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003380 if (RegNo == 0) return 0;
3381 if (RegNo == 1) return 2;
3382 return -1;
3383 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003384 bool validateOperandSize(StringRef Constraint,
3385 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003386 switch (Constraint[0]) {
3387 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003388 case 'R':
3389 case 'q':
3390 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003391 case 'a':
3392 case 'b':
3393 case 'c':
3394 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003395 case 'S':
3396 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003397 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003398 case 'A':
3399 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003400 }
3401
Akira Hatanaka974131e2014-09-18 18:17:18 +00003402 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003403 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003404};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003405
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003406class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3407public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003408 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3409 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003410
Craig Topper3164f332014-03-11 03:39:26 +00003411 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003412 unsigned Major, Minor, Micro;
3413 getTriple().getOSVersion(Major, Minor, Micro);
3414 // New NetBSD uses the default rounding mode.
3415 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3416 return X86_32TargetInfo::getFloatEvalMethod();
3417 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003418 return 1;
3419 }
3420};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003421
Eli Friedmane3aa4542009-07-05 18:47:56 +00003422class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3423public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003424 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3425 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003426 SizeType = UnsignedLong;
3427 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003428 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003429 }
3430};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003431
Eli Friedman9fa28852012-08-08 23:57:20 +00003432class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3433public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003434 BitrigI386TargetInfo(const llvm::Triple &Triple)
3435 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003436 SizeType = UnsignedLong;
3437 IntPtrType = SignedLong;
3438 PtrDiffType = SignedLong;
3439 }
3440};
Eli Friedman9fa28852012-08-08 23:57:20 +00003441
Torok Edwinb2b37c62009-06-30 17:10:35 +00003442class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003443public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003444 DarwinI386TargetInfo(const llvm::Triple &Triple)
3445 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003446 LongDoubleWidth = 128;
3447 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003448 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003449 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003450 SizeType = UnsignedLong;
3451 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003452 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003453 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003454 }
3455
Eli Friedman3fd920a2008-08-20 02:34:37 +00003456};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003457
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003458// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003459class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003460public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003461 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3462 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003463 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003464 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003465 bool IsWinCOFF =
3466 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
3467 DescriptionString = IsWinCOFF ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32"
3468 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003469 }
Craig Topper3164f332014-03-11 03:39:26 +00003470 void getTargetDefines(const LangOptions &Opts,
3471 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003472 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3473 }
3474};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003475
3476// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003477class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003478public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003479 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003480 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003481 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003482 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3483 }
Craig Topper3164f332014-03-11 03:39:26 +00003484 void getTargetDefines(const LangOptions &Opts,
3485 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003486 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3487 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3488 // The value of the following reflects processor type.
3489 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3490 // We lost the original triple, so we use the default.
3491 Builder.defineMacro("_M_IX86", "600");
3492 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003493};
3494} // end anonymous namespace
3495
Reid Kleckner47606832014-04-21 20:58:00 +00003496static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3497 Builder.defineMacro("__MSVCRT__");
3498 Builder.defineMacro("__MINGW32__");
3499
3500 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3501 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3502 // macro anyway for pre-processor compatibility.
3503 if (Opts.MicrosoftExt)
3504 Builder.defineMacro("__declspec", "__declspec");
3505 else
3506 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3507
3508 if (!Opts.MicrosoftExt) {
3509 // Provide macros for all the calling convention keywords. Provide both
3510 // single and double underscore prefixed variants. These are available on
3511 // x64 as well as x86, even though they have no effect.
3512 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3513 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003514 std::string GCCSpelling = "__attribute__((__";
3515 GCCSpelling += CC;
3516 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003517 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3518 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3519 }
3520 }
3521}
3522
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003523namespace {
3524// x86-32 MinGW target
3525class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3526public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003527 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3528 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003529 void getTargetDefines(const LangOptions &Opts,
3530 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003531 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003532 DefineStd(Builder, "WIN32", Opts);
3533 DefineStd(Builder, "WINNT", Opts);
3534 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003535 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003536 }
3537};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003538
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003539// x86-32 Cygwin target
3540class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3541public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003542 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3543 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003544 TLSSupported = false;
3545 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003546 DoubleAlign = LongLongAlign = 64;
David Majnemer8fa8c382015-03-17 23:55:00 +00003547 DescriptionString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003548 }
Craig Topper3164f332014-03-11 03:39:26 +00003549 void getTargetDefines(const LangOptions &Opts,
3550 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003551 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003552 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003553 Builder.defineMacro("__CYGWIN__");
3554 Builder.defineMacro("__CYGWIN32__");
3555 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003556 if (Opts.CPlusPlus)
3557 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003558 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003559};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003560
Chris Lattnerb986aba2010-04-11 19:29:39 +00003561// x86-32 Haiku target
3562class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3563public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003564 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003565 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003566 IntPtrType = SignedLong;
3567 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003568 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003569 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003570 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003571 }
Craig Topper3164f332014-03-11 03:39:26 +00003572 void getTargetDefines(const LangOptions &Opts,
3573 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003574 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3575 Builder.defineMacro("__INTEL__");
3576 Builder.defineMacro("__HAIKU__");
3577 }
3578};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003579
Douglas Gregor9fabd852011-07-01 22:41:14 +00003580// RTEMS Target
3581template<typename Target>
3582class RTEMSTargetInfo : public OSTargetInfo<Target> {
3583protected:
Craig Topper3164f332014-03-11 03:39:26 +00003584 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3585 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003586 // RTEMS defines; list based off of gcc output
3587
Douglas Gregor9fabd852011-07-01 22:41:14 +00003588 Builder.defineMacro("__rtems__");
3589 Builder.defineMacro("__ELF__");
3590 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003591
Douglas Gregor9fabd852011-07-01 22:41:14 +00003592public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003593 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3594 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003595
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003596 switch (Triple.getArch()) {
3597 default:
3598 case llvm::Triple::x86:
3599 // this->MCountName = ".mcount";
3600 break;
3601 case llvm::Triple::mips:
3602 case llvm::Triple::mipsel:
3603 case llvm::Triple::ppc:
3604 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003605 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003606 // this->MCountName = "_mcount";
3607 break;
3608 case llvm::Triple::arm:
3609 // this->MCountName = "__mcount";
3610 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003611 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003612 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003613};
3614
Douglas Gregor9fabd852011-07-01 22:41:14 +00003615// x86-32 RTEMS target
3616class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3617public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003618 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003619 SizeType = UnsignedLong;
3620 IntPtrType = SignedLong;
3621 PtrDiffType = SignedLong;
3622 this->UserLabelPrefix = "";
3623 }
Craig Topper3164f332014-03-11 03:39:26 +00003624 void getTargetDefines(const LangOptions &Opts,
3625 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003626 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3627 Builder.defineMacro("__INTEL__");
3628 Builder.defineMacro("__rtems__");
3629 }
3630};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003631
Eli Friedman3fd920a2008-08-20 02:34:37 +00003632// x86-64 generic target
3633class X86_64TargetInfo : public X86TargetInfo {
3634public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003635 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003636 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003637 bool IsWinCOFF =
3638 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003639 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003640 LongDoubleWidth = 128;
3641 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003642 LargeArrayMinWidth = 128;
3643 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003644 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003645 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3646 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3647 IntPtrType = IsX32 ? SignedInt : SignedLong;
3648 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003649 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003650 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003651
Eric Christopher917e9522014-11-18 22:36:15 +00003652 // Pointers are 32-bit in x32.
David Majnemer8fa8c382015-03-17 23:55:00 +00003653 DescriptionString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3654 : IsWinCOFF
3655 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3656 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003657
3658 // Use fpret only for long double.
3659 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003660
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003661 // Use fp2ret for _Complex long double.
3662 ComplexLongDoubleUsesFP2Ret = true;
3663
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003664 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003665 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003666 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003667 }
Craig Topper3164f332014-03-11 03:39:26 +00003668 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003669 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003670 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003671
Craig Topper3164f332014-03-11 03:39:26 +00003672 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003673 if (RegNo == 0) return 0;
3674 if (RegNo == 1) return 1;
3675 return -1;
3676 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003677
Craig Topper3164f332014-03-11 03:39:26 +00003678 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003679 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003680 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003681 CC == CC_IntelOclBicc ||
3682 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003683 }
3684
Craig Topper3164f332014-03-11 03:39:26 +00003685 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003686 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003687 }
3688
Pavel Chupinfd223e12014-08-04 12:39:43 +00003689 // for x32 we need it here explicitly
3690 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003691};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003692
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003693// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003694class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003695public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003696 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3697 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003698 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003699 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003700 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003701 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003702 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003703 SizeType = UnsignedLongLong;
3704 PtrDiffType = SignedLongLong;
3705 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003706 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003707 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003708
Craig Topper3164f332014-03-11 03:39:26 +00003709 void getTargetDefines(const LangOptions &Opts,
3710 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003711 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003712 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003713 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003714
Craig Topper3164f332014-03-11 03:39:26 +00003715 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003716 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003717 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003718
Craig Topper3164f332014-03-11 03:39:26 +00003719 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003720 switch (CC) {
3721 case CC_X86StdCall:
3722 case CC_X86ThisCall:
3723 case CC_X86FastCall:
3724 return CCCR_Ignore;
3725 case CC_C:
3726 case CC_X86VectorCall:
3727 case CC_IntelOclBicc:
3728 case CC_X86_64SysV:
3729 return CCCR_OK;
3730 default:
3731 return CCCR_Warning;
3732 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003733 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003734};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003735
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003736// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003737class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003738public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003739 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003740 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003741 LongDoubleWidth = LongDoubleAlign = 64;
3742 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003743 }
Craig Topper3164f332014-03-11 03:39:26 +00003744 void getTargetDefines(const LangOptions &Opts,
3745 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003746 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3747 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003748 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003749 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003750 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003751};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003752
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003753// x86-64 MinGW target
3754class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3755public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003756 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3757 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003758 void getTargetDefines(const LangOptions &Opts,
3759 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003760 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003761 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003762 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003763 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003764
3765 // GCC defines this macro when it is using __gxx_personality_seh0.
3766 if (!Opts.SjLjExceptions)
3767 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003768 }
3769};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003770
Eli Friedman2857ccb2009-07-01 03:36:11 +00003771class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3772public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003773 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3774 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003775 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003776 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003777 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3778 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003779 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003780 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003781 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003782 }
3783};
Eli Friedman2857ccb2009-07-01 03:36:11 +00003784
Eli Friedman245f2292009-07-05 22:31:18 +00003785class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3786public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003787 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3788 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003789 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003790 Int64Type = SignedLongLong;
3791 }
3792};
Eli Friedman245f2292009-07-05 22:31:18 +00003793
Eli Friedman9fa28852012-08-08 23:57:20 +00003794class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3795public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003796 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3797 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3798 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003799 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003800 }
3801};
Tim Northover9bb857a2013-01-31 12:13:10 +00003802
Eli Friedmanf05b7722008-08-20 07:44:10 +00003803class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003804 // Possible FPU choices.
3805 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003806 VFP2FPU = (1 << 0),
3807 VFP3FPU = (1 << 1),
3808 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003809 NeonFPU = (1 << 3),
3810 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003811 };
3812
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003813 // Possible HWDiv features.
3814 enum HWDivMode {
3815 HWDivThumb = (1 << 0),
3816 HWDivARM = (1 << 1)
3817 };
3818
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003819 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003820 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003821 }
3822
3823 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3824 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003825
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003826 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003827
Rafael Espindolaeb265472013-08-21 21:59:03 +00003828 enum {
3829 FP_Default,
3830 FP_VFP,
3831 FP_Neon
3832 } FPMath;
3833
Bernard Ogdenda13af32013-10-24 18:32:51 +00003834 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003835
Logan Chien57086ce2012-10-10 06:56:20 +00003836 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003837 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003838 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003839
3840 // Initialized via features.
3841 unsigned SoftFloat : 1;
3842 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003843
Bernard Ogden18b57012013-10-29 09:47:51 +00003844 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003845 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003846
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003847 // ACLE 6.5.1 Hardware floating point
3848 enum {
3849 HW_FP_HP = (1 << 1), /// half (16-bit)
3850 HW_FP_SP = (1 << 2), /// single (32-bit)
3851 HW_FP_DP = (1 << 3), /// double (64-bit)
3852 };
3853 uint32_t HW_FP;
3854
Chris Lattner5cc15e02010-03-03 19:03:45 +00003855 static const Builtin::Info BuiltinInfo[];
3856
Rafael Espindola101d5b92013-05-13 20:09:47 +00003857 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003858 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003859 if (T.getArch() == llvm::Triple::arm ||
3860 T.getArch() == llvm::Triple::armeb) {
3861 StringRef VersionStr;
3862 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003863 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003864 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003865 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003866 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003867 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003868 unsigned Version;
3869 if (VersionStr.getAsInteger(10, Version))
3870 return false;
3871 return Version >= 6;
3872 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003873 assert(T.getArch() == llvm::Triple::thumb ||
3874 T.getArch() == llvm::Triple::thumbeb);
3875 StringRef VersionStr;
3876 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003877 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003878 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003879 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003880 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003881 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003882 unsigned Version;
3883 if (VersionStr.getAsInteger(10, Version))
3884 return false;
3885 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003886 }
3887
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003888 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003889 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003890
3891 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003892 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003893
Renato Golin9ba39232015-02-27 16:35:48 +00003894 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
3895 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
3896 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003897 SizeType = UnsignedLong;
3898 else
3899 SizeType = UnsignedInt;
3900
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003901 switch (T.getOS()) {
3902 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003903 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003904 break;
3905 case llvm::Triple::Win32:
3906 WCharType = UnsignedShort;
3907 break;
3908 case llvm::Triple::Linux:
3909 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003910 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3911 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003912 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003913 }
3914
3915 UseBitFieldTypeAlignment = true;
3916
3917 ZeroLengthBitfieldBoundary = 0;
3918
Tim Northover147cd2f2014-10-14 22:12:21 +00003919 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3920 // so set preferred for small types to 32.
3921 if (T.isOSBinFormatMachO()) {
3922 DescriptionString =
3923 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3924 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3925 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00003926 assert(!BigEndian && "Windows on ARM does not support big endian");
3927 DescriptionString = "e"
David Majnemer8fa8c382015-03-17 23:55:00 +00003928 "-m:w"
Tim Northover147cd2f2014-10-14 22:12:21 +00003929 "-p:32:32"
3930 "-i64:64"
3931 "-v128:64:128"
3932 "-a:0:32"
3933 "-n32"
3934 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003935 } else if (T.isOSNaCl()) {
3936 assert(!BigEndian && "NaCl on ARM does not support big endian");
3937 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003938 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003939 DescriptionString =
3940 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3941 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003942 }
3943
3944 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003945 }
3946
3947 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003948 const llvm::Triple &T = getTriple();
3949
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003950 IsAAPCS = false;
3951
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003952 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003953
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003954 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003955 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003956 SizeType = UnsignedInt;
3957 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003958 SizeType = UnsignedLong;
3959
3960 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3961 WCharType = SignedInt;
3962
3963 // Do not respect the alignment of bit-field types when laying out
3964 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3965 UseBitFieldTypeAlignment = false;
3966
3967 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3968 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3969 /// gcc.
3970 ZeroLengthBitfieldBoundary = 32;
3971
Tim Northover147cd2f2014-10-14 22:12:21 +00003972 if (T.isOSBinFormatMachO())
3973 DescriptionString =
3974 BigEndian
3975 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3976 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3977 else
3978 DescriptionString =
3979 BigEndian
3980 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3981 : "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 +00003982
3983 // FIXME: Override "preferred align" for double and long long.
3984 }
3985
Chris Lattner17df24e2008-04-21 18:56:49 +00003986public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003987 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003988 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003989 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003990 BigEndian = IsBigEndian;
3991
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003992 switch (getTriple().getOS()) {
3993 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003994 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003995 break;
3996 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003997 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003998 break;
3999 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004000
Chris Lattner1a8f3942010-04-23 16:29:58 +00004001 // {} in inline assembly are neon specifiers, not assembly variant
4002 // specifiers.
4003 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004004
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004005 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00004006 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004007
Eric Christopher0e261882014-12-05 01:06:59 +00004008 // FIXME: This duplicates code from the driver that sets the -target-abi
4009 // option - this code is used if -target-abi isn't passed and should
4010 // be unified in some way.
4011 if (Triple.isOSBinFormatMachO()) {
4012 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4013 // the frontend matches that.
4014 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4015 Triple.getOS() == llvm::Triple::UnknownOS ||
4016 StringRef(CPU).startswith("cortex-m")) {
4017 setABI("aapcs");
4018 } else {
4019 setABI("apcs-gnu");
4020 }
4021 } else if (Triple.isOSWindows()) {
4022 // FIXME: this is invalid for WindowsCE
4023 setABI("aapcs");
4024 } else {
4025 // Select the default based on the platform.
4026 switch (Triple.getEnvironment()) {
4027 case llvm::Triple::Android:
4028 case llvm::Triple::GNUEABI:
4029 case llvm::Triple::GNUEABIHF:
4030 setABI("aapcs-linux");
4031 break;
4032 case llvm::Triple::EABIHF:
4033 case llvm::Triple::EABI:
4034 setABI("aapcs");
4035 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004036 case llvm::Triple::GNU:
4037 setABI("apcs-gnu");
4038 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004039 default:
4040 if (Triple.getOS() == llvm::Triple::NetBSD)
4041 setABI("apcs-gnu");
4042 else
4043 setABI("aapcs");
4044 break;
4045 }
4046 }
John McCall86353412010-08-21 22:46:04 +00004047
4048 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004049 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004050
4051 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004052 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00004053 if (shouldUseInlineAtomic(getTriple()))
4054 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00004055
4056 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004057 // the alignment of the zero-length bitfield is greater than the member
4058 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004059 // zero length bitfield.
4060 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004061 }
Alp Toker4925ba72014-06-07 23:30:42 +00004062 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00004063 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004064 ABI = Name;
4065
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004066 // The defaults (above) are for AAPCS, check if we need to change them.
4067 //
4068 // FIXME: We need support for -meabi... we could just mangle it into the
4069 // name.
4070 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004071 setABIAPCS();
4072 return true;
4073 }
4074 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4075 setABIAAPCS();
4076 return true;
4077 }
4078 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004079 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004080
Craig Topper3164f332014-03-11 03:39:26 +00004081 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004082 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004083 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4084 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004085 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004086 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004087 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004088 }
4089 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004090 Features["vfp4"] = true;
4091 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004092 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4093 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004094 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004095 Features["vfp4"] = true;
4096 Features["neon"] = true;
4097 Features["hwdiv"] = true;
4098 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004099 } else if (CPU == "cyclone") {
4100 Features["v8fp"] = true;
4101 Features["neon"] = true;
4102 Features["hwdiv"] = true;
4103 Features["hwdiv-arm"] = true;
Renato Golin84545d72015-02-04 13:31:56 +00004104 } else if (CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004105 Features["fp-armv8"] = true;
4106 Features["neon"] = true;
4107 Features["hwdiv"] = true;
4108 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004109 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004110 Features["crypto"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004111 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004112 // Enable the hwdiv extension for all v8a AArch32 cores by
4113 // default.
4114 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004115 ArchName == "armebv8a" || ArchName == "armebv8" ||
4116 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4117 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004118 Features["hwdiv"] = true;
4119 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004120 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
Javed Absar879d18b82015-04-09 14:12:10 +00004121 CPU == "sc300" || CPU == "cortex-r4" || CPU == "cortex-r4f") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004122 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004123 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004124 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004125
Craig Topper3164f332014-03-11 03:39:26 +00004126 bool handleTargetFeatures(std::vector<std::string> &Features,
4127 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004128 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004129 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004130 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004131 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004132 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004133
4134 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004135 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004136 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004137 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004138 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004139 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004140 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004141 HW_FP = HW_FP_SP | HW_FP_DP;
4142 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004143 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004144 HW_FP = HW_FP_SP | HW_FP_DP;
4145 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004146 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004147 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4148 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004149 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004150 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4151 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004152 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004153 HW_FP = HW_FP_SP | HW_FP_DP;
4154 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004155 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004156 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004157 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004158 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004159 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004160 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004161 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004162 } else if (Feature == "+fp-only-sp") {
4163 HW_FP &= ~HW_FP_DP;
4164 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004165 }
4166
Rafael Espindolaeb265472013-08-21 21:59:03 +00004167 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4168 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4169 return false;
4170 }
4171
4172 if (FPMath == FP_Neon)
4173 Features.push_back("+neonfp");
4174 else if (FPMath == FP_VFP)
4175 Features.push_back("-neonfp");
4176
Daniel Dunbar893d4752009-12-19 04:15:38 +00004177 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004178 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4179 for (const auto &FEFeature : FrontEndFeatures) {
4180 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4181 if (Feature != Features.end())
4182 Features.erase(Feature);
4183 }
4184
Rafael Espindolaeb265472013-08-21 21:59:03 +00004185 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004186 }
4187
Craig Topper3164f332014-03-11 03:39:26 +00004188 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004189 return llvm::StringSwitch<bool>(Feature)
4190 .Case("arm", true)
4191 .Case("softfloat", SoftFloat)
4192 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004193 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004194 .Case("hwdiv", HWDiv & HWDivThumb)
4195 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004196 .Default(false);
4197 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004198 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004199 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004200 return llvm::StringSwitch<const char *>(Name)
4201 .Cases("arm8", "arm810", "4")
4202 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4203 "4")
4204 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4205 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4206 .Case("ep9312", "4T")
4207 .Cases("arm10tdmi", "arm1020t", "5T")
4208 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4209 .Case("arm926ej-s", "5TEJ")
4210 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4211 .Cases("xscale", "iwmmxt", "5TE")
4212 .Case("arm1136j-s", "6J")
Renato Goline11531f2015-03-17 11:55:43 +00004213 .Case("arm1136jf-s", "6")
4214 .Cases("mpcorenovfp", "mpcore", "6K")
4215 .Cases("arm1176jz-s", "arm1176jzf-s", "6K")
Eric Christopher917e9522014-11-18 22:36:15 +00004216 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4217 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4218 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4219 "7A")
Javed Absar879d18b82015-04-09 14:12:10 +00004220 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "7R")
Eric Christopher917e9522014-11-18 22:36:15 +00004221 .Case("swift", "7S")
4222 .Case("cyclone", "8A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004223 .Cases("sc300", "cortex-m3", "7M")
Eric Christopher917e9522014-11-18 22:36:15 +00004224 .Cases("cortex-m4", "cortex-m7", "7EM")
Bradley Smithd86d6702015-02-18 10:34:48 +00004225 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "6M")
Renato Golin84545d72015-02-04 13:31:56 +00004226 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Eric Christopher917e9522014-11-18 22:36:15 +00004227 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004228 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004229 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004230 return llvm::StringSwitch<const char *>(Name)
4231 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4232 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4233 "A")
Renato Golin84545d72015-02-04 13:31:56 +00004234 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004235 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m0plus", "M")
4236 .Cases("cortex-m1", "cortex-m7", "sc000", "sc300", "M")
Javed Absar879d18b82015-04-09 14:12:10 +00004237 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "R")
Eric Christopher917e9522014-11-18 22:36:15 +00004238 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004239 }
Craig Topper3164f332014-03-11 03:39:26 +00004240 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004241 if (!getCPUDefineSuffix(Name))
4242 return false;
4243
Tim Northovere8c37212014-07-09 09:24:43 +00004244 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4245 StringRef Profile = getCPUProfile(Name);
4246 if (Profile == "M" && MaxAtomicInlineWidth) {
4247 MaxAtomicPromoteWidth = 32;
4248 MaxAtomicInlineWidth = 32;
4249 }
4250
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004251 CPU = Name;
4252 return true;
4253 }
Craig Topper3164f332014-03-11 03:39:26 +00004254 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004255 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4256 unsigned CPUArchVer) const {
4257 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4258 (CPUArch.find('M') != StringRef::npos);
4259 }
4260 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4261 unsigned CPUArchVer) const {
4262 // We check both CPUArchVer and ArchName because when only triple is
4263 // specified, the default CPU is arm1136j-s.
4264 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4265 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4266 }
Craig Topper3164f332014-03-11 03:39:26 +00004267 void getTargetDefines(const LangOptions &Opts,
4268 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004269 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004270 Builder.defineMacro("__arm");
4271 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004272
Chris Lattnerecd49032009-03-02 22:27:17 +00004273 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004274 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004275
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004276 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004277 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004278 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004279 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004280 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004281
4282 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004283 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004284 StringRef ArchName = getTriple().getArchName();
4285
4286 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4287 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004288 if (CPUArch[0] >= '8') {
4289 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4290 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004291 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004292
4293 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4294 // is not defined for the M-profile.
4295 // NOTE that the deffault profile is assumed to be 'A'
4296 if (CPUProfile.empty() || CPUProfile != "M")
4297 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4298
4299 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4300 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4301 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4302 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4303 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4304 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4305 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4306
4307 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4308 // instruction set such as ARM or Thumb.
4309 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4310
4311 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4312
4313 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004314 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004315 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004316
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004317 // ACLE 6.5.1 Hardware Floating Point
4318 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004319 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004320
Yi Konga44c4d72014-06-27 21:25:42 +00004321 // ACLE predefines.
4322 Builder.defineMacro("__ARM_ACLE", "200");
4323
Mike Stump9d54bd72009-04-08 02:07:04 +00004324 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004325
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004326 // FIXME: It's more complicated than this and we don't really support
4327 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004328 // Windows on ARM does not "support" interworking
4329 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004330 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004331
David Tweed8f676532012-10-25 13:33:01 +00004332 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004333 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004334 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4335 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004336 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004337 Builder.defineMacro("__ARM_PCS", "1");
4338
David Tweed8f676532012-10-25 13:33:01 +00004339 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004340 Builder.defineMacro("__ARM_PCS_VFP", "1");
4341 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004342
Daniel Dunbar893d4752009-12-19 04:15:38 +00004343 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004344 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004345
4346 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004347 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004348
4349 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004350 Builder.defineMacro("__THUMBEL__");
4351 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004352 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004353 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004354 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004355 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4356 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004357
4358 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004359 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004360
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004361 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004362 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004363 if (FPU & VFP2FPU)
4364 Builder.defineMacro("__ARM_VFPV2__");
4365 if (FPU & VFP3FPU)
4366 Builder.defineMacro("__ARM_VFPV3__");
4367 if (FPU & VFP4FPU)
4368 Builder.defineMacro("__ARM_VFPV4__");
4369 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004370
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004371 // This only gets set when Neon instructions are actually available, unlike
4372 // the VFP define, hence the soft float and arch check. This is subtly
4373 // different from gcc, we follow the intent which was that it should be set
4374 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004375 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4376 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004377 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004378 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004379
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004380 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4381 Opts.ShortWChar ? "2" : "4");
4382
4383 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4384 Opts.ShortEnums ? "1" : "4");
4385
Bernard Ogden18b57012013-10-29 09:47:51 +00004386 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004387 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004388
Tim Northover02e38602014-02-03 17:28:04 +00004389 if (Crypto)
4390 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4391
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004392 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004393 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4394 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4395 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4396 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4397 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004398
4399 bool is5EOrAbove = (CPUArchVer >= 6 ||
4400 (CPUArchVer == 5 &&
4401 CPUArch.find('E') != StringRef::npos));
4402 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4403 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4404 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004405 }
Craig Topper3164f332014-03-11 03:39:26 +00004406 void getTargetBuiltins(const Builtin::Info *&Records,
4407 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004408 Records = BuiltinInfo;
4409 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004410 }
Craig Topper3164f332014-03-11 03:39:26 +00004411 bool isCLZForZeroUndef() const override { return false; }
4412 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004413 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004414 }
Craig Topper3164f332014-03-11 03:39:26 +00004415 void getGCCRegNames(const char * const *&Names,
4416 unsigned &NumNames) const override;
4417 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4418 unsigned &NumAliases) const override;
4419 bool validateAsmConstraint(const char *&Name,
4420 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004421 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004422 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004423 case 'l': // r0-r7
4424 case 'h': // r8-r15
4425 case 'w': // VFP Floating point register single precision
4426 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004427 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004428 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004429 case 'I':
4430 case 'J':
4431 case 'K':
4432 case 'L':
4433 case 'M':
4434 // FIXME
4435 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004436 case 'Q': // A memory address that is a single base register.
4437 Info.setAllowsMemory();
4438 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004439 case 'U': // a memory reference...
4440 switch (Name[1]) {
4441 case 'q': // ...ARMV4 ldrsb
4442 case 'v': // ...VFP load/store (reg+constant offset)
4443 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004444 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004445 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004446 case 'n': // valid address for Neon doubleword vector load/store
4447 case 'm': // valid address for Neon element and structure load/store
4448 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004449 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004450 Info.setAllowsMemory();
4451 Name++;
4452 return true;
4453 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004454 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004455 return false;
4456 }
Craig Topper3164f332014-03-11 03:39:26 +00004457 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004458 std::string R;
4459 switch (*Constraint) {
4460 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004461 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004462 Constraint++;
4463 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004464 case 'p': // 'p' should be translated to 'r' by default.
4465 R = std::string("r");
4466 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004467 default:
4468 return std::string(1, *Constraint);
4469 }
4470 return R;
4471 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004472 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004473 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004474 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004475 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004476 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004477
Bill Wendling9d1ee112012-10-25 23:28:48 +00004478 // Strip off constraint modifiers.
4479 while (Constraint[0] == '=' ||
4480 Constraint[0] == '+' ||
4481 Constraint[0] == '&')
4482 Constraint = Constraint.substr(1);
4483
4484 switch (Constraint[0]) {
4485 default: break;
4486 case 'r': {
4487 switch (Modifier) {
4488 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004489 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004490 case 'q':
4491 // A register of size 32 cannot fit a vector type.
4492 return false;
4493 }
4494 }
4495 }
4496
4497 return true;
4498 }
Craig Topper3164f332014-03-11 03:39:26 +00004499 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004500 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004501 return "";
4502 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004503
Craig Topper3164f332014-03-11 03:39:26 +00004504 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004505 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4506 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004507
Craig Topper3164f332014-03-11 03:39:26 +00004508 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004509 if (RegNo == 0) return 0;
4510 if (RegNo == 1) return 1;
4511 return -1;
4512 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004513};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004514
Rafael Espindolaeb265472013-08-21 21:59:03 +00004515bool ARMTargetInfo::setFPMath(StringRef Name) {
4516 if (Name == "neon") {
4517 FPMath = FP_Neon;
4518 return true;
4519 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4520 Name == "vfp4") {
4521 FPMath = FP_VFP;
4522 return true;
4523 }
4524 return false;
4525}
4526
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004527const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004528 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004529 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004530 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4531
4532 // Float registers
4533 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4534 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4535 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004536 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004537
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004538 // Double registers
4539 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4540 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004541 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4542 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004543
4544 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004545 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4546 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004547};
4548
4549void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004550 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004551 Names = GCCRegNames;
4552 NumNames = llvm::array_lengthof(GCCRegNames);
4553}
4554
4555const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004556 { { "a1" }, "r0" },
4557 { { "a2" }, "r1" },
4558 { { "a3" }, "r2" },
4559 { { "a4" }, "r3" },
4560 { { "v1" }, "r4" },
4561 { { "v2" }, "r5" },
4562 { { "v3" }, "r6" },
4563 { { "v4" }, "r7" },
4564 { { "v5" }, "r8" },
4565 { { "v6", "rfp" }, "r9" },
4566 { { "sl" }, "r10" },
4567 { { "fp" }, "r11" },
4568 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004569 { { "r13" }, "sp" },
4570 { { "r14" }, "lr" },
4571 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004572 // The S, D and Q registers overlap, but aren't really aliases; we
4573 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004574};
4575
4576void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4577 unsigned &NumAliases) const {
4578 Aliases = GCCRegAliases;
4579 NumAliases = llvm::array_lengthof(GCCRegAliases);
4580}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004581
4582const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004583#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004584#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004585 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004586#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004587
4588#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004589#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004590#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4591 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004592#include "clang/Basic/BuiltinsARM.def"
4593};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004594
4595class ARMleTargetInfo : public ARMTargetInfo {
4596public:
4597 ARMleTargetInfo(const llvm::Triple &Triple)
4598 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004599 void getTargetDefines(const LangOptions &Opts,
4600 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004601 Builder.defineMacro("__ARMEL__");
4602 ARMTargetInfo::getTargetDefines(Opts, Builder);
4603 }
4604};
4605
4606class ARMbeTargetInfo : public ARMTargetInfo {
4607public:
4608 ARMbeTargetInfo(const llvm::Triple &Triple)
4609 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004610 void getTargetDefines(const LangOptions &Opts,
4611 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004612 Builder.defineMacro("__ARMEB__");
4613 Builder.defineMacro("__ARM_BIG_ENDIAN");
4614 ARMTargetInfo::getTargetDefines(Opts, Builder);
4615 }
4616};
Chris Lattner17df24e2008-04-21 18:56:49 +00004617
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004618class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4619 const llvm::Triple Triple;
4620public:
4621 WindowsARMTargetInfo(const llvm::Triple &Triple)
4622 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4623 TLSSupported = false;
4624 WCharType = UnsignedShort;
4625 SizeType = UnsignedInt;
4626 UserLabelPrefix = "";
4627 }
4628 void getVisualStudioDefines(const LangOptions &Opts,
4629 MacroBuilder &Builder) const {
4630 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4631
4632 // FIXME: this is invalid for WindowsCE
4633 Builder.defineMacro("_M_ARM_NT", "1");
4634 Builder.defineMacro("_M_ARMT", "_M_ARM");
4635 Builder.defineMacro("_M_THUMB", "_M_ARM");
4636
4637 assert((Triple.getArch() == llvm::Triple::arm ||
4638 Triple.getArch() == llvm::Triple::thumb) &&
4639 "invalid architecture for Windows ARM target info");
4640 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4641 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4642
4643 // TODO map the complete set of values
4644 // 31: VFPv3 40: VFPv4
4645 Builder.defineMacro("_M_ARM_FP", "31");
4646 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004647 BuiltinVaListKind getBuiltinVaListKind() const override {
4648 return TargetInfo::CharPtrBuiltinVaList;
4649 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004650};
4651
4652// Windows ARM + Itanium C++ ABI Target
4653class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4654public:
4655 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4656 : WindowsARMTargetInfo(Triple) {
4657 TheCXXABI.set(TargetCXXABI::GenericARM);
4658 }
4659
4660 void getTargetDefines(const LangOptions &Opts,
4661 MacroBuilder &Builder) const override {
4662 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4663
4664 if (Opts.MSVCCompat)
4665 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4666 }
4667};
4668
4669// Windows ARM, MS (C++) ABI
4670class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4671public:
4672 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4673 : WindowsARMTargetInfo(Triple) {
4674 TheCXXABI.set(TargetCXXABI::Microsoft);
4675 }
4676
4677 void getTargetDefines(const LangOptions &Opts,
4678 MacroBuilder &Builder) const override {
4679 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4680 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4681 }
4682};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004683
Mike Stump11289f42009-09-09 15:08:12 +00004684class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004685 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004686protected:
Craig Topper3164f332014-03-11 03:39:26 +00004687 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4688 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004689 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004690 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004691
Torok Edwinb2b37c62009-06-30 17:10:35 +00004692public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004693 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004694 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004695 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004696 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004697 // FIXME: This should be based off of the target features in
4698 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004699 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004700
4701 // Darwin on iOS uses a variant of the ARM C++ ABI.
4702 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004703 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004704};
Eli Friedmanf05b7722008-08-20 07:44:10 +00004705
Tim Northover573cbee2014-05-24 12:52:07 +00004706class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004707 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004708 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4709 static const char *const GCCRegNames[];
4710
James Molloy75f5f9e2014-04-16 15:33:48 +00004711 enum FPUModeEnum {
4712 FPUMode,
4713 NeonMode
4714 };
4715
4716 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004717 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004718 unsigned Crypto;
4719
Tim Northovera2ee4332014-03-29 15:09:45 +00004720 static const Builtin::Info BuiltinInfo[];
4721
4722 std::string ABI;
4723
4724public:
Tim Northover573cbee2014-05-24 12:52:07 +00004725 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004726 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004727
4728 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4729 WCharType = SignedInt;
4730
4731 // NetBSD apparently prefers consistency across ARM targets to consistency
4732 // across 64-bit targets.
4733 Int64Type = SignedLongLong;
4734 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004735 } else {
4736 WCharType = UnsignedInt;
4737 Int64Type = SignedLong;
4738 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004739 }
4740
Tim Northovera2ee4332014-03-29 15:09:45 +00004741 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004742 MaxVectorAlign = 128;
4743 RegParmMax = 8;
4744 MaxAtomicInlineWidth = 128;
4745 MaxAtomicPromoteWidth = 128;
4746
Tim Northovera6a19f12015-02-06 01:25:07 +00004747 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00004748 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4749
Tim Northovera2ee4332014-03-29 15:09:45 +00004750 // {} in inline assembly are neon specifiers, not assembly variant
4751 // specifiers.
4752 NoAsmVariants = true;
4753
Tim Northover7ad87af2015-01-16 18:44:04 +00004754 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4755 // contributes to the alignment of the containing aggregate in the same way
4756 // a plain (non bit-field) member of that type would, without exception for
4757 // zero-sized or anonymous bit-fields."
4758 UseBitFieldTypeAlignment = true;
4759 UseZeroLengthBitfieldAlignment = true;
4760
Tim Northover573cbee2014-05-24 12:52:07 +00004761 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004762 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4763 }
4764
Alp Toker4925ba72014-06-07 23:30:42 +00004765 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004766 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004767 if (Name != "aapcs" && Name != "darwinpcs")
4768 return false;
4769
4770 ABI = Name;
4771 return true;
4772 }
4773
David Blaikie1cbb9712014-11-14 19:09:44 +00004774 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004775 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004776 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004777 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004778 .Case("cyclone", true)
4779 .Default(false);
4780 return CPUKnown;
4781 }
4782
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004783 void getTargetDefines(const LangOptions &Opts,
4784 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004785 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004786 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004787
4788 // Target properties.
4789 Builder.defineMacro("_LP64");
4790 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004791
4792 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4793 Builder.defineMacro("__ARM_ACLE", "200");
4794 Builder.defineMacro("__ARM_ARCH", "8");
4795 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4796
4797 Builder.defineMacro("__ARM_64BIT_STATE");
4798 Builder.defineMacro("__ARM_PCS_AAPCS64");
4799 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4800
4801 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4802 Builder.defineMacro("__ARM_FEATURE_CLZ");
4803 Builder.defineMacro("__ARM_FEATURE_FMA");
4804 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004805 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4806 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4807 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4808 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004809
4810 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4811
4812 // 0xe implies support for half, single and double precision operations.
4813 Builder.defineMacro("__ARM_FP", "0xe");
4814
4815 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4816 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4817 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4818
4819 if (Opts.FastMath || Opts.FiniteMathOnly)
4820 Builder.defineMacro("__ARM_FP_FAST");
4821
Richard Smithab506ad2014-10-20 23:26:58 +00004822 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004823 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4824
4825 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4826
4827 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4828 Opts.ShortEnums ? "1" : "4");
4829
James Molloy75f5f9e2014-04-16 15:33:48 +00004830 if (FPU == NeonMode) {
4831 Builder.defineMacro("__ARM_NEON");
4832 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004833 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004834 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004835
Bradley Smith418c5932014-05-02 15:17:51 +00004836 if (CRC)
4837 Builder.defineMacro("__ARM_FEATURE_CRC32");
4838
James Molloy75f5f9e2014-04-16 15:33:48 +00004839 if (Crypto)
4840 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004841 }
4842
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004843 void getTargetBuiltins(const Builtin::Info *&Records,
4844 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004845 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004846 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004847 }
4848
David Blaikie1cbb9712014-11-14 19:09:44 +00004849 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004850 return Feature == "aarch64" ||
4851 Feature == "arm64" ||
4852 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004853 }
4854
James Molloy5e73df52014-04-16 15:06:20 +00004855 bool handleTargetFeatures(std::vector<std::string> &Features,
4856 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004857 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004858 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004859 Crypto = 0;
4860 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4861 if (Features[i] == "+neon")
4862 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004863 if (Features[i] == "+crc")
4864 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004865 if (Features[i] == "+crypto")
4866 Crypto = 1;
4867 }
4868
James Molloy5e73df52014-04-16 15:06:20 +00004869 setDescriptionString();
4870
4871 return true;
4872 }
4873
David Blaikie1cbb9712014-11-14 19:09:44 +00004874 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004875
David Blaikie1cbb9712014-11-14 19:09:44 +00004876 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004877 return TargetInfo::AArch64ABIBuiltinVaList;
4878 }
4879
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004880 void getGCCRegNames(const char *const *&Names,
4881 unsigned &NumNames) const override;
4882 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4883 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004884
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004885 bool validateAsmConstraint(const char *&Name,
4886 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004887 switch (*Name) {
4888 default:
4889 return false;
4890 case 'w': // Floating point and SIMD registers (V0-V31)
4891 Info.setAllowsRegister();
4892 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004893 case 'I': // Constant that can be used with an ADD instruction
4894 case 'J': // Constant that can be used with a SUB instruction
4895 case 'K': // Constant that can be used with a 32-bit logical instruction
4896 case 'L': // Constant that can be used with a 64-bit logical instruction
4897 case 'M': // Constant that can be used as a 32-bit MOV immediate
4898 case 'N': // Constant that can be used as a 64-bit MOV immediate
4899 case 'Y': // Floating point constant zero
4900 case 'Z': // Integer constant zero
4901 return true;
4902 case 'Q': // A memory reference with base register and no offset
4903 Info.setAllowsMemory();
4904 return true;
4905 case 'S': // A symbolic address
4906 Info.setAllowsRegister();
4907 return true;
4908 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004909 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4910 // Utf: A memory address suitable for ldp/stp in TF mode.
4911 // Usa: An absolute symbolic address.
4912 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4913 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004914 case 'z': // Zero register, wzr or xzr
4915 Info.setAllowsRegister();
4916 return true;
4917 case 'x': // Floating point and SIMD registers (V0-V15)
4918 Info.setAllowsRegister();
4919 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004920 }
4921 return false;
4922 }
4923
Akira Hatanaka987f1862014-08-22 06:05:21 +00004924 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004925 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004926 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004927 // Strip off constraint modifiers.
4928 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4929 Constraint = Constraint.substr(1);
4930
4931 switch (Constraint[0]) {
4932 default:
4933 return true;
4934 case 'z':
4935 case 'r': {
4936 switch (Modifier) {
4937 case 'x':
4938 case 'w':
4939 // For now assume that the person knows what they're
4940 // doing with the modifier.
4941 return true;
4942 default:
4943 // By default an 'r' constraint will be in the 'x'
4944 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004945 if (Size == 64)
4946 return true;
4947
4948 SuggestedModifier = "w";
4949 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004950 }
4951 }
4952 }
4953 }
4954
David Blaikie1cbb9712014-11-14 19:09:44 +00004955 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004956
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004957 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004958 if (RegNo == 0)
4959 return 0;
4960 if (RegNo == 1)
4961 return 1;
4962 return -1;
4963 }
4964};
4965
Tim Northover573cbee2014-05-24 12:52:07 +00004966const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004967 // 32-bit Integer registers
4968 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4969 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4970 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4971
4972 // 64-bit Integer registers
4973 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4974 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4975 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4976
4977 // 32-bit floating point regsisters
4978 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4979 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4980 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4981
4982 // 64-bit floating point regsisters
4983 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4984 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4985 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4986
4987 // Vector registers
4988 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4989 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4990 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4991};
4992
Tim Northover573cbee2014-05-24 12:52:07 +00004993void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004994 unsigned &NumNames) const {
4995 Names = GCCRegNames;
4996 NumNames = llvm::array_lengthof(GCCRegNames);
4997}
4998
Tim Northover573cbee2014-05-24 12:52:07 +00004999const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005000 { { "w31" }, "wsp" },
5001 { { "x29" }, "fp" },
5002 { { "x30" }, "lr" },
5003 { { "x31" }, "sp" },
5004 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5005 // don't want to substitute one of these for a different-sized one.
5006};
5007
Tim Northover573cbee2014-05-24 12:52:07 +00005008void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005009 unsigned &NumAliases) const {
5010 Aliases = GCCRegAliases;
5011 NumAliases = llvm::array_lengthof(GCCRegAliases);
5012}
5013
Tim Northover573cbee2014-05-24 12:52:07 +00005014const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005015#define BUILTIN(ID, TYPE, ATTRS) \
5016 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5017#include "clang/Basic/BuiltinsNEON.def"
5018
5019#define BUILTIN(ID, TYPE, ATTRS) \
5020 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00005021#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005022};
James Molloy5e73df52014-04-16 15:06:20 +00005023
Tim Northover573cbee2014-05-24 12:52:07 +00005024class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005025 void setDescriptionString() override {
5026 if (getTriple().isOSBinFormatMachO())
5027 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
5028 else
5029 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
5030 }
5031
5032public:
Tim Northover573cbee2014-05-24 12:52:07 +00005033 AArch64leTargetInfo(const llvm::Triple &Triple)
5034 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005035 BigEndian = false;
5036 }
5037 void getTargetDefines(const LangOptions &Opts,
5038 MacroBuilder &Builder) const override {
5039 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005040 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005041 }
5042};
5043
Tim Northover573cbee2014-05-24 12:52:07 +00005044class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005045 void setDescriptionString() override {
5046 assert(!getTriple().isOSBinFormatMachO());
5047 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
5048 }
5049
5050public:
Tim Northover573cbee2014-05-24 12:52:07 +00005051 AArch64beTargetInfo(const llvm::Triple &Triple)
5052 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005053 void getTargetDefines(const LangOptions &Opts,
5054 MacroBuilder &Builder) const override {
5055 Builder.defineMacro("__AARCH64EB__");
5056 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5057 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005058 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005059 }
5060};
Tim Northovera2ee4332014-03-29 15:09:45 +00005061
Tim Northover573cbee2014-05-24 12:52:07 +00005062class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005063protected:
5064 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5065 MacroBuilder &Builder) const override {
5066 Builder.defineMacro("__AARCH64_SIMD__");
5067 Builder.defineMacro("__ARM64_ARCH_8__");
5068 Builder.defineMacro("__ARM_NEON__");
5069 Builder.defineMacro("__LITTLE_ENDIAN__");
5070 Builder.defineMacro("__REGISTER_PREFIX__", "");
5071 Builder.defineMacro("__arm64", "1");
5072 Builder.defineMacro("__arm64__", "1");
5073
5074 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5075 }
5076
Tim Northovera2ee4332014-03-29 15:09:45 +00005077public:
Tim Northover573cbee2014-05-24 12:52:07 +00005078 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5079 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005080 Int64Type = SignedLongLong;
5081 WCharType = SignedInt;
5082 UseSignedCharForObjCBool = false;
5083
Tim Northovera6a19f12015-02-06 01:25:07 +00005084 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005085 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5086
5087 TheCXXABI.set(TargetCXXABI::iOS64);
5088 }
5089
David Blaikie1cbb9712014-11-14 19:09:44 +00005090 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005091 return TargetInfo::CharPtrBuiltinVaList;
5092 }
5093};
Tim Northovera2ee4332014-03-29 15:09:45 +00005094
Tony Linthicum76329bf2011-12-12 21:14:55 +00005095// Hexagon abstract base class
5096class HexagonTargetInfo : public TargetInfo {
5097 static const Builtin::Info BuiltinInfo[];
5098 static const char * const GCCRegNames[];
5099 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5100 std::string CPU;
5101public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005102 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005103 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005104 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005105
5106 // {} in inline assembly are packet specifiers, not assembly variant
5107 // specifiers.
5108 NoAsmVariants = true;
5109 }
5110
Craig Topper3164f332014-03-11 03:39:26 +00005111 void getTargetBuiltins(const Builtin::Info *&Records,
5112 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005113 Records = BuiltinInfo;
5114 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5115 }
5116
Craig Topper3164f332014-03-11 03:39:26 +00005117 bool validateAsmConstraint(const char *&Name,
5118 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005119 return true;
5120 }
5121
Craig Topper3164f332014-03-11 03:39:26 +00005122 void getTargetDefines(const LangOptions &Opts,
5123 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005124
Craig Topper3164f332014-03-11 03:39:26 +00005125 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005126 return Feature == "hexagon";
5127 }
Craig Topper3164f332014-03-11 03:39:26 +00005128
5129 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005130 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005131 }
Craig Topper3164f332014-03-11 03:39:26 +00005132 void getGCCRegNames(const char * const *&Names,
5133 unsigned &NumNames) const override;
5134 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5135 unsigned &NumAliases) const override;
5136 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005137 return "";
5138 }
Sebastian Pop86500282012-01-13 20:37:10 +00005139
5140 static const char *getHexagonCPUSuffix(StringRef Name) {
5141 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005142 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005143 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005144 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005145 }
5146
Craig Topper3164f332014-03-11 03:39:26 +00005147 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005148 if (!getHexagonCPUSuffix(Name))
5149 return false;
5150
Tony Linthicum76329bf2011-12-12 21:14:55 +00005151 CPU = Name;
5152 return true;
5153 }
5154};
5155
5156void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5157 MacroBuilder &Builder) const {
5158 Builder.defineMacro("qdsp6");
5159 Builder.defineMacro("__qdsp6", "1");
5160 Builder.defineMacro("__qdsp6__", "1");
5161
5162 Builder.defineMacro("hexagon");
5163 Builder.defineMacro("__hexagon", "1");
5164 Builder.defineMacro("__hexagon__", "1");
5165
5166 if(CPU == "hexagonv1") {
5167 Builder.defineMacro("__HEXAGON_V1__");
5168 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5169 if(Opts.HexagonQdsp6Compat) {
5170 Builder.defineMacro("__QDSP6_V1__");
5171 Builder.defineMacro("__QDSP6_ARCH__", "1");
5172 }
5173 }
5174 else if(CPU == "hexagonv2") {
5175 Builder.defineMacro("__HEXAGON_V2__");
5176 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5177 if(Opts.HexagonQdsp6Compat) {
5178 Builder.defineMacro("__QDSP6_V2__");
5179 Builder.defineMacro("__QDSP6_ARCH__", "2");
5180 }
5181 }
5182 else if(CPU == "hexagonv3") {
5183 Builder.defineMacro("__HEXAGON_V3__");
5184 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5185 if(Opts.HexagonQdsp6Compat) {
5186 Builder.defineMacro("__QDSP6_V3__");
5187 Builder.defineMacro("__QDSP6_ARCH__", "3");
5188 }
5189 }
5190 else if(CPU == "hexagonv4") {
5191 Builder.defineMacro("__HEXAGON_V4__");
5192 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5193 if(Opts.HexagonQdsp6Compat) {
5194 Builder.defineMacro("__QDSP6_V4__");
5195 Builder.defineMacro("__QDSP6_ARCH__", "4");
5196 }
5197 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005198 else if(CPU == "hexagonv5") {
5199 Builder.defineMacro("__HEXAGON_V5__");
5200 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5201 if(Opts.HexagonQdsp6Compat) {
5202 Builder.defineMacro("__QDSP6_V5__");
5203 Builder.defineMacro("__QDSP6_ARCH__", "5");
5204 }
5205 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005206}
5207
5208const char * const HexagonTargetInfo::GCCRegNames[] = {
5209 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5210 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5211 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5212 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5213 "p0", "p1", "p2", "p3",
5214 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5215};
5216
5217void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5218 unsigned &NumNames) const {
5219 Names = GCCRegNames;
5220 NumNames = llvm::array_lengthof(GCCRegNames);
5221}
5222
5223
5224const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5225 { { "sp" }, "r29" },
5226 { { "fp" }, "r30" },
5227 { { "lr" }, "r31" },
5228 };
5229
5230void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5231 unsigned &NumAliases) const {
5232 Aliases = GCCRegAliases;
5233 NumAliases = llvm::array_lengthof(GCCRegAliases);
5234}
5235
5236
5237const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5238#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5239#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5240 ALL_LANGUAGES },
5241#include "clang/Basic/BuiltinsHexagon.def"
5242};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005243
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005244// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5245class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005246 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5247 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005248 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005249public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005250 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005251
Craig Topper3164f332014-03-11 03:39:26 +00005252 bool handleTargetFeatures(std::vector<std::string> &Features,
5253 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005254 SoftFloat = false;
5255 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5256 if (Features[i] == "+soft-float")
5257 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005258 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005259 }
Craig Topper3164f332014-03-11 03:39:26 +00005260 void getTargetDefines(const LangOptions &Opts,
5261 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005262 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005263 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005264
5265 if (SoftFloat)
5266 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005267 }
Craig Topper3164f332014-03-11 03:39:26 +00005268
5269 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005270 return llvm::StringSwitch<bool>(Feature)
5271 .Case("softfloat", SoftFloat)
5272 .Case("sparc", true)
5273 .Default(false);
5274 }
Craig Topper3164f332014-03-11 03:39:26 +00005275
5276 void getTargetBuiltins(const Builtin::Info *&Records,
5277 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005278 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005279 }
Craig Topper3164f332014-03-11 03:39:26 +00005280 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005281 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005282 }
Craig Topper3164f332014-03-11 03:39:26 +00005283 void getGCCRegNames(const char * const *&Names,
5284 unsigned &NumNames) const override;
5285 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5286 unsigned &NumAliases) const override;
5287 bool validateAsmConstraint(const char *&Name,
5288 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005289 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005290 switch (*Name) {
5291 case 'I': // Signed 13-bit constant
5292 case 'J': // Zero
5293 case 'K': // 32-bit constant with the low 12 bits clear
5294 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5295 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5296 case 'N': // Same as 'K' but zext (required for SIMode)
5297 case 'O': // The constant 4096
5298 return true;
5299 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005300 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005301 }
Craig Topper3164f332014-03-11 03:39:26 +00005302 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005303 // FIXME: Implement!
5304 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005305 }
5306};
5307
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005308const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005309 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5310 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5311 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5312 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5313};
5314
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005315void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5316 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005317 Names = GCCRegNames;
5318 NumNames = llvm::array_lengthof(GCCRegNames);
5319}
5320
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005321const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005322 { { "g0" }, "r0" },
5323 { { "g1" }, "r1" },
5324 { { "g2" }, "r2" },
5325 { { "g3" }, "r3" },
5326 { { "g4" }, "r4" },
5327 { { "g5" }, "r5" },
5328 { { "g6" }, "r6" },
5329 { { "g7" }, "r7" },
5330 { { "o0" }, "r8" },
5331 { { "o1" }, "r9" },
5332 { { "o2" }, "r10" },
5333 { { "o3" }, "r11" },
5334 { { "o4" }, "r12" },
5335 { { "o5" }, "r13" },
5336 { { "o6", "sp" }, "r14" },
5337 { { "o7" }, "r15" },
5338 { { "l0" }, "r16" },
5339 { { "l1" }, "r17" },
5340 { { "l2" }, "r18" },
5341 { { "l3" }, "r19" },
5342 { { "l4" }, "r20" },
5343 { { "l5" }, "r21" },
5344 { { "l6" }, "r22" },
5345 { { "l7" }, "r23" },
5346 { { "i0" }, "r24" },
5347 { { "i1" }, "r25" },
5348 { { "i2" }, "r26" },
5349 { { "i3" }, "r27" },
5350 { { "i4" }, "r28" },
5351 { { "i5" }, "r29" },
5352 { { "i6", "fp" }, "r30" },
5353 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005354};
5355
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005356void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5357 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005358 Aliases = GCCRegAliases;
5359 NumAliases = llvm::array_lengthof(GCCRegAliases);
5360}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005361
5362// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5363class SparcV8TargetInfo : public SparcTargetInfo {
5364public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005365 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005366 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005367 }
5368
Craig Topper3164f332014-03-11 03:39:26 +00005369 void getTargetDefines(const LangOptions &Opts,
5370 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005371 SparcTargetInfo::getTargetDefines(Opts, Builder);
5372 Builder.defineMacro("__sparcv8");
5373 }
5374};
5375
5376// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5377class SparcV9TargetInfo : public SparcTargetInfo {
5378public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005379 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005380 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005381 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005382 // This is an LP64 platform.
5383 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005384
5385 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005386 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005387 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005388 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005389 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005390 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005391
5392 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5393 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5394 LongDoubleWidth = 128;
5395 LongDoubleAlign = 128;
5396 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005397 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005398 }
5399
Craig Topper3164f332014-03-11 03:39:26 +00005400 void getTargetDefines(const LangOptions &Opts,
5401 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005402 SparcTargetInfo::getTargetDefines(Opts, Builder);
5403 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005404 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005405 // Solaris doesn't need these variants, but the BSDs do.
5406 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005407 Builder.defineMacro("__sparc64__");
5408 Builder.defineMacro("__sparc_v9__");
5409 Builder.defineMacro("__sparcv9__");
5410 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005411 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005412
Craig Topper3164f332014-03-11 03:39:26 +00005413 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005414 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5415 .Case("v9", true)
5416 .Case("ultrasparc", true)
5417 .Case("ultrasparc3", true)
5418 .Case("niagara", true)
5419 .Case("niagara2", true)
5420 .Case("niagara3", true)
5421 .Case("niagara4", true)
5422 .Default(false);
5423
5424 // No need to store the CPU yet. There aren't any CPU-specific
5425 // macros to define.
5426 return CPUKnown;
5427 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005428};
5429
Torok Edwinb2b37c62009-06-30 17:10:35 +00005430class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005431public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005432 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5433 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005434 SizeType = UnsignedInt;
5435 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005436 }
5437};
Chris Lattner5ba61f02006-10-14 07:39:34 +00005438
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005439class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005440 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005441 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005442 std::string CPU;
5443 bool HasTransactionalExecution;
Ulrich Weigand47445072013-05-06 16:26:41 +00005444
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005445public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005446 SystemZTargetInfo(const llvm::Triple &Triple)
5447 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005448 IntMaxType = SignedLong;
5449 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005450 TLSSupported = true;
5451 IntWidth = IntAlign = 32;
5452 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5453 PointerWidth = PointerAlign = 64;
5454 LongDoubleWidth = 128;
5455 LongDoubleAlign = 64;
5456 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5457 MinGlobalAlign = 16;
5458 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5459 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5460 }
5461 void getTargetDefines(const LangOptions &Opts,
5462 MacroBuilder &Builder) const override {
5463 Builder.defineMacro("__s390__");
5464 Builder.defineMacro("__s390x__");
5465 Builder.defineMacro("__zarch__");
5466 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005467 if (HasTransactionalExecution)
5468 Builder.defineMacro("__HTM__");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005469 }
5470 void getTargetBuiltins(const Builtin::Info *&Records,
5471 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005472 Records = BuiltinInfo;
5473 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005474 }
5475
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005476 void getGCCRegNames(const char *const *&Names,
5477 unsigned &NumNames) const override;
5478 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5479 unsigned &NumAliases) const override {
5480 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005481 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005482 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005483 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005484 bool validateAsmConstraint(const char *&Name,
5485 TargetInfo::ConstraintInfo &info) const override;
5486 const char *getClobbers() const override {
5487 // FIXME: Is this really right?
5488 return "";
5489 }
5490 BuiltinVaListKind getBuiltinVaListKind() const override {
5491 return TargetInfo::SystemZBuiltinVaList;
5492 }
5493 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005494 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005495 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5496 .Case("z10", true)
5497 .Case("z196", true)
5498 .Case("zEC12", true)
5499 .Default(false);
5500
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005501 return CPUKnown;
5502 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005503 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5504 if (CPU == "zEC12")
5505 Features["transactional-execution"] = true;
5506 }
5507
5508 bool handleTargetFeatures(std::vector<std::string> &Features,
5509 DiagnosticsEngine &Diags) override {
5510 HasTransactionalExecution = false;
5511 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5512 if (Features[i] == "+transactional-execution")
5513 HasTransactionalExecution = true;
5514 }
5515 return true;
5516 }
5517
5518 bool hasFeature(StringRef Feature) const override {
5519 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005520 .Case("systemz", true)
5521 .Case("htm", HasTransactionalExecution)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005522 .Default(false);
5523 }
5524};
5525
5526const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5527#define BUILTIN(ID, TYPE, ATTRS) \
5528 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5529#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005530};
5531
5532const char *const SystemZTargetInfo::GCCRegNames[] = {
5533 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5534 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5535 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5536 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5537};
5538
5539void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5540 unsigned &NumNames) const {
5541 Names = GCCRegNames;
5542 NumNames = llvm::array_lengthof(GCCRegNames);
5543}
5544
5545bool SystemZTargetInfo::
5546validateAsmConstraint(const char *&Name,
5547 TargetInfo::ConstraintInfo &Info) const {
5548 switch (*Name) {
5549 default:
5550 return false;
5551
5552 case 'a': // Address register
5553 case 'd': // Data register (equivalent to 'r')
5554 case 'f': // Floating-point register
5555 Info.setAllowsRegister();
5556 return true;
5557
5558 case 'I': // Unsigned 8-bit constant
5559 case 'J': // Unsigned 12-bit constant
5560 case 'K': // Signed 16-bit constant
5561 case 'L': // Signed 20-bit displacement (on all targets we support)
5562 case 'M': // 0x7fffffff
5563 return true;
5564
5565 case 'Q': // Memory with base and unsigned 12-bit displacement
5566 case 'R': // Likewise, plus an index
5567 case 'S': // Memory with base and signed 20-bit displacement
5568 case 'T': // Likewise, plus an index
5569 Info.setAllowsMemory();
5570 return true;
5571 }
5572}
Ulrich Weigand47445072013-05-06 16:26:41 +00005573
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005574 class MSP430TargetInfo : public TargetInfo {
5575 static const char * const GCCRegNames[];
5576 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005577 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005578 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005579 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005580 IntWidth = 16; IntAlign = 16;
5581 LongWidth = 32; LongLongWidth = 64;
5582 LongAlign = LongLongAlign = 16;
5583 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005584 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005585 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005586 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005587 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005588 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005589 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005590 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005591 }
5592 void getTargetDefines(const LangOptions &Opts,
5593 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005594 Builder.defineMacro("MSP430");
5595 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005596 // FIXME: defines for different 'flavours' of MCU
5597 }
Craig Topper3164f332014-03-11 03:39:26 +00005598 void getTargetBuiltins(const Builtin::Info *&Records,
5599 unsigned &NumRecords) const override {
5600 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005601 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005602 NumRecords = 0;
5603 }
Craig Topper3164f332014-03-11 03:39:26 +00005604 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005605 return Feature == "msp430";
5606 }
Craig Topper3164f332014-03-11 03:39:26 +00005607 void getGCCRegNames(const char * const *&Names,
5608 unsigned &NumNames) const override;
5609 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5610 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005611 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005612 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005613 NumAliases = 0;
5614 }
Eric Christopher917e9522014-11-18 22:36:15 +00005615 bool
5616 validateAsmConstraint(const char *&Name,
5617 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005618 // FIXME: implement
5619 switch (*Name) {
5620 case 'K': // the constant 1
5621 case 'L': // constant -1^20 .. 1^19
5622 case 'M': // constant 1-4:
5623 return true;
5624 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005625 // No target constraints for now.
5626 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005627 }
Craig Topper3164f332014-03-11 03:39:26 +00005628 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005629 // FIXME: Is this really right?
5630 return "";
5631 }
Craig Topper3164f332014-03-11 03:39:26 +00005632 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005633 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005634 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005635 }
5636 };
5637
5638 const char * const MSP430TargetInfo::GCCRegNames[] = {
5639 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5640 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5641 };
5642
5643 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5644 unsigned &NumNames) const {
5645 Names = GCCRegNames;
5646 NumNames = llvm::array_lengthof(GCCRegNames);
5647 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00005648
Mike Stump11289f42009-09-09 15:08:12 +00005649 // LLVM and Clang cannot be used directly to output native binaries for
5650 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005651 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005652 //
5653 // TCE uses the llvm bitcode as input and uses it for generating customized
5654 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005655 // publicly available in http://tce.cs.tut.fi
5656
Eli Friedman1f191002011-10-07 19:51:42 +00005657 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5658 3, // opencl_global
5659 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005660 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005661 // FIXME: generic has to be added to the target
5662 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005663 0, // cuda_device
5664 0, // cuda_constant
5665 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005666 };
5667
Eli Friedmana9c3d712009-08-19 20:47:07 +00005668 class TCETargetInfo : public TargetInfo{
5669 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005670 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005671 TLSSupported = false;
5672 IntWidth = 32;
5673 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005674 PointerWidth = 32;
5675 IntAlign = 32;
5676 LongAlign = LongLongAlign = 32;
5677 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005678 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005679 SizeType = UnsignedInt;
5680 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005681 IntPtrType = SignedInt;
5682 PtrDiffType = SignedInt;
5683 FloatWidth = 32;
5684 FloatAlign = 32;
5685 DoubleWidth = 32;
5686 DoubleAlign = 32;
5687 LongDoubleWidth = 32;
5688 LongDoubleAlign = 32;
5689 FloatFormat = &llvm::APFloat::IEEEsingle;
5690 DoubleFormat = &llvm::APFloat::IEEEsingle;
5691 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005692 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5693 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005694 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005695 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005696 }
5697
Craig Topper3164f332014-03-11 03:39:26 +00005698 void getTargetDefines(const LangOptions &Opts,
5699 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005700 DefineStd(Builder, "tce", Opts);
5701 Builder.defineMacro("__TCE__");
5702 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005703 }
Craig Topper3164f332014-03-11 03:39:26 +00005704 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005705 return Feature == "tce";
5706 }
Craig Topper3164f332014-03-11 03:39:26 +00005707
5708 void getTargetBuiltins(const Builtin::Info *&Records,
5709 unsigned &NumRecords) const override {}
5710 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005711 return "";
5712 }
Craig Topper3164f332014-03-11 03:39:26 +00005713 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005714 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005715 }
Craig Topper3164f332014-03-11 03:39:26 +00005716 void getGCCRegNames(const char * const *&Names,
5717 unsigned &NumNames) const override {}
5718 bool validateAsmConstraint(const char *&Name,
5719 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005720 return true;
5721 }
Craig Topper3164f332014-03-11 03:39:26 +00005722 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5723 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005724 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00005725
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005726class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005727 virtual void setDescriptionString() = 0;
5728
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005729 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005730 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005731 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005732 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005733 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005734 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005735 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005736 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005737 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005738 enum DspRevEnum {
5739 NoDSP, DSP1, DSP2
5740 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005741 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005742
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005743protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005744 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005745 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005746
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005747public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005748 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5749 const std::string &CPUStr)
5750 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005751 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00005752 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5753 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5754 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005755
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005756 bool isNaN2008Default() const {
5757 return CPU == "mips32r6" || CPU == "mips64r6";
5758 }
5759
5760 bool isFP64Default() const {
5761 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5762 }
5763
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00005764 bool isNan2008() const override {
5765 return IsNan2008;
5766 }
5767
Alp Toker4925ba72014-06-07 23:30:42 +00005768 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005769 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005770 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5771 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005772 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005773 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005774 .Case("mips1", IsMips32)
5775 .Case("mips2", IsMips32)
5776 .Case("mips3", true)
5777 .Case("mips4", true)
5778 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005779 .Case("mips32", IsMips32)
5780 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005781 .Case("mips32r3", IsMips32)
5782 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005783 .Case("mips32r6", IsMips32)
5784 .Case("mips64", true)
5785 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005786 .Case("mips64r3", true)
5787 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005788 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005789 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005790 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005791 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005792 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005793 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005794 if (CPU == "octeon")
5795 Features["mips64r2"] = Features["cnmips"] = true;
5796 else
5797 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005798 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005799
Craig Topper3164f332014-03-11 03:39:26 +00005800 void getTargetDefines(const LangOptions &Opts,
5801 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005802 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005803 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005804 if (Opts.GNUMode)
5805 Builder.defineMacro("mips");
5806
Simon Atanasyan683535b2012-08-29 19:14:58 +00005807 Builder.defineMacro("__REGISTER_PREFIX__", "");
5808
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005809 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005810 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005811 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005812 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005813 case SoftFloat:
5814 Builder.defineMacro("__mips_soft_float", Twine(1));
5815 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005816 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005817
Simon Atanasyan16071912013-04-14 14:07:30 +00005818 if (IsSingleFloat)
5819 Builder.defineMacro("__mips_single_float", Twine(1));
5820
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005821 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5822 Builder.defineMacro("_MIPS_FPSET",
5823 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5824
Simon Atanasyan72244b62012-07-05 16:06:06 +00005825 if (IsMips16)
5826 Builder.defineMacro("__mips16", Twine(1));
5827
Simon Atanasyan60777612013-04-14 14:07:51 +00005828 if (IsMicromips)
5829 Builder.defineMacro("__mips_micromips", Twine(1));
5830
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005831 if (IsNan2008)
5832 Builder.defineMacro("__mips_nan2008", Twine(1));
5833
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005834 switch (DspRev) {
5835 default:
5836 break;
5837 case DSP1:
5838 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5839 Builder.defineMacro("__mips_dsp", Twine(1));
5840 break;
5841 case DSP2:
5842 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5843 Builder.defineMacro("__mips_dspr2", Twine(1));
5844 Builder.defineMacro("__mips_dsp", Twine(1));
5845 break;
5846 }
5847
Jack Carter44ff1e52013-08-12 17:20:29 +00005848 if (HasMSA)
5849 Builder.defineMacro("__mips_msa", Twine(1));
5850
Simon Atanasyan26f19672012-04-05 19:28:31 +00005851 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5852 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5853 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005854
5855 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5856 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005857 }
5858
Craig Topper3164f332014-03-11 03:39:26 +00005859 void getTargetBuiltins(const Builtin::Info *&Records,
5860 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005861 Records = BuiltinInfo;
5862 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005863 }
Craig Topper3164f332014-03-11 03:39:26 +00005864 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005865 return llvm::StringSwitch<bool>(Feature)
5866 .Case("mips", true)
5867 .Case("fp64", HasFP64)
5868 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005869 }
Craig Topper3164f332014-03-11 03:39:26 +00005870 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005871 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005872 }
Craig Topper3164f332014-03-11 03:39:26 +00005873 void getGCCRegNames(const char * const *&Names,
5874 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005875 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005876 // CPU register names
5877 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005878 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5879 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5880 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005881 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5882 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005883 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5884 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5885 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5886 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005887 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005888 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005889 "$fcc5","$fcc6","$fcc7",
5890 // MSA register names
5891 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5892 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5893 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5894 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5895 // MSA control register names
5896 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5897 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005898 };
5899 Names = GCCRegNames;
5900 NumNames = llvm::array_lengthof(GCCRegNames);
5901 }
Craig Topper3164f332014-03-11 03:39:26 +00005902 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5903 unsigned &NumAliases) const override = 0;
5904 bool validateAsmConstraint(const char *&Name,
5905 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005906 switch (*Name) {
5907 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005908 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005909 case 'r': // CPU registers.
5910 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005911 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005912 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005913 case 'c': // $25 for indirect jumps
5914 case 'l': // lo register
5915 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005916 Info.setAllowsRegister();
5917 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005918 case 'I': // Signed 16-bit constant
5919 case 'J': // Integer 0
5920 case 'K': // Unsigned 16-bit constant
5921 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5922 case 'M': // Constants not loadable via lui, addiu, or ori
5923 case 'N': // Constant -1 to -65535
5924 case 'O': // A signed 15-bit constant
5925 case 'P': // A constant between 1 go 65535
5926 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005927 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005928 Info.setAllowsMemory();
5929 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00005930 case 'Z':
5931 if (Name[1] == 'C') { // An address usable by ll, and sc.
5932 Info.setAllowsMemory();
5933 Name++; // Skip over 'Z'.
5934 return true;
5935 }
5936 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005937 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005938 }
5939
Daniel Sanders48fa39e2015-03-30 13:47:23 +00005940 std::string convertConstraint(const char *&Constraint) const override {
5941 std::string R;
5942 switch (*Constraint) {
5943 case 'Z': // Two-character constraint; add "^" hint for later parsing.
5944 if (Constraint[1] == 'C') {
5945 R = std::string("^") + std::string(Constraint, 2);
5946 Constraint++;
5947 return R;
5948 }
5949 break;
5950 }
5951 return TargetInfo::convertConstraint(Constraint);
5952 }
5953
Craig Topper3164f332014-03-11 03:39:26 +00005954 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00005955 // In GCC, $1 is not widely used in generated code (it's used only in a few
5956 // specific situations), so there is no real need for users to add it to
5957 // the clobbers list if they want to use it in their inline assembly code.
5958 //
5959 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5960 // code generation, so using it in inline assembly without adding it to the
5961 // clobbers list can cause conflicts between the inline assembly code and
5962 // the surrounding generated code.
5963 //
5964 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5965 // operands, which will conflict with the ".set at" assembler option (which
5966 // we use only for inline assembly, in order to maintain compatibility with
5967 // GCC) and will also conflict with the user's usage of $1.
5968 //
5969 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5970 // register for generated code is to automatically clobber $1 for all inline
5971 // assembly code.
5972 //
5973 // FIXME: We should automatically clobber $1 only for inline assembly code
5974 // which actually uses it. This would allow LLVM to use $1 for inline
5975 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00005976 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005977 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005978
Craig Topper3164f332014-03-11 03:39:26 +00005979 bool handleTargetFeatures(std::vector<std::string> &Features,
5980 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005981 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005982 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005983 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005984 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005985 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005986 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005987 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005988
5989 for (std::vector<std::string>::iterator it = Features.begin(),
5990 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005991 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005992 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005993 else if (*it == "+soft-float")
5994 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005995 else if (*it == "+mips16")
5996 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005997 else if (*it == "+micromips")
5998 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005999 else if (*it == "+dsp")
6000 DspRev = std::max(DspRev, DSP1);
6001 else if (*it == "+dspr2")
6002 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00006003 else if (*it == "+msa")
6004 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006005 else if (*it == "+fp64")
6006 HasFP64 = true;
6007 else if (*it == "-fp64")
6008 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006009 else if (*it == "+nan2008")
6010 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006011 else if (*it == "-nan2008")
6012 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006013 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006014
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006015 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006016 std::vector<std::string>::iterator it =
6017 std::find(Features.begin(), Features.end(), "+soft-float");
6018 if (it != Features.end())
6019 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00006020
Akira Hatanaka9064e362013-10-29 18:30:33 +00006021 setDescriptionString();
6022
Rafael Espindolaeb265472013-08-21 21:59:03 +00006023 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006024 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006025
Craig Topper3164f332014-03-11 03:39:26 +00006026 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006027 if (RegNo == 0) return 4;
6028 if (RegNo == 1) return 5;
6029 return -1;
6030 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006031
6032 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006033};
6034
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006035const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
6036#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6037#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6038 ALL_LANGUAGES },
6039#include "clang/Basic/BuiltinsMips.def"
6040};
6041
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006042class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006043public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006044 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006045 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006046 SizeType = UnsignedInt;
6047 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006048 Int64Type = SignedLongLong;
6049 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006050 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006051 }
Craig Topper3164f332014-03-11 03:39:26 +00006052 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006053 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006054 ABI = Name;
6055 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006056 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006057 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006058 }
Craig Topper3164f332014-03-11 03:39:26 +00006059 void getTargetDefines(const LangOptions &Opts,
6060 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006061 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006062
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006063 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006064 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6065
6066 const std::string& CPUStr = getCPU();
6067 if (CPUStr == "mips32")
6068 Builder.defineMacro("__mips_isa_rev", "1");
6069 else if (CPUStr == "mips32r2")
6070 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006071 else if (CPUStr == "mips32r3")
6072 Builder.defineMacro("__mips_isa_rev", "3");
6073 else if (CPUStr == "mips32r5")
6074 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006075 else if (CPUStr == "mips32r6")
6076 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006077
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006078 if (ABI == "o32") {
6079 Builder.defineMacro("__mips_o32");
6080 Builder.defineMacro("_ABIO32", "1");
6081 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6082 }
6083 else if (ABI == "eabi")
6084 Builder.defineMacro("__mips_eabi");
6085 else
David Blaikie83d382b2011-09-23 05:06:16 +00006086 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006087 }
Craig Topper3164f332014-03-11 03:39:26 +00006088 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6089 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006090 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6091 { { "at" }, "$1" },
6092 { { "v0" }, "$2" },
6093 { { "v1" }, "$3" },
6094 { { "a0" }, "$4" },
6095 { { "a1" }, "$5" },
6096 { { "a2" }, "$6" },
6097 { { "a3" }, "$7" },
6098 { { "t0" }, "$8" },
6099 { { "t1" }, "$9" },
6100 { { "t2" }, "$10" },
6101 { { "t3" }, "$11" },
6102 { { "t4" }, "$12" },
6103 { { "t5" }, "$13" },
6104 { { "t6" }, "$14" },
6105 { { "t7" }, "$15" },
6106 { { "s0" }, "$16" },
6107 { { "s1" }, "$17" },
6108 { { "s2" }, "$18" },
6109 { { "s3" }, "$19" },
6110 { { "s4" }, "$20" },
6111 { { "s5" }, "$21" },
6112 { { "s6" }, "$22" },
6113 { { "s7" }, "$23" },
6114 { { "t8" }, "$24" },
6115 { { "t9" }, "$25" },
6116 { { "k0" }, "$26" },
6117 { { "k1" }, "$27" },
6118 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006119 { { "sp","$sp" }, "$29" },
6120 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006121 { { "ra" }, "$31" }
6122 };
6123 Aliases = GCCRegAliases;
6124 NumAliases = llvm::array_lengthof(GCCRegAliases);
6125 }
6126};
6127
6128class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006129 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006130 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006131 }
6132
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006133public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006134 Mips32EBTargetInfo(const llvm::Triple &Triple)
6135 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006136 }
Craig Topper3164f332014-03-11 03:39:26 +00006137 void getTargetDefines(const LangOptions &Opts,
6138 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006139 DefineStd(Builder, "MIPSEB", Opts);
6140 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006141 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006142 }
6143};
6144
6145class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006146 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006147 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006148 }
6149
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006150public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006151 Mips32ELTargetInfo(const llvm::Triple &Triple)
6152 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006153 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006154 }
Craig Topper3164f332014-03-11 03:39:26 +00006155 void getTargetDefines(const LangOptions &Opts,
6156 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006157 DefineStd(Builder, "MIPSEL", Opts);
6158 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006159 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006160 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006161};
Akira Hatanakabef17452011-09-20 19:21:49 +00006162
6163class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006164public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006165 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006166 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006167 LongDoubleWidth = LongDoubleAlign = 128;
6168 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006169 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6170 LongDoubleWidth = LongDoubleAlign = 64;
6171 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6172 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006173 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006174 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006175 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006176 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006177
6178 void setN64ABITypes() {
6179 LongWidth = LongAlign = 64;
6180 PointerWidth = PointerAlign = 64;
6181 SizeType = UnsignedLong;
6182 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006183 Int64Type = SignedLong;
6184 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006185 }
6186
6187 void setN32ABITypes() {
6188 LongWidth = LongAlign = 32;
6189 PointerWidth = PointerAlign = 32;
6190 SizeType = UnsignedInt;
6191 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006192 Int64Type = SignedLongLong;
6193 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006194 }
6195
Craig Topper3164f332014-03-11 03:39:26 +00006196 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006197 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006198 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006199 ABI = Name;
6200 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006201 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006202 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006203 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006204 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006205 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006206 }
6207 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006208 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006209
Craig Topper3164f332014-03-11 03:39:26 +00006210 void getTargetDefines(const LangOptions &Opts,
6211 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006212 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006213
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006214 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006215 Builder.defineMacro("__mips64");
6216 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006217 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6218
6219 const std::string& CPUStr = getCPU();
6220 if (CPUStr == "mips64")
6221 Builder.defineMacro("__mips_isa_rev", "1");
6222 else if (CPUStr == "mips64r2")
6223 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006224 else if (CPUStr == "mips64r3")
6225 Builder.defineMacro("__mips_isa_rev", "3");
6226 else if (CPUStr == "mips64r5")
6227 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006228 else if (CPUStr == "mips64r6")
6229 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006230
Akira Hatanakabef17452011-09-20 19:21:49 +00006231 if (ABI == "n32") {
6232 Builder.defineMacro("__mips_n32");
6233 Builder.defineMacro("_ABIN32", "2");
6234 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6235 }
6236 else if (ABI == "n64") {
6237 Builder.defineMacro("__mips_n64");
6238 Builder.defineMacro("_ABI64", "3");
6239 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6240 }
6241 else
David Blaikie83d382b2011-09-23 05:06:16 +00006242 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006243 }
Craig Topper3164f332014-03-11 03:39:26 +00006244 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6245 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006246 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6247 { { "at" }, "$1" },
6248 { { "v0" }, "$2" },
6249 { { "v1" }, "$3" },
6250 { { "a0" }, "$4" },
6251 { { "a1" }, "$5" },
6252 { { "a2" }, "$6" },
6253 { { "a3" }, "$7" },
6254 { { "a4" }, "$8" },
6255 { { "a5" }, "$9" },
6256 { { "a6" }, "$10" },
6257 { { "a7" }, "$11" },
6258 { { "t0" }, "$12" },
6259 { { "t1" }, "$13" },
6260 { { "t2" }, "$14" },
6261 { { "t3" }, "$15" },
6262 { { "s0" }, "$16" },
6263 { { "s1" }, "$17" },
6264 { { "s2" }, "$18" },
6265 { { "s3" }, "$19" },
6266 { { "s4" }, "$20" },
6267 { { "s5" }, "$21" },
6268 { { "s6" }, "$22" },
6269 { { "s7" }, "$23" },
6270 { { "t8" }, "$24" },
6271 { { "t9" }, "$25" },
6272 { { "k0" }, "$26" },
6273 { { "k1" }, "$27" },
6274 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006275 { { "sp","$sp" }, "$29" },
6276 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006277 { { "ra" }, "$31" }
6278 };
6279 Aliases = GCCRegAliases;
6280 NumAliases = llvm::array_lengthof(GCCRegAliases);
6281 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006282
6283 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006284};
6285
6286class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006287 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006288 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006289 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 +00006290 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006291 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006292
Akira Hatanakabef17452011-09-20 19:21:49 +00006293 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006294
Akira Hatanakabef17452011-09-20 19:21:49 +00006295public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006296 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006297 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006298 void getTargetDefines(const LangOptions &Opts,
6299 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006300 DefineStd(Builder, "MIPSEB", Opts);
6301 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006302 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006303 }
6304};
6305
6306class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006307 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006308 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006309 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 +00006310 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006311 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006312 }
6313public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006314 Mips64ELTargetInfo(const llvm::Triple &Triple)
6315 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006316 // Default ABI is n64.
6317 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006318 }
Craig Topper3164f332014-03-11 03:39:26 +00006319 void getTargetDefines(const LangOptions &Opts,
6320 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006321 DefineStd(Builder, "MIPSEL", Opts);
6322 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006323 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006324 }
6325};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006326
Ivan Krasindd7403e2011-08-24 20:22:22 +00006327class PNaClTargetInfo : public TargetInfo {
6328public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006329 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006330 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006331 this->UserLabelPrefix = "";
6332 this->LongAlign = 32;
6333 this->LongWidth = 32;
6334 this->PointerAlign = 32;
6335 this->PointerWidth = 32;
6336 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006337 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006338 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006339 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006340 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006341 this->SizeType = TargetInfo::UnsignedInt;
6342 this->PtrDiffType = TargetInfo::SignedInt;
6343 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006344 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006345 }
6346
Craig Topper3164f332014-03-11 03:39:26 +00006347 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006348 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006349 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006350 Builder.defineMacro("__le32__");
6351 Builder.defineMacro("__pnacl__");
6352 }
Craig Topper3164f332014-03-11 03:39:26 +00006353 void getTargetDefines(const LangOptions &Opts,
6354 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006355 getArchDefines(Opts, Builder);
6356 }
Craig Topper3164f332014-03-11 03:39:26 +00006357 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006358 return Feature == "pnacl";
6359 }
Craig Topper3164f332014-03-11 03:39:26 +00006360 void getTargetBuiltins(const Builtin::Info *&Records,
6361 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006362 }
Craig Topper3164f332014-03-11 03:39:26 +00006363 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006364 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006365 }
Craig Topper3164f332014-03-11 03:39:26 +00006366 void getGCCRegNames(const char * const *&Names,
6367 unsigned &NumNames) const override;
6368 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6369 unsigned &NumAliases) const override;
6370 bool validateAsmConstraint(const char *&Name,
6371 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006372 return false;
6373 }
6374
Craig Topper3164f332014-03-11 03:39:26 +00006375 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006376 return "";
6377 }
6378};
6379
6380void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6381 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006382 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006383 NumNames = 0;
6384}
6385
6386void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6387 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006388 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006389 NumAliases = 0;
6390}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006391
JF Bastien643817d2014-09-12 17:52:47 +00006392class Le64TargetInfo : public TargetInfo {
6393 static const Builtin::Info BuiltinInfo[];
6394
6395public:
6396 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6397 BigEndian = false;
6398 NoAsmVariants = true;
6399 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6400 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6401 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006402 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006403 }
6404
6405 void getTargetDefines(const LangOptions &Opts,
6406 MacroBuilder &Builder) const override {
6407 DefineStd(Builder, "unix", Opts);
6408 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6409 Builder.defineMacro("__ELF__");
6410 }
6411 void getTargetBuiltins(const Builtin::Info *&Records,
6412 unsigned &NumRecords) const override {
6413 Records = BuiltinInfo;
6414 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6415 }
6416 BuiltinVaListKind getBuiltinVaListKind() const override {
6417 return TargetInfo::PNaClABIBuiltinVaList;
6418 }
6419 const char *getClobbers() const override { return ""; }
6420 void getGCCRegNames(const char *const *&Names,
6421 unsigned &NumNames) const override {
6422 Names = nullptr;
6423 NumNames = 0;
6424 }
6425 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6426 unsigned &NumAliases) const override {
6427 Aliases = nullptr;
6428 NumAliases = 0;
6429 }
6430 bool validateAsmConstraint(const char *&Name,
6431 TargetInfo::ConstraintInfo &Info) const override {
6432 return false;
6433 }
6434
6435 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006436};
6437} // end anonymous namespace.
6438
6439const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6440#define BUILTIN(ID, TYPE, ATTRS) \
6441 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6442#include "clang/Basic/BuiltinsLe64.def"
6443};
6444
6445namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006446 static const unsigned SPIRAddrSpaceMap[] = {
6447 1, // opencl_global
6448 3, // opencl_local
6449 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006450 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006451 0, // cuda_device
6452 0, // cuda_constant
6453 0 // cuda_shared
6454 };
6455 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006456 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006457 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006458 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6459 "SPIR target must use unknown OS");
6460 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6461 "SPIR target must use unknown environment type");
6462 BigEndian = false;
6463 TLSSupported = false;
6464 LongWidth = LongAlign = 64;
6465 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006466 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006467 // Define available target features
6468 // These must be defined in sorted order!
6469 NoAsmVariants = true;
6470 }
Craig Topper3164f332014-03-11 03:39:26 +00006471 void getTargetDefines(const LangOptions &Opts,
6472 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006473 DefineStd(Builder, "SPIR", Opts);
6474 }
Craig Topper3164f332014-03-11 03:39:26 +00006475 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006476 return Feature == "spir";
6477 }
Craig Topper3164f332014-03-11 03:39:26 +00006478
6479 void getTargetBuiltins(const Builtin::Info *&Records,
6480 unsigned &NumRecords) const override {}
6481 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006482 return "";
6483 }
Craig Topper3164f332014-03-11 03:39:26 +00006484 void getGCCRegNames(const char * const *&Names,
6485 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006486 bool
6487 validateAsmConstraint(const char *&Name,
6488 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006489 return true;
6490 }
Craig Topper3164f332014-03-11 03:39:26 +00006491 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6492 unsigned &NumAliases) const override {}
6493 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006494 return TargetInfo::VoidPtrBuiltinVaList;
6495 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006496
6497 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6498 return (CC == CC_SpirFunction ||
6499 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6500 }
6501
6502 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6503 return CC_SpirFunction;
6504 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006505 };
6506
6507
6508 class SPIR32TargetInfo : public SPIRTargetInfo {
6509 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006510 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006511 PointerWidth = PointerAlign = 32;
6512 SizeType = TargetInfo::UnsignedInt;
6513 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6514 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006515 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6516 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006517 }
Craig Topper3164f332014-03-11 03:39:26 +00006518 void getTargetDefines(const LangOptions &Opts,
6519 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006520 DefineStd(Builder, "SPIR32", Opts);
6521 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006522 };
6523
6524 class SPIR64TargetInfo : public SPIRTargetInfo {
6525 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006526 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006527 PointerWidth = PointerAlign = 64;
6528 SizeType = TargetInfo::UnsignedLong;
6529 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006530 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6531 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006532 }
Craig Topper3164f332014-03-11 03:39:26 +00006533 void getTargetDefines(const LangOptions &Opts,
6534 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006535 DefineStd(Builder, "SPIR64", Opts);
6536 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006537 };
Guy Benyeib798fc92012-12-11 21:38:14 +00006538
Robert Lytton0e076492013-08-13 09:43:10 +00006539class XCoreTargetInfo : public TargetInfo {
6540 static const Builtin::Info BuiltinInfo[];
6541public:
6542 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6543 BigEndian = false;
6544 NoAsmVariants = true;
6545 LongLongAlign = 32;
6546 SuitableAlign = 32;
6547 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006548 SizeType = UnsignedInt;
6549 PtrDiffType = SignedInt;
6550 IntPtrType = SignedInt;
6551 WCharType = UnsignedChar;
6552 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006553 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006554 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 +00006555 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006556 }
Craig Topper3164f332014-03-11 03:39:26 +00006557 void getTargetDefines(const LangOptions &Opts,
6558 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006559 Builder.defineMacro("__XS1B__");
6560 }
Craig Topper3164f332014-03-11 03:39:26 +00006561 void getTargetBuiltins(const Builtin::Info *&Records,
6562 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006563 Records = BuiltinInfo;
6564 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6565 }
Craig Topper3164f332014-03-11 03:39:26 +00006566 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006567 return TargetInfo::VoidPtrBuiltinVaList;
6568 }
Craig Topper3164f332014-03-11 03:39:26 +00006569 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006570 return "";
6571 }
Craig Topper3164f332014-03-11 03:39:26 +00006572 void getGCCRegNames(const char * const *&Names,
6573 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006574 static const char * const GCCRegNames[] = {
6575 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6576 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6577 };
6578 Names = GCCRegNames;
6579 NumNames = llvm::array_lengthof(GCCRegNames);
6580 }
Craig Topper3164f332014-03-11 03:39:26 +00006581 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6582 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006583 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006584 NumAliases = 0;
6585 }
Craig Topper3164f332014-03-11 03:39:26 +00006586 bool validateAsmConstraint(const char *&Name,
6587 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006588 return false;
6589 }
Craig Topper3164f332014-03-11 03:39:26 +00006590 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006591 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6592 return (RegNo < 2)? RegNo : -1;
6593 }
Robert Lytton0e076492013-08-13 09:43:10 +00006594};
6595
6596const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6597#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6598#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6599 ALL_LANGUAGES },
6600#include "clang/Basic/BuiltinsXCore.def"
6601};
6602} // end anonymous namespace.
6603
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006604namespace {
6605// x86_32 Android target
6606class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
6607public:
6608 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
6609 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
6610 SuitableAlign = 32;
6611 LongDoubleWidth = 64;
6612 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6613 }
6614};
6615} // end anonymous namespace
6616
6617namespace {
6618// x86_64 Android target
6619class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
6620public:
6621 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
6622 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
6623 LongDoubleFormat = &llvm::APFloat::IEEEquad;
6624 }
6625};
6626} // end anonymous namespace
6627
Ivan Krasindd7403e2011-08-24 20:22:22 +00006628
Chris Lattner5ba61f02006-10-14 07:39:34 +00006629//===----------------------------------------------------------------------===//
6630// Driver code
6631//===----------------------------------------------------------------------===//
6632
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006633static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006634 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006635
Daniel Dunbar52322032009-08-18 05:47:58 +00006636 switch (Triple.getArch()) {
6637 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006638 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006639
Tim Northover2a0783d2014-05-30 14:14:07 +00006640 case llvm::Triple::xcore:
6641 return new XCoreTargetInfo(Triple);
6642
6643 case llvm::Triple::hexagon:
6644 return new HexagonTargetInfo(Triple);
6645
6646 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006647 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006648 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006649
6650 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006651 case llvm::Triple::FreeBSD:
6652 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006653 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006654 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006655 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006656 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006657 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006658 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006659 }
6660
Christian Pirker9b019ae2014-02-25 13:51:00 +00006661 case llvm::Triple::aarch64_be:
6662 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006663 case llvm::Triple::FreeBSD:
6664 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006665 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006666 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006667 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006668 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006669 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006670 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006671 }
6672
Daniel Dunbar52322032009-08-18 05:47:58 +00006673 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006674 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006675 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006676 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006677
Daniel Dunbar52322032009-08-18 05:47:58 +00006678 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006679 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006680 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006681 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006682 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006683 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006684 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006685 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006686 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006687 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006688 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006689 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006690 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006691 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006692 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006693 case llvm::Triple::Win32:
6694 switch (Triple.getEnvironment()) {
6695 default:
6696 return new ARMleTargetInfo(Triple);
6697 case llvm::Triple::Itanium:
6698 return new ItaniumWindowsARMleTargetInfo(Triple);
6699 case llvm::Triple::MSVC:
6700 return new MicrosoftARMleTargetInfo(Triple);
6701 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006702 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006703 return new ARMleTargetInfo(Triple);
6704 }
6705
6706 case llvm::Triple::armeb:
6707 case llvm::Triple::thumbeb:
6708 if (Triple.isOSDarwin())
6709 return new DarwinARMTargetInfo(Triple);
6710
6711 switch (os) {
6712 case llvm::Triple::Linux:
6713 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6714 case llvm::Triple::FreeBSD:
6715 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6716 case llvm::Triple::NetBSD:
6717 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6718 case llvm::Triple::OpenBSD:
6719 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6720 case llvm::Triple::Bitrig:
6721 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6722 case llvm::Triple::RTEMS:
6723 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6724 case llvm::Triple::NaCl:
6725 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6726 default:
6727 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006728 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006729
Daniel Dunbar52322032009-08-18 05:47:58 +00006730 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006731 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006732
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006733 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006734 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006735 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006736 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006737 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006738 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006739 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006740 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006741 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006742 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006743 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006744 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006745 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006746
6747 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006748 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006749 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006750 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006751 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006752 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006753 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006754 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006755 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006756 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006757 case llvm::Triple::NaCl:
6758 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006759 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006760 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006761 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006762
Akira Hatanakabef17452011-09-20 19:21:49 +00006763 case llvm::Triple::mips64:
6764 switch (os) {
6765 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006766 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006767 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006768 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006769 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006770 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006771 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006772 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006773 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006774 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006775 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006776 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006777 }
6778
6779 case llvm::Triple::mips64el:
6780 switch (os) {
6781 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006782 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006783 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006784 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006785 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006786 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006787 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006788 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006789 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006790 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006791 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006792 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006793 }
6794
Ivan Krasindd7403e2011-08-24 20:22:22 +00006795 case llvm::Triple::le32:
6796 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006797 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006798 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006799 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006800 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006801 }
6802
JF Bastien643817d2014-09-12 17:52:47 +00006803 case llvm::Triple::le64:
6804 return new Le64TargetInfo(Triple);
6805
Daniel Dunbar52322032009-08-18 05:47:58 +00006806 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006807 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006808 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006809 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006810 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006811 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006812 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006813 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006814 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006815 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006816 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006817 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006818 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006819 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006820 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006821 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006822 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006823
6824 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006825 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006826 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006827 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006828 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006829 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006830 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006831 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006832 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006833 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006834 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006835 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006836 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006837 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006838 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006839
Bill Schmidt778d3872013-07-26 01:36:11 +00006840 case llvm::Triple::ppc64le:
6841 switch (os) {
6842 case llvm::Triple::Linux:
6843 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00006844 case llvm::Triple::NetBSD:
6845 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00006846 default:
6847 return new PPC64TargetInfo(Triple);
6848 }
6849
Peter Collingbournec947aae2012-05-20 23:28:41 +00006850 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006851 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006852 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006853 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006854
Tom Stellardd8e38a32015-01-06 20:34:47 +00006855 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00006856 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006857 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006858
Daniel Dunbar52322032009-08-18 05:47:58 +00006859 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006860 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006861 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006862 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006863 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006864 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006865 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006866 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006867 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006868 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006869 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006870 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006871 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006872 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006873 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006874
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006875 case llvm::Triple::sparcv9:
6876 switch (os) {
6877 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006878 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006879 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006880 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006881 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006882 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006883 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006884 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006885 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006886 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006887 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006888 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006889 }
6890
Ulrich Weigand47445072013-05-06 16:26:41 +00006891 case llvm::Triple::systemz:
6892 switch (os) {
6893 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006894 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006895 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006896 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006897 }
6898
Eli Friedmana9c3d712009-08-19 20:47:07 +00006899 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006900 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006901
Daniel Dunbar52322032009-08-18 05:47:58 +00006902 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006903 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006904 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006905
Daniel Dunbar52322032009-08-18 05:47:58 +00006906 switch (os) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006907 case llvm::Triple::Linux: {
6908 switch (Triple.getEnvironment()) {
6909 default:
6910 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
6911 case llvm::Triple::Android:
6912 return new AndroidX86_32TargetInfo(Triple);
6913 }
6914 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006915 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006916 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006917 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006918 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006919 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006920 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006921 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006922 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006923 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006924 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006925 case llvm::Triple::KFreeBSD:
6926 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006927 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006928 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006929 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006930 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006931 case llvm::Triple::Win32: {
6932 switch (Triple.getEnvironment()) {
6933 default:
6934 return new X86_32TargetInfo(Triple);
6935 case llvm::Triple::Cygnus:
6936 return new CygwinX86_32TargetInfo(Triple);
6937 case llvm::Triple::GNU:
6938 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006939 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006940 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006941 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006942 }
6943 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006944 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006945 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006946 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006947 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006948 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006949 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006950 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006951 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006952 }
6953
6954 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006955 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006956 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006957
Daniel Dunbar52322032009-08-18 05:47:58 +00006958 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00006959 case llvm::Triple::CloudABI:
6960 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006961 case llvm::Triple::Linux: {
6962 switch (Triple.getEnvironment()) {
6963 default:
6964 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
6965 case llvm::Triple::Android:
6966 return new AndroidX86_64TargetInfo(Triple);
6967 }
6968 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00006969 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006970 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006971 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006972 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006973 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006974 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006975 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006976 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006977 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006978 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006979 case llvm::Triple::KFreeBSD:
6980 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006981 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006982 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006983 case llvm::Triple::Win32: {
6984 switch (Triple.getEnvironment()) {
6985 default:
6986 return new X86_64TargetInfo(Triple);
6987 case llvm::Triple::GNU:
6988 return new MinGWX86_64TargetInfo(Triple);
6989 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006990 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006991 }
6992 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006993 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006994 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00006995 case llvm::Triple::PS4:
6996 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006997 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006998 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006999 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007000
7001 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00007002 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007003 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00007004 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007005 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00007006 }
7007 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00007008 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007009 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00007010 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007011 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00007012 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007013 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007014}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007015
7016/// CreateTargetInfo - Return the target info object for the specified target
7017/// triple.
Alp Toker80758082014-07-06 05:26:44 +00007018TargetInfo *
7019TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7020 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007021 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007022
7023 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007024 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007025 if (!Target) {
7026 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007027 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007028 }
Alp Toker80758082014-07-06 05:26:44 +00007029 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007030
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007031 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007032 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7033 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007034 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007035 }
7036
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007037 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007038 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7039 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007040 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007041 }
7042
Rafael Espindolaeb265472013-08-21 21:59:03 +00007043 // Set the fp math unit.
7044 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7045 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007046 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007047 }
7048
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007049 // Compute the default target features, we need the target to handle this
7050 // because features may have dependencies on one another.
7051 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00007052 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007053
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007054 // Apply the user specified deltas.
7055 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
7056 I < N; ++I) {
7057 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00007058 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007059 bool Enabled = Name[0] == '+';
7060 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007061 }
7062
7063 // Add the features to the compile options.
7064 //
7065 // FIXME: If we are completely confident that we have the right set, we only
7066 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007067 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007068 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
7069 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00007070 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00007071 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007072 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007073
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007074 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007075}