blob: 9cd061aacff7390890f305cb60d7f2953142d606 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000030#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000031#include <memory>
Chris Lattner5ba61f02006-10-14 07:39:34 +000032using namespace clang;
33
Chris Lattner5ba61f02006-10-14 07:39:34 +000034//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000035// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000036//===----------------------------------------------------------------------===//
37
Chris Lattner1e1c0b92009-03-20 16:06:38 +000038/// DefineStd - Define a macro name and standard variants. For example if
39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000041static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000042 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000044
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46 // in the user's namespace.
47 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000048 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055}
56
Benjamin Kramere3b442d2012-01-10 11:50:09 +000057static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58 bool Tuning = true) {
59 Builder.defineMacro("__" + CPUName);
60 Builder.defineMacro("__" + CPUName + "__");
61 if (Tuning)
62 Builder.defineMacro("__tune_" + CPUName + "__");
63}
64
Chris Lattner09d98f52008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000068
Torok Edwinb2b37c62009-06-30 17:10:35 +000069namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000072protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000074 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000075public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000076 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000077 void getTargetDefines(const LangOptions &Opts,
78 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000079 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000081 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000082
83};
Chris Lattner859c37a2009-08-12 06:24:27 +000084} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000085
Chris Lattner30ba6742009-08-10 19:03:04 +000086
Daniel Dunbard86666f2010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000091 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000092 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000094 // AddressSanitizer doesn't play well with source fortification, which is on
95 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +000096 if (Opts.Sanitize.has(SanitizerKind::Address))
97 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000098
John McCall5d36a8c2011-06-16 00:03:19 +000099 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000100 // __weak is always defined, for use in blocks and with objc pointers.
101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000102
John McCall31168b02011-06-15 23:02:42 +0000103 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000104 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
106 else
107 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000108
John McCall31168b02011-06-15 23:02:42 +0000109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
110 // allow this in C, since one might have block pointers in structs that
111 // are used in pure C code and in Objective-C ARC.
112 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000113 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000114
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000115 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000116 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000117 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000119
120 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000121 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000122
Daniel Dunbarecf13562011-04-19 21:40:34 +0000123 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000124 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000125 if (Triple.isMacOSX()) {
126 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000127 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000129 Triple.getOSVersion(Maj, Min, Rev);
130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000131 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000132
Sebastian Pop422377c2012-01-20 22:01:23 +0000133 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000134 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
136 if (PlatformName == "win32") {
137 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138 return;
139 }
140
Evan Cheng31dd9a62014-01-26 23:12:43 +0000141 // Set the appropriate OS version define.
142 if (Triple.isiOS()) {
143 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
144 char Str[6];
145 Str[0] = '0' + Maj;
146 Str[1] = '0' + (Min / 10);
147 Str[2] = '0' + (Min % 10);
148 Str[3] = '0' + (Rev / 10);
149 Str[4] = '0' + (Rev % 10);
150 Str[5] = '\0';
151 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
152 Str);
153 } else if (Triple.isMacOSX()) {
154 // Note that the Driver allows versions which aren't representable in the
155 // define (because we only get a single digit for the minor and micro
156 // revision numbers). So, we limit them to the maximum representable
157 // version.
158 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000159 char Str[7];
160 if (Maj < 10 || (Maj == 10 && Min < 10)) {
161 Str[0] = '0' + (Maj / 10);
162 Str[1] = '0' + (Maj % 10);
163 Str[2] = '0' + std::min(Min, 9U);
164 Str[3] = '0' + std::min(Rev, 9U);
165 Str[4] = '\0';
166 } else {
167 // Handle versions > 10.9.
168 Str[0] = '0' + (Maj / 10);
169 Str[1] = '0' + (Maj % 10);
170 Str[2] = '0' + (Min / 10);
171 Str[3] = '0' + (Min % 10);
172 Str[4] = '0' + (Rev / 10);
173 Str[5] = '0' + (Rev % 10);
174 Str[6] = '\0';
175 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000176 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000177 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000178
Tim Northover157d9112014-01-16 08:48:16 +0000179 // Tell users about the kernel if there is one.
180 if (Triple.isOSDarwin())
181 Builder.defineMacro("__MACH__");
182
Daniel Dunbarecf13562011-04-19 21:40:34 +0000183 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000184}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000185
Benjamin Kramerd5748c72015-03-23 12:31:05 +0000186namespace {
Ed Schoutenf33c6072015-03-11 08:42:46 +0000187// CloudABI Target
188template <typename Target>
189class CloudABITargetInfo : public OSTargetInfo<Target> {
190protected:
191 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
192 MacroBuilder &Builder) const override {
193 Builder.defineMacro("__CloudABI__");
194 Builder.defineMacro("__ELF__");
195
196 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
197 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
198 Builder.defineMacro("__STDC_UTF_16__");
199 Builder.defineMacro("__STDC_UTF_32__");
200 }
201
202public:
203 CloudABITargetInfo(const llvm::Triple &Triple)
204 : OSTargetInfo<Target>(Triple) {
205 this->UserLabelPrefix = "";
206 }
207};
208
Torok Edwinb2b37c62009-06-30 17:10:35 +0000209template<typename Target>
210class DarwinTargetInfo : public OSTargetInfo<Target> {
211protected:
Craig Topper3164f332014-03-11 03:39:26 +0000212 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
213 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000214 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000215 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000216 }
Mike Stump11289f42009-09-09 15:08:12 +0000217
Torok Edwinb2b37c62009-06-30 17:10:35 +0000218public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000219 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
220 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
221 this->MCountName = "\01mcount";
222 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000223
Craig Topper3164f332014-03-11 03:39:26 +0000224 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000225 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000226 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000227 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000228 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000229 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000230 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000231 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000232
Craig Topper3164f332014-03-11 03:39:26 +0000233 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000234 // FIXME: We should return 0 when building kexts.
235 return "__TEXT,__StaticInit,regular,pure_instructions";
236 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000237
John McCalleed64c72012-01-29 01:20:30 +0000238 /// Darwin does not support protected visibility. Darwin's "default"
239 /// is very similar to ELF's "protected"; Darwin requires a "weak"
240 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000241 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000242 return false;
243 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000244};
245
Chris Lattner30ba6742009-08-10 19:03:04 +0000246
Torok Edwinb2b37c62009-06-30 17:10:35 +0000247// DragonFlyBSD Target
248template<typename Target>
249class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
250protected:
Craig Topper3164f332014-03-11 03:39:26 +0000251 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
252 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000254 Builder.defineMacro("__DragonFly__");
255 Builder.defineMacro("__DragonFly_cc_version", "100001");
256 Builder.defineMacro("__ELF__");
257 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
258 Builder.defineMacro("__tune_i386__");
259 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000260 }
261public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000262 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
263 : OSTargetInfo<Target>(Triple) {
264 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000265
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000266 switch (Triple.getArch()) {
267 default:
268 case llvm::Triple::x86:
269 case llvm::Triple::x86_64:
270 this->MCountName = ".mcount";
271 break;
272 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000273 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000274};
275
276// FreeBSD Target
277template<typename Target>
278class FreeBSDTargetInfo : public OSTargetInfo<Target> {
279protected:
Craig Topper3164f332014-03-11 03:39:26 +0000280 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
281 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000282 // FreeBSD defines; list based off of gcc output
283
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000284 unsigned Release = Triple.getOSMajorVersion();
285 if (Release == 0U)
286 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000287
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000288 Builder.defineMacro("__FreeBSD__", Twine(Release));
289 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000290 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
291 DefineStd(Builder, "unix", Opts);
292 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000293
294 // On FreeBSD, wchar_t contains the number of the code point as
295 // used by the character set of the locale. These character sets are
296 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000297 //
298 // FIXME: This is wrong; the macro refers to the numerical values
299 // of wchar_t *literals*, which are not locale-dependent. However,
300 // FreeBSD systems apparently depend on us getting this wrong, and
301 // setting this to 1 is conforming even if all the basic source
302 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000303 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000304 }
305public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000306 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
307 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000308
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000309 switch (Triple.getArch()) {
310 default:
311 case llvm::Triple::x86:
312 case llvm::Triple::x86_64:
313 this->MCountName = ".mcount";
314 break;
315 case llvm::Triple::mips:
316 case llvm::Triple::mipsel:
317 case llvm::Triple::ppc:
318 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000319 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000320 this->MCountName = "_mcount";
321 break;
322 case llvm::Triple::arm:
323 this->MCountName = "__mcount";
324 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000325 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000326 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000327};
328
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000329// GNU/kFreeBSD Target
330template<typename Target>
331class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
332protected:
Craig Topper3164f332014-03-11 03:39:26 +0000333 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
334 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000335 // GNU/kFreeBSD defines; list based off of gcc output
336
337 DefineStd(Builder, "unix", Opts);
338 Builder.defineMacro("__FreeBSD_kernel__");
339 Builder.defineMacro("__GLIBC__");
340 Builder.defineMacro("__ELF__");
341 if (Opts.POSIXThreads)
342 Builder.defineMacro("_REENTRANT");
343 if (Opts.CPlusPlus)
344 Builder.defineMacro("_GNU_SOURCE");
345 }
346public:
Eric Christopher917e9522014-11-18 22:36:15 +0000347 KFreeBSDTargetInfo(const llvm::Triple &Triple)
348 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000349 this->UserLabelPrefix = "";
350 }
351};
352
Chris Lattner3e2ee142010-07-07 16:01:42 +0000353// Minix Target
354template<typename Target>
355class MinixTargetInfo : public OSTargetInfo<Target> {
356protected:
Craig Topper3164f332014-03-11 03:39:26 +0000357 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
358 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000359 // Minix defines
360
361 Builder.defineMacro("__minix", "3");
362 Builder.defineMacro("_EM_WSIZE", "4");
363 Builder.defineMacro("_EM_PSIZE", "4");
364 Builder.defineMacro("_EM_SSIZE", "2");
365 Builder.defineMacro("_EM_LSIZE", "4");
366 Builder.defineMacro("_EM_FSIZE", "4");
367 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000368 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000369 DefineStd(Builder, "unix", Opts);
370 }
371public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000372 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
373 this->UserLabelPrefix = "";
374 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000375};
376
Torok Edwinb2b37c62009-06-30 17:10:35 +0000377// Linux target
378template<typename Target>
379class LinuxTargetInfo : public OSTargetInfo<Target> {
380protected:
Craig Topper3164f332014-03-11 03:39:26 +0000381 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
382 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000383 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000384 DefineStd(Builder, "unix", Opts);
385 DefineStd(Builder, "linux", Opts);
386 Builder.defineMacro("__gnu_linux__");
387 Builder.defineMacro("__ELF__");
Dan Albert84aee012015-03-03 18:28:38 +0000388 if (Triple.getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000389 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000390 unsigned Maj, Min, Rev;
391 Triple.getOSVersion(Maj, Min, Rev);
392 this->PlatformName = "android";
393 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
394 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000395 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000396 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000399 }
400public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000401 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000402 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000403 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000404
405 switch (Triple.getArch()) {
406 default:
407 break;
408 case llvm::Triple::ppc:
409 case llvm::Triple::ppc64:
410 case llvm::Triple::ppc64le:
411 this->MCountName = "_mcount";
412 break;
413 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000414 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000415
Craig Topper3164f332014-03-11 03:39:26 +0000416 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000417 return ".text.startup";
418 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000419};
420
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000421// NetBSD Target
422template<typename Target>
423class NetBSDTargetInfo : public OSTargetInfo<Target> {
424protected:
Craig Topper3164f332014-03-11 03:39:26 +0000425 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
426 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000427 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000428 Builder.defineMacro("__NetBSD__");
429 Builder.defineMacro("__unix__");
430 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000431 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000432 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000433
434 switch (Triple.getArch()) {
435 default:
436 break;
437 case llvm::Triple::arm:
438 case llvm::Triple::armeb:
439 case llvm::Triple::thumb:
440 case llvm::Triple::thumbeb:
441 Builder.defineMacro("__ARM_DWARF_EH__");
442 break;
443 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000444 }
445public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000446 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
447 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000448 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000449 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000450};
451
Torok Edwinb2b37c62009-06-30 17:10:35 +0000452// OpenBSD Target
453template<typename Target>
454class OpenBSDTargetInfo : public OSTargetInfo<Target> {
455protected:
Craig Topper3164f332014-03-11 03:39:26 +0000456 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
457 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000458 // OpenBSD defines; list based off of gcc output
459
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000460 Builder.defineMacro("__OpenBSD__");
461 DefineStd(Builder, "unix", Opts);
462 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000463 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000464 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000465 }
466public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000467 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
468 this->UserLabelPrefix = "";
469 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000470
Eli Friedman3715d1f2011-12-15 02:15:56 +0000471 switch (Triple.getArch()) {
472 default:
473 case llvm::Triple::x86:
474 case llvm::Triple::x86_64:
475 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000476 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000477 this->MCountName = "__mcount";
478 break;
479 case llvm::Triple::mips64:
480 case llvm::Triple::mips64el:
481 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000482 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000483 this->MCountName = "_mcount";
484 break;
485 }
486 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000487};
488
Eli Friedman9fa28852012-08-08 23:57:20 +0000489// Bitrig Target
490template<typename Target>
491class BitrigTargetInfo : public OSTargetInfo<Target> {
492protected:
Craig Topper3164f332014-03-11 03:39:26 +0000493 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
494 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000495 // Bitrig defines; list based off of gcc output
496
497 Builder.defineMacro("__Bitrig__");
498 DefineStd(Builder, "unix", Opts);
499 Builder.defineMacro("__ELF__");
500 if (Opts.POSIXThreads)
501 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000502
503 switch (Triple.getArch()) {
504 default:
505 break;
506 case llvm::Triple::arm:
507 case llvm::Triple::armeb:
508 case llvm::Triple::thumb:
509 case llvm::Triple::thumbeb:
510 Builder.defineMacro("__ARM_DWARF_EH__");
511 break;
512 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000513 }
514public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000515 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
516 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000517 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000518 }
519};
520
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000521// PSP Target
522template<typename Target>
523class PSPTargetInfo : public OSTargetInfo<Target> {
524protected:
Craig Topper3164f332014-03-11 03:39:26 +0000525 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
526 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000527 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000528 Builder.defineMacro("PSP");
529 Builder.defineMacro("_PSP");
530 Builder.defineMacro("__psp__");
531 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000532 }
533public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000534 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000535 this->UserLabelPrefix = "";
536 }
537};
538
John Thompsone467e192009-11-19 17:18:50 +0000539// PS3 PPU Target
540template<typename Target>
541class PS3PPUTargetInfo : public OSTargetInfo<Target> {
542protected:
Craig Topper3164f332014-03-11 03:39:26 +0000543 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
544 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000545 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000546 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000547 Builder.defineMacro("__PPU__");
548 Builder.defineMacro("__CELLOS_LV2__");
549 Builder.defineMacro("__ELF__");
550 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000551 Builder.defineMacro("_ARCH_PPC64");
552 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000553 }
554public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000555 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000556 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000557 this->LongWidth = this->LongAlign = 32;
558 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000559 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000560 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000561 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000562 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000563 }
564};
565
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000566template <typename Target>
567class PS4OSTargetInfo : public OSTargetInfo<Target> {
568protected:
569 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
570 MacroBuilder &Builder) const override {
571 Builder.defineMacro("__FreeBSD__", "9");
572 Builder.defineMacro("__FreeBSD_cc_version", "900001");
573 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
574 DefineStd(Builder, "unix", Opts);
575 Builder.defineMacro("__ELF__");
576 Builder.defineMacro("__PS4__");
577 }
578public:
579 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
580 this->WCharType = this->UnsignedShort;
581
582 this->UserLabelPrefix = "";
583
584 switch (Triple.getArch()) {
585 default:
586 case llvm::Triple::x86_64:
587 this->MCountName = ".mcount";
588 break;
589 }
590 }
591};
592
Torok Edwinb2b37c62009-06-30 17:10:35 +0000593// Solaris target
594template<typename Target>
595class SolarisTargetInfo : public OSTargetInfo<Target> {
596protected:
Craig Topper3164f332014-03-11 03:39:26 +0000597 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
598 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000599 DefineStd(Builder, "sun", Opts);
600 DefineStd(Builder, "unix", Opts);
601 Builder.defineMacro("__ELF__");
602 Builder.defineMacro("__svr4__");
603 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000604 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
605 // newer, but to 500 for everything else. feature_test.h has a check to
606 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000607 // with a new version.
608 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000609 Builder.defineMacro("_XOPEN_SOURCE", "600");
610 else
611 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000612 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000613 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000614 Builder.defineMacro("_LARGEFILE_SOURCE");
615 Builder.defineMacro("_LARGEFILE64_SOURCE");
616 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000617 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000618 }
619public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000620 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000621 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000622 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000623 // FIXME: WIntType should be SignedLong
624 }
625};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000626
627// Windows target
628template<typename Target>
629class WindowsTargetInfo : public OSTargetInfo<Target> {
630protected:
Craig Topper3164f332014-03-11 03:39:26 +0000631 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
632 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000633 Builder.defineMacro("_WIN32");
634 }
635 void getVisualStudioDefines(const LangOptions &Opts,
636 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000637 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000638 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000639 Builder.defineMacro("_CPPRTTI");
640
Reid Kleckner16514352015-01-30 21:42:55 +0000641 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000642 Builder.defineMacro("_CPPUNWIND");
643 }
644
645 if (!Opts.CharIsSigned)
646 Builder.defineMacro("_CHAR_UNSIGNED");
647
648 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
649 // but it works for now.
650 if (Opts.POSIXThreads)
651 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000652
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000653 if (Opts.MSCompatibilityVersion) {
654 Builder.defineMacro("_MSC_VER",
655 Twine(Opts.MSCompatibilityVersion / 100000));
656 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000657 // FIXME We cannot encode the revision information into 32-bits
658 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000659
660 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(19))
661 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000662 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000663
664 if (Opts.MicrosoftExt) {
665 Builder.defineMacro("_MSC_EXTENSIONS");
666
667 if (Opts.CPlusPlus11) {
668 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
669 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
670 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
671 }
672 }
673
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000674 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000675 }
676
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000677public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000678 WindowsTargetInfo(const llvm::Triple &Triple)
679 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000680};
681
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000682template <typename Target>
683class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000684protected:
Craig Topper3164f332014-03-11 03:39:26 +0000685 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
686 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000687 if (Opts.POSIXThreads)
688 Builder.defineMacro("_REENTRANT");
689 if (Opts.CPlusPlus)
690 Builder.defineMacro("_GNU_SOURCE");
691
692 DefineStd(Builder, "unix", Opts);
693 Builder.defineMacro("__ELF__");
694 Builder.defineMacro("__native_client__");
695 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000696
697public:
698 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000699 this->UserLabelPrefix = "";
700 this->LongAlign = 32;
701 this->LongWidth = 32;
702 this->PointerAlign = 32;
703 this->PointerWidth = 32;
704 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000705 this->Int64Type = TargetInfo::SignedLongLong;
706 this->DoubleAlign = 64;
707 this->LongDoubleWidth = 64;
708 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000709 this->LongLongWidth = 64;
710 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000711 this->SizeType = TargetInfo::UnsignedInt;
712 this->PtrDiffType = TargetInfo::SignedInt;
713 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000714 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000715 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000716 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000717 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000718 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000719 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000720 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000721 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000722 } else if (Triple.getArch() == llvm::Triple::mipsel) {
723 // Handled on mips' setDescriptionString.
724 } else {
725 assert(Triple.getArch() == llvm::Triple::le32);
726 this->DescriptionString = "e-p:32:32-i64:64";
727 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000728 }
729};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000730
Chris Lattner09d98f52008-10-05 21:50:58 +0000731//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000732// Specific target implementations.
733//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000734
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000735// PPC abstract base class
736class PPCTargetInfo : public TargetInfo {
737 static const Builtin::Info BuiltinInfo[];
738 static const char * const GCCRegNames[];
739 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000740 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000741
742 // Target cpu features.
743 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000744 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000745 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000746 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000747 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000748 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000749 bool HasBPERMD;
750 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000751
Ulrich Weigand8afad612014-07-28 13:17:52 +0000752protected:
753 std::string ABI;
754
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000755public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000756 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000757 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000758 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000759 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000760 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000761 LongDoubleWidth = LongDoubleAlign = 128;
762 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
763 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000764
Hal Finkel6b984f02012-07-03 16:51:04 +0000765 /// \brief Flags for architecture specific defines.
766 typedef enum {
767 ArchDefineNone = 0,
768 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
769 ArchDefinePpcgr = 1 << 1,
770 ArchDefinePpcsq = 1 << 2,
771 ArchDefine440 = 1 << 3,
772 ArchDefine603 = 1 << 4,
773 ArchDefine604 = 1 << 5,
774 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000775 ArchDefinePwr5 = 1 << 7,
776 ArchDefinePwr5x = 1 << 8,
777 ArchDefinePwr6 = 1 << 9,
778 ArchDefinePwr6x = 1 << 10,
779 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000780 ArchDefinePwr8 = 1 << 12,
781 ArchDefineA2 = 1 << 13,
782 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000783 } ArchDefineTypes;
784
Bill Schmidt38378a02013-02-01 20:23:10 +0000785 // Note: GCC recognizes the following additional cpus:
786 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
787 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
788 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000789 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000790 bool CPUKnown = llvm::StringSwitch<bool>(Name)
791 .Case("generic", true)
792 .Case("440", true)
793 .Case("450", true)
794 .Case("601", true)
795 .Case("602", true)
796 .Case("603", true)
797 .Case("603e", true)
798 .Case("603ev", true)
799 .Case("604", true)
800 .Case("604e", true)
801 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000802 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000803 .Case("g3", true)
804 .Case("7400", true)
805 .Case("g4", true)
806 .Case("7450", true)
807 .Case("g4+", true)
808 .Case("750", true)
809 .Case("970", true)
810 .Case("g5", true)
811 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000812 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000813 .Case("e500mc", true)
814 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000815 .Case("power3", true)
816 .Case("pwr3", true)
817 .Case("power4", true)
818 .Case("pwr4", true)
819 .Case("power5", true)
820 .Case("pwr5", true)
821 .Case("power5x", true)
822 .Case("pwr5x", true)
823 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000824 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000825 .Case("power6x", true)
826 .Case("pwr6x", true)
827 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000828 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000829 .Case("power8", true)
830 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000831 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000832 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000833 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000834 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000835 .Case("powerpc64le", true)
836 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000837 .Default(false);
838
839 if (CPUKnown)
840 CPU = Name;
841
842 return CPUKnown;
843 }
844
Ulrich Weigand8afad612014-07-28 13:17:52 +0000845
846 StringRef getABI() const override { return ABI; }
847
Craig Topper3164f332014-03-11 03:39:26 +0000848 void getTargetBuiltins(const Builtin::Info *&Records,
849 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000850 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000851 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000852 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000853
Craig Topper3164f332014-03-11 03:39:26 +0000854 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000855
Craig Topper3164f332014-03-11 03:39:26 +0000856 void getTargetDefines(const LangOptions &Opts,
857 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000858
Craig Topper3164f332014-03-11 03:39:26 +0000859 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000860
Craig Topper3164f332014-03-11 03:39:26 +0000861 bool handleTargetFeatures(std::vector<std::string> &Features,
862 DiagnosticsEngine &Diags) override;
863 bool hasFeature(StringRef Feature) const override;
864
865 void getGCCRegNames(const char * const *&Names,
866 unsigned &NumNames) const override;
867 void getGCCRegAliases(const GCCRegAlias *&Aliases,
868 unsigned &NumAliases) const override;
869 bool validateAsmConstraint(const char *&Name,
870 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000871 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000872 default: return false;
873 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000874 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000875 case 'b': // Base register
876 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000877 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000878 break;
879 // FIXME: The following are added to allow parsing.
880 // I just took a guess at what the actions should be.
881 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000882 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000883 case 'v': // Altivec vector register
884 Info.setAllowsRegister();
885 break;
886 case 'w':
887 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000888 case 'd':// VSX vector register to hold vector double data
889 case 'f':// VSX vector register to hold vector float data
890 case 's':// VSX vector register to hold scalar float data
891 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000892 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000893 break;
894 default:
895 return false;
896 }
897 Info.setAllowsRegister();
898 Name++; // Skip over 'w'.
899 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000900 case 'h': // `MQ', `CTR', or `LINK' register
901 case 'q': // `MQ' register
902 case 'c': // `CTR' register
903 case 'l': // `LINK' register
904 case 'x': // `CR' register (condition register) number 0
905 case 'y': // `CR' register (condition register)
906 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000907 Info.setAllowsRegister();
908 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000909 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000910 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000911 // (use `L' instead for SImode constants)
912 case 'K': // Unsigned 16-bit constant
913 case 'L': // Signed 16-bit constant shifted left 16 bits
914 case 'M': // Constant larger than 31
915 case 'N': // Exact power of 2
916 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000917 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000918 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000919 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000920 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000921 break;
922 case 'm': // Memory operand. Note that on PowerPC targets, m can
923 // include addresses that update the base register. It
924 // is therefore only safe to use `m' in an asm statement
925 // if that asm statement accesses the operand exactly once.
926 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000927 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000928 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000929 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000930 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000931 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
932 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000933 // register to be updated.
934 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000935 if (Name[1] != 's')
936 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000937 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000938 // include any automodification of the base register. Unlike
939 // `m', this constraint can be used in asm statements that
940 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000941 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000942 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000943 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000944 break;
945 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000946 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000947 case 'Z': // Memory operand that is an indexed or indirect from a
948 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000949 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000950 Info.setAllowsMemory();
951 Info.setAllowsRegister();
952 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000953 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000954 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000955 // register (`p' is preferable for asm statements)
956 case 'S': // Constant suitable as a 64-bit mask operand
957 case 'T': // Constant suitable as a 32-bit mask operand
958 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000959 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000960 // instructions
961 case 'W': // Vector constant that does not require memory
962 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000963 break;
964 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000965 }
John Thompson07a61a42010-06-24 22:44:13 +0000966 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000967 }
Craig Topper3164f332014-03-11 03:39:26 +0000968 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000969 std::string R;
970 switch (*Constraint) {
971 case 'e':
972 case 'w':
973 // Two-character constraint; add "^" hint for later parsing.
974 R = std::string("^") + std::string(Constraint, 2);
975 Constraint++;
976 break;
977 default:
978 return TargetInfo::convertConstraint(Constraint);
979 }
980 return R;
981 }
Craig Topper3164f332014-03-11 03:39:26 +0000982 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000983 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000984 }
Craig Topper3164f332014-03-11 03:39:26 +0000985 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000986 if (RegNo == 0) return 3;
987 if (RegNo == 1) return 4;
988 return -1;
989 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +0000990
991 bool hasSjLjLowering() const override {
992 return true;
993 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000994};
Anders Carlssonf511f642007-11-27 04:11:28 +0000995
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000996const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000997#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000998#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000999 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001000#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001001};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001002
Eric Christopher917e9522014-11-18 22:36:15 +00001003/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001004/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001005bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001006 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001007 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1008 // Ignore disabled features.
1009 if (Features[i][0] == '-')
1010 continue;
1011
1012 StringRef Feature = StringRef(Features[i]).substr(1);
1013
1014 if (Feature == "vsx") {
1015 HasVSX = true;
1016 continue;
1017 }
1018
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001019 if (Feature == "bpermd") {
1020 HasBPERMD = true;
1021 continue;
1022 }
1023
1024 if (Feature == "extdiv") {
1025 HasExtDiv = true;
1026 continue;
1027 }
1028
Bill Schmidt59eb7672014-10-10 15:09:43 +00001029 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001030 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +00001031 continue;
1032 }
1033
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001034 if (Feature == "crypto") {
1035 HasP8Crypto = true;
1036 continue;
1037 }
1038
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001039 if (Feature == "direct-move") {
1040 HasDirectMove = true;
1041 continue;
1042 }
1043
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001044 if (Feature == "qpx") {
1045 HasQPX = true;
1046 continue;
1047 }
1048
Kit Barton8246f282015-03-25 19:41:41 +00001049 if (Feature == "htm") {
1050 HasHTM = true;
1051 continue;
1052 }
1053
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001054 // TODO: Finish this list and add an assert that we've handled them
1055 // all.
1056 }
1057
1058 return true;
1059}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001060
Chris Lattnerecd49032009-03-02 22:27:17 +00001061/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1062/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001063void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001064 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001065 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001066 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001067 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001068 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001069 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001070 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001071 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001072 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001073 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001074 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001075 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001076 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001077
Chris Lattnerecd49032009-03-02 22:27:17 +00001078 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001079 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1080 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001081 } else {
1082 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1083 getTriple().getOS() != llvm::Triple::OpenBSD)
1084 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001085 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001086
Ulrich Weigand8afad612014-07-28 13:17:52 +00001087 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001088 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001089 Builder.defineMacro("_CALL_ELF", "1");
1090 if (ABI == "elfv2")
1091 Builder.defineMacro("_CALL_ELF", "2");
1092
Chris Lattnerecd49032009-03-02 22:27:17 +00001093 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001094 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1095 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001096
Chris Lattnerecd49032009-03-02 22:27:17 +00001097 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001098 if (LongDoubleWidth == 128)
1099 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001100
John Thompsone467e192009-11-19 17:18:50 +00001101 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001102 Builder.defineMacro("__VEC__", "10206");
1103 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001104 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001105
1106 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001107 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1108 .Case("440", ArchDefineName)
1109 .Case("450", ArchDefineName | ArchDefine440)
1110 .Case("601", ArchDefineName)
1111 .Case("602", ArchDefineName | ArchDefinePpcgr)
1112 .Case("603", ArchDefineName | ArchDefinePpcgr)
1113 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1114 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1115 .Case("604", ArchDefineName | ArchDefinePpcgr)
1116 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1117 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001118 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001119 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1120 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1121 .Case("750", ArchDefineName | ArchDefinePpcgr)
1122 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1123 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001124 .Case("a2", ArchDefineA2)
1125 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001126 .Case("pwr3", ArchDefinePpcgr)
1127 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1128 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1129 | ArchDefinePpcsq)
1130 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1131 | ArchDefinePpcgr | ArchDefinePpcsq)
1132 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1133 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1134 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1135 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1136 | ArchDefinePpcsq)
1137 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1138 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001139 | ArchDefinePpcgr | ArchDefinePpcsq)
1140 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1141 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1142 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001143 .Case("power3", ArchDefinePpcgr)
1144 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1145 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1146 | ArchDefinePpcsq)
1147 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1148 | ArchDefinePpcgr | ArchDefinePpcsq)
1149 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1150 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1151 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1152 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1153 | ArchDefinePpcsq)
1154 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1155 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001156 | ArchDefinePpcgr | ArchDefinePpcsq)
1157 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1158 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1159 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001160 .Default(ArchDefineNone);
1161
1162 if (defs & ArchDefineName)
1163 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1164 if (defs & ArchDefinePpcgr)
1165 Builder.defineMacro("_ARCH_PPCGR");
1166 if (defs & ArchDefinePpcsq)
1167 Builder.defineMacro("_ARCH_PPCSQ");
1168 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001169 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001170 if (defs & ArchDefine603)
1171 Builder.defineMacro("_ARCH_603");
1172 if (defs & ArchDefine604)
1173 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001174 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001175 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001176 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001177 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001178 if (defs & ArchDefinePwr5x)
1179 Builder.defineMacro("_ARCH_PWR5X");
1180 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001181 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001182 if (defs & ArchDefinePwr6x)
1183 Builder.defineMacro("_ARCH_PWR6X");
1184 if (defs & ArchDefinePwr7)
1185 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001186 if (defs & ArchDefinePwr8)
1187 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001188 if (defs & ArchDefineA2)
1189 Builder.defineMacro("_ARCH_A2");
1190 if (defs & ArchDefineA2q) {
1191 Builder.defineMacro("_ARCH_A2Q");
1192 Builder.defineMacro("_ARCH_QP");
1193 }
1194
1195 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1196 Builder.defineMacro("__bg__");
1197 Builder.defineMacro("__THW_BLUEGENE__");
1198 Builder.defineMacro("__bgq__");
1199 Builder.defineMacro("__TOS_BGQ__");
1200 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001201
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001202 if (HasVSX)
1203 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001204 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001205 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001206 if (HasP8Crypto)
1207 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001208 if (HasHTM)
1209 Builder.defineMacro("__HTM__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001210
Bill Schmidt38378a02013-02-01 20:23:10 +00001211 // FIXME: The following are not yet generated here by Clang, but are
1212 // generated by GCC:
1213 //
1214 // _SOFT_FLOAT_
1215 // __RECIP_PRECISION__
1216 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001217 // __RECIP__
1218 // __RECIPF__
1219 // __RSQRTE__
1220 // __RSQRTEF__
1221 // _SOFT_DOUBLE_
1222 // __NO_LWSYNC__
1223 // __HAVE_BSWAP__
1224 // __LONGDOUBLE128
1225 // __CMODEL_MEDIUM__
1226 // __CMODEL_LARGE__
1227 // _CALL_SYSV
1228 // _CALL_DARWIN
1229 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001230}
1231
1232void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1233 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1234 .Case("7400", true)
1235 .Case("g4", true)
1236 .Case("7450", true)
1237 .Case("g4+", true)
1238 .Case("970", true)
1239 .Case("g5", true)
1240 .Case("pwr6", true)
1241 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001242 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001243 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001244 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001245 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001246
1247 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001248 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1249 .Case("ppc64le", true)
1250 .Case("pwr8", true)
1251 .Default(false);
1252 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1253 .Case("ppc64le", true)
1254 .Case("pwr8", true)
1255 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001256 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1257 .Case("ppc64le", true)
1258 .Case("pwr8", true)
1259 .Case("pwr7", true)
1260 .Default(false);
1261 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1262 .Case("ppc64le", true)
1263 .Case("pwr8", true)
1264 .Case("pwr7", true)
1265 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001266 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1267 .Case("ppc64le", true)
1268 .Case("pwr8", true)
1269 .Default(false);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001270}
1271
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001272bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001273 return llvm::StringSwitch<bool>(Feature)
1274 .Case("powerpc", true)
1275 .Case("vsx", HasVSX)
1276 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001277 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001278 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001279 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001280 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001281 .Case("bpermd", HasBPERMD)
1282 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001283 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001284}
Chris Lattner17df24e2008-04-21 18:56:49 +00001285
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001286const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001287 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1288 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1289 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1290 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1291 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1292 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1293 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1294 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001295 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001296 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001297 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001298 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1299 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1300 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1301 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001302 "vrsave", "vscr",
1303 "spe_acc", "spefscr",
1304 "sfp"
1305};
Chris Lattner10a5b382007-01-29 05:24:35 +00001306
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001307void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001308 unsigned &NumNames) const {
1309 Names = GCCRegNames;
1310 NumNames = llvm::array_lengthof(GCCRegNames);
1311}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001312
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001313const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1314 // While some of these aliases do map to different registers
1315 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001316 { { "0" }, "r0" },
1317 { { "1"}, "r1" },
1318 { { "2" }, "r2" },
1319 { { "3" }, "r3" },
1320 { { "4" }, "r4" },
1321 { { "5" }, "r5" },
1322 { { "6" }, "r6" },
1323 { { "7" }, "r7" },
1324 { { "8" }, "r8" },
1325 { { "9" }, "r9" },
1326 { { "10" }, "r10" },
1327 { { "11" }, "r11" },
1328 { { "12" }, "r12" },
1329 { { "13" }, "r13" },
1330 { { "14" }, "r14" },
1331 { { "15" }, "r15" },
1332 { { "16" }, "r16" },
1333 { { "17" }, "r17" },
1334 { { "18" }, "r18" },
1335 { { "19" }, "r19" },
1336 { { "20" }, "r20" },
1337 { { "21" }, "r21" },
1338 { { "22" }, "r22" },
1339 { { "23" }, "r23" },
1340 { { "24" }, "r24" },
1341 { { "25" }, "r25" },
1342 { { "26" }, "r26" },
1343 { { "27" }, "r27" },
1344 { { "28" }, "r28" },
1345 { { "29" }, "r29" },
1346 { { "30" }, "r30" },
1347 { { "31" }, "r31" },
1348 { { "fr0" }, "f0" },
1349 { { "fr1" }, "f1" },
1350 { { "fr2" }, "f2" },
1351 { { "fr3" }, "f3" },
1352 { { "fr4" }, "f4" },
1353 { { "fr5" }, "f5" },
1354 { { "fr6" }, "f6" },
1355 { { "fr7" }, "f7" },
1356 { { "fr8" }, "f8" },
1357 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001358 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001359 { { "fr11" }, "f11" },
1360 { { "fr12" }, "f12" },
1361 { { "fr13" }, "f13" },
1362 { { "fr14" }, "f14" },
1363 { { "fr15" }, "f15" },
1364 { { "fr16" }, "f16" },
1365 { { "fr17" }, "f17" },
1366 { { "fr18" }, "f18" },
1367 { { "fr19" }, "f19" },
1368 { { "fr20" }, "f20" },
1369 { { "fr21" }, "f21" },
1370 { { "fr22" }, "f22" },
1371 { { "fr23" }, "f23" },
1372 { { "fr24" }, "f24" },
1373 { { "fr25" }, "f25" },
1374 { { "fr26" }, "f26" },
1375 { { "fr27" }, "f27" },
1376 { { "fr28" }, "f28" },
1377 { { "fr29" }, "f29" },
1378 { { "fr30" }, "f30" },
1379 { { "fr31" }, "f31" },
1380 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001381};
1382
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001383void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001384 unsigned &NumAliases) const {
1385 Aliases = GCCRegAliases;
1386 NumAliases = llvm::array_lengthof(GCCRegAliases);
1387}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001388
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001389class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001390public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001391 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001392 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001393
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001394 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001395 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001396 case llvm::Triple::FreeBSD:
1397 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001398 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001399 PtrDiffType = SignedInt;
1400 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001401 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001402 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001403 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001404 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001405
Roman Divacky3ffe7462012-03-13 19:20:17 +00001406 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1407 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001408 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001409 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001410
1411 // PPC32 supports atomics up to 4 bytes.
1412 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001413 }
1414
Craig Topper3164f332014-03-11 03:39:26 +00001415 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001416 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001417 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001418 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001419};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001420
Bill Schmidt778d3872013-07-26 01:36:11 +00001421// Note: ABI differences may eventually require us to have a separate
1422// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001423class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001424public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001425 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001426 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001427 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001428 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001429
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001430 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1431 DescriptionString = "e-m:e-i64:64-n32:64";
1432 ABI = "elfv2";
1433 } else {
1434 DescriptionString = "E-m:e-i64:64-n32:64";
1435 ABI = "elfv1";
1436 }
1437
1438 switch (getTriple().getOS()) {
1439 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001440 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001441 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001442 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001443 case llvm::Triple::NetBSD:
1444 IntMaxType = SignedLongLong;
1445 Int64Type = SignedLongLong;
1446 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001447 default:
1448 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001449 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001450
1451 // PPC64 supports atomics up to 8 bytes.
1452 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001453 }
Craig Topper3164f332014-03-11 03:39:26 +00001454 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001455 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001456 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001457 // PPC64 Linux-specifc ABI options.
1458 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001459 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001460 ABI = Name;
1461 return true;
1462 }
1463 return false;
1464 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001465};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001466
Roman Divacky965b0b72011-01-06 08:27:10 +00001467class DarwinPPC32TargetInfo :
1468 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001469public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001470 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1471 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001472 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001473 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001474 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001475 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001476 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001477 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001478 }
Craig Topper3164f332014-03-11 03:39:26 +00001479 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001480 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001481 }
1482};
1483
1484class DarwinPPC64TargetInfo :
1485 public DarwinTargetInfo<PPC64TargetInfo> {
1486public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001487 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1488 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001489 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001490 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001491 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001492 }
1493};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001494
Peter Collingbournec947aae2012-05-20 23:28:41 +00001495 static const unsigned NVPTXAddrSpaceMap[] = {
1496 1, // opencl_global
1497 3, // opencl_local
1498 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001499 // FIXME: generic has to be added to the target
1500 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001501 1, // cuda_device
1502 4, // cuda_constant
1503 3, // cuda_shared
1504 };
1505 class NVPTXTargetInfo : public TargetInfo {
1506 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001507 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001508
1509 // The GPU profiles supported by the NVPTX backend
1510 enum GPUKind {
1511 GK_NONE,
1512 GK_SM20,
1513 GK_SM21,
1514 GK_SM30,
1515 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001516 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001517 } GPU;
1518
Peter Collingbournec947aae2012-05-20 23:28:41 +00001519 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001520 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001521 BigEndian = false;
1522 TLSSupported = false;
1523 LongWidth = LongAlign = 64;
1524 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001525 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001526 // Define available target features
1527 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001528 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001529 // Set the default GPU to sm20
1530 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001531 }
Craig Topper3164f332014-03-11 03:39:26 +00001532 void getTargetDefines(const LangOptions &Opts,
1533 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001534 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001535 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001536 if (Opts.CUDAIsDevice) {
1537 // Set __CUDA_ARCH__ for the GPU specified.
1538 std::string CUDAArchCode;
1539 switch (GPU) {
1540 case GK_SM20:
1541 CUDAArchCode = "200";
1542 break;
1543 case GK_SM21:
1544 CUDAArchCode = "210";
1545 break;
1546 case GK_SM30:
1547 CUDAArchCode = "300";
1548 break;
1549 case GK_SM35:
1550 CUDAArchCode = "350";
1551 break;
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001552 case GK_SM37:
1553 CUDAArchCode = "370";
1554 break;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001555 default:
1556 llvm_unreachable("Unhandled target CPU");
1557 }
1558 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1559 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001560 }
Craig Topper3164f332014-03-11 03:39:26 +00001561 void getTargetBuiltins(const Builtin::Info *&Records,
1562 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001563 Records = BuiltinInfo;
1564 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001565 }
Craig Topper3164f332014-03-11 03:39:26 +00001566 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001567 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001568 }
Craig Topper3164f332014-03-11 03:39:26 +00001569
1570 void getGCCRegNames(const char * const *&Names,
1571 unsigned &NumNames) const override;
1572 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1573 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001574 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001575 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001576 NumAliases = 0;
1577 }
Eric Christopher917e9522014-11-18 22:36:15 +00001578 bool
1579 validateAsmConstraint(const char *&Name,
1580 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001581 switch (*Name) {
1582 default: return false;
1583 case 'c':
1584 case 'h':
1585 case 'r':
1586 case 'l':
1587 case 'f':
1588 case 'd':
1589 Info.setAllowsRegister();
1590 return true;
1591 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001592 }
Craig Topper3164f332014-03-11 03:39:26 +00001593 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001594 // FIXME: Is this really right?
1595 return "";
1596 }
Craig Topper3164f332014-03-11 03:39:26 +00001597 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001598 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001599 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001600 }
Craig Topper3164f332014-03-11 03:39:26 +00001601 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001602 GPU = llvm::StringSwitch<GPUKind>(Name)
1603 .Case("sm_20", GK_SM20)
1604 .Case("sm_21", GK_SM21)
1605 .Case("sm_30", GK_SM30)
1606 .Case("sm_35", GK_SM35)
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001607 .Case("sm_37", GK_SM37)
Reid Klecknerbbc01782014-12-03 21:53:36 +00001608 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001609
Reid Klecknerbbc01782014-12-03 21:53:36 +00001610 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001611 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001612 };
1613
1614 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1615#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1616#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1617 ALL_LANGUAGES },
1618#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001619 };
1620
1621 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1622 "r0"
1623 };
1624
1625 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1626 unsigned &NumNames) const {
1627 Names = GCCRegNames;
1628 NumNames = llvm::array_lengthof(GCCRegNames);
1629 }
1630
1631 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1632 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001633 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001634 PointerWidth = PointerAlign = 32;
Eli Bendersky13467172015-04-01 20:29:18 +00001635 SizeType = TargetInfo::UnsignedInt;
1636 PtrDiffType = TargetInfo::SignedInt;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001637 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001638 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001639 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001640 };
1641
1642 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1643 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001644 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001645 PointerWidth = PointerAlign = 64;
Eli Bendersky13467172015-04-01 20:29:18 +00001646 SizeType = TargetInfo::UnsignedLong;
1647 PtrDiffType = TargetInfo::SignedLong;
Eli Bendersky15f63422015-04-01 18:29:27 +00001648 IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001649 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001650 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001651 };
Eli Friedmand13b41e2012-10-12 23:32:00 +00001652
1653static const unsigned R600AddrSpaceMap[] = {
1654 1, // opencl_global
1655 3, // opencl_local
1656 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001657 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001658 1, // cuda_device
1659 2, // cuda_constant
1660 3 // cuda_shared
1661};
1662
Tom Stellarda96344b2014-08-21 13:58:40 +00001663// If you edit the description strings, make sure you update
1664// getPointerWidthV().
1665
Tom Stellardc74b1e02013-03-04 17:40:53 +00001666static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001667 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1668 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001669
1670static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001671 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1672 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001673
1674static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001675 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001676 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1677 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001678
Eli Friedmand13b41e2012-10-12 23:32:00 +00001679class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001680 static const Builtin::Info BuiltinInfo[];
1681
Tom Stellardc74b1e02013-03-04 17:40:53 +00001682 /// \brief The GPU profiles supported by the R600 target.
1683 enum GPUKind {
1684 GK_NONE,
1685 GK_R600,
1686 GK_R600_DOUBLE_OPS,
1687 GK_R700,
1688 GK_R700_DOUBLE_OPS,
1689 GK_EVERGREEN,
1690 GK_EVERGREEN_DOUBLE_OPS,
1691 GK_NORTHERN_ISLANDS,
1692 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001693 GK_SOUTHERN_ISLANDS,
1694 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001695 } GPU;
1696
Eli Friedmand13b41e2012-10-12 23:32:00 +00001697public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001698 R600TargetInfo(const llvm::Triple &Triple)
Tom Stellardd99fb952015-01-28 15:38:44 +00001699 : TargetInfo(Triple) {
1700
1701 if (Triple.getArch() == llvm::Triple::amdgcn) {
1702 DescriptionString = DescriptionStringSI;
1703 GPU = GK_SOUTHERN_ISLANDS;
1704 } else {
1705 DescriptionString = DescriptionStringR600;
1706 GPU = GK_R600;
1707 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001708 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001709 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001710 }
1711
Tom Stellarda96344b2014-08-21 13:58:40 +00001712 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1713 if (GPU <= GK_CAYMAN)
1714 return 32;
1715
1716 switch(AddrSpace) {
1717 default:
1718 return 64;
1719 case 0:
1720 case 3:
1721 case 5:
1722 return 32;
1723 }
1724 }
1725
Craig Topper3164f332014-03-11 03:39:26 +00001726 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001727 return "";
1728 }
1729
Craig Topper3164f332014-03-11 03:39:26 +00001730 void getGCCRegNames(const char * const *&Names,
1731 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001732 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001733 numNames = 0;
1734 }
1735
Craig Topper3164f332014-03-11 03:39:26 +00001736 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1737 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001738 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001739 NumAliases = 0;
1740 }
1741
Craig Topper3164f332014-03-11 03:39:26 +00001742 bool validateAsmConstraint(const char *&Name,
1743 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001744 return true;
1745 }
1746
Craig Topper3164f332014-03-11 03:39:26 +00001747 void getTargetBuiltins(const Builtin::Info *&Records,
1748 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001749 Records = BuiltinInfo;
1750 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001751 }
1752
Craig Topper3164f332014-03-11 03:39:26 +00001753 void getTargetDefines(const LangOptions &Opts,
1754 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001755 Builder.defineMacro("__R600__");
Tom Stellardfded50f2015-02-27 15:10:19 +00001756 if (GPU >= GK_SOUTHERN_ISLANDS && Opts.OpenCL)
1757 Builder.defineMacro("cl_khr_fp64");
Eli Friedmand13b41e2012-10-12 23:32:00 +00001758 }
1759
Craig Topper3164f332014-03-11 03:39:26 +00001760 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001761 return TargetInfo::CharPtrBuiltinVaList;
1762 }
1763
Craig Topper3164f332014-03-11 03:39:26 +00001764 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001765 GPU = llvm::StringSwitch<GPUKind>(Name)
1766 .Case("r600" , GK_R600)
1767 .Case("rv610", GK_R600)
1768 .Case("rv620", GK_R600)
1769 .Case("rv630", GK_R600)
1770 .Case("rv635", GK_R600)
1771 .Case("rs780", GK_R600)
1772 .Case("rs880", GK_R600)
1773 .Case("rv670", GK_R600_DOUBLE_OPS)
1774 .Case("rv710", GK_R700)
1775 .Case("rv730", GK_R700)
1776 .Case("rv740", GK_R700_DOUBLE_OPS)
1777 .Case("rv770", GK_R700_DOUBLE_OPS)
1778 .Case("palm", GK_EVERGREEN)
1779 .Case("cedar", GK_EVERGREEN)
1780 .Case("sumo", GK_EVERGREEN)
1781 .Case("sumo2", GK_EVERGREEN)
1782 .Case("redwood", GK_EVERGREEN)
1783 .Case("juniper", GK_EVERGREEN)
1784 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1785 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1786 .Case("barts", GK_NORTHERN_ISLANDS)
1787 .Case("turks", GK_NORTHERN_ISLANDS)
1788 .Case("caicos", GK_NORTHERN_ISLANDS)
1789 .Case("cayman", GK_CAYMAN)
1790 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001791 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001792 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1793 .Case("verde", GK_SOUTHERN_ISLANDS)
1794 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001795 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001796 .Case("bonaire", GK_SEA_ISLANDS)
1797 .Case("kabini", GK_SEA_ISLANDS)
1798 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001799 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001800 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001801 .Default(GK_NONE);
1802
1803 if (GPU == GK_NONE) {
1804 return false;
1805 }
1806
1807 // Set the correct data layout
1808 switch (GPU) {
1809 case GK_NONE:
1810 case GK_R600:
1811 case GK_R700:
1812 case GK_EVERGREEN:
1813 case GK_NORTHERN_ISLANDS:
1814 DescriptionString = DescriptionStringR600;
1815 break;
1816 case GK_R600_DOUBLE_OPS:
1817 case GK_R700_DOUBLE_OPS:
1818 case GK_EVERGREEN_DOUBLE_OPS:
1819 case GK_CAYMAN:
1820 DescriptionString = DescriptionStringR600DoubleOps;
1821 break;
1822 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001823 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001824 DescriptionString = DescriptionStringSI;
1825 break;
1826 }
1827
1828 return true;
1829 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001830};
1831
Matt Arsenault56f008d2014-06-24 20:45:01 +00001832const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1833#define BUILTIN(ID, TYPE, ATTRS) \
1834 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1835#include "clang/Basic/BuiltinsR600.def"
1836};
1837
Eli Friedman3fd920a2008-08-20 02:34:37 +00001838// Namespace for x86 abstract base class
1839const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001840#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001841#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001842 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001843#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001844};
Eli Friedmanb5366062008-05-20 14:21:01 +00001845
Nuno Lopescfca1f02009-12-23 17:49:57 +00001846static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001847 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1848 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001849 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001850 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1851 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1852 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001853 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001854 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1855 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001856};
1857
Eric Christophercdd36352011-06-21 00:05:20 +00001858const TargetInfo::AddlRegName AddlRegNames[] = {
1859 { { "al", "ah", "eax", "rax" }, 0 },
1860 { { "bl", "bh", "ebx", "rbx" }, 3 },
1861 { { "cl", "ch", "ecx", "rcx" }, 2 },
1862 { { "dl", "dh", "edx", "rdx" }, 1 },
1863 { { "esi", "rsi" }, 4 },
1864 { { "edi", "rdi" }, 5 },
1865 { { "esp", "rsp" }, 7 },
1866 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001867};
1868
1869// X86 target abstract base class; x86-32 and x86-64 are very close, so
1870// most of the implementation can be shared.
1871class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001872 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001873 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001874 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001875 enum MMX3DNowEnum {
1876 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1877 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001878 enum XOPEnum {
1879 NoXOP,
1880 SSE4A,
1881 FMA4,
1882 XOP
1883 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001884
Eric Christophere1ddaf92010-04-02 23:50:19 +00001885 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001886 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001887 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001888 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001889 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001890 bool HasBMI;
1891 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001892 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001893 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001894 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001895 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001896 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001897 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001898 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001899 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001900 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1901 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001902 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001903 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001904
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001905 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1906 ///
1907 /// Each enumeration represents a particular CPU supported by Clang. These
1908 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1909 enum CPUKind {
1910 CK_Generic,
1911
1912 /// \name i386
1913 /// i386-generation processors.
1914 //@{
1915 CK_i386,
1916 //@}
1917
1918 /// \name i486
1919 /// i486-generation processors.
1920 //@{
1921 CK_i486,
1922 CK_WinChipC6,
1923 CK_WinChip2,
1924 CK_C3,
1925 //@}
1926
1927 /// \name i586
1928 /// i586-generation processors, P5 microarchitecture based.
1929 //@{
1930 CK_i586,
1931 CK_Pentium,
1932 CK_PentiumMMX,
1933 //@}
1934
1935 /// \name i686
1936 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1937 //@{
1938 CK_i686,
1939 CK_PentiumPro,
1940 CK_Pentium2,
1941 CK_Pentium3,
1942 CK_Pentium3M,
1943 CK_PentiumM,
1944 CK_C3_2,
1945
1946 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1947 /// Clang however has some logic to suport this.
1948 // FIXME: Warn, deprecate, and potentially remove this.
1949 CK_Yonah,
1950 //@}
1951
1952 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001953 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001954 //@{
1955 CK_Pentium4,
1956 CK_Pentium4M,
1957 CK_Prescott,
1958 CK_Nocona,
1959 //@}
1960
1961 /// \name Core
1962 /// Core microarchitecture based processors.
1963 //@{
1964 CK_Core2,
1965
1966 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1967 /// codename which GCC no longer accepts as an option to -march, but Clang
1968 /// has some logic for recognizing it.
1969 // FIXME: Warn, deprecate, and potentially remove this.
1970 CK_Penryn,
1971 //@}
1972
1973 /// \name Atom
1974 /// Atom processors
1975 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001976 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00001977 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001978 //@}
1979
1980 /// \name Nehalem
1981 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00001982 CK_Nehalem,
1983
1984 /// \name Westmere
1985 /// Westmere microarchitecture based processors.
1986 CK_Westmere,
1987
1988 /// \name Sandy Bridge
1989 /// Sandy Bridge microarchitecture based processors.
1990 CK_SandyBridge,
1991
1992 /// \name Ivy Bridge
1993 /// Ivy Bridge microarchitecture based processors.
1994 CK_IvyBridge,
1995
1996 /// \name Haswell
1997 /// Haswell microarchitecture based processors.
1998 CK_Haswell,
1999
2000 /// \name Broadwell
2001 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002002 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002003
2004 /// \name Skylake
2005 /// Skylake microarchitecture based processors.
2006 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002007
Craig Topper449314e2013-08-20 07:09:39 +00002008 /// \name Knights Landing
2009 /// Knights Landing processor.
2010 CK_KNL,
2011
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002012 /// \name K6
2013 /// K6 architecture processors.
2014 //@{
2015 CK_K6,
2016 CK_K6_2,
2017 CK_K6_3,
2018 //@}
2019
2020 /// \name K7
2021 /// K7 architecture processors.
2022 //@{
2023 CK_Athlon,
2024 CK_AthlonThunderbird,
2025 CK_Athlon4,
2026 CK_AthlonXP,
2027 CK_AthlonMP,
2028 //@}
2029
2030 /// \name K8
2031 /// K8 architecture processors.
2032 //@{
2033 CK_Athlon64,
2034 CK_Athlon64SSE3,
2035 CK_AthlonFX,
2036 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002037 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002038 CK_Opteron,
2039 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002040 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002041 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002042
Benjamin Kramer569f2152012-01-10 11:50:18 +00002043 /// \name Bobcat
2044 /// Bobcat architecture processors.
2045 //@{
2046 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002047 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002048 //@}
2049
2050 /// \name Bulldozer
2051 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002052 //@{
2053 CK_BDVER1,
2054 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002055 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002056 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002057 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002058
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002059 /// This specification is deprecated and will be removed in the future.
2060 /// Users should prefer \see CK_K8.
2061 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002062 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002063 CK_x86_64,
2064 //@}
2065
2066 /// \name Geode
2067 /// Geode processors.
2068 //@{
2069 CK_Geode
2070 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002071 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002072
Rafael Espindolaeb265472013-08-21 21:59:03 +00002073 enum FPMathKind {
2074 FP_Default,
2075 FP_SSE,
2076 FP_387
2077 } FPMath;
2078
Eli Friedman3fd920a2008-08-20 02:34:37 +00002079public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002080 X86TargetInfo(const llvm::Triple &Triple)
2081 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002082 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002083 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2084 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2085 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2086 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2087 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2088 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002089 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002090 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002091 }
Craig Topper3164f332014-03-11 03:39:26 +00002092 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002093 // X87 evaluates with 80 bits "long double" precision.
2094 return SSELevel == NoSSE ? 2 : 0;
2095 }
Craig Topper3164f332014-03-11 03:39:26 +00002096 void getTargetBuiltins(const Builtin::Info *&Records,
2097 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002098 Records = BuiltinInfo;
2099 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002100 }
Craig Topper3164f332014-03-11 03:39:26 +00002101 void getGCCRegNames(const char * const *&Names,
2102 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002103 Names = GCCRegNames;
2104 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002105 }
Craig Topper3164f332014-03-11 03:39:26 +00002106 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2107 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002108 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002109 NumAliases = 0;
2110 }
Craig Topper3164f332014-03-11 03:39:26 +00002111 void getGCCAddlRegNames(const AddlRegName *&Names,
2112 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002113 Names = AddlRegNames;
2114 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002115 }
Craig Topper3164f332014-03-11 03:39:26 +00002116 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002117 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002118
Akira Hatanaka974131e2014-09-18 18:17:18 +00002119 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2120
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002121 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2122
Akira Hatanaka974131e2014-09-18 18:17:18 +00002123 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2124
Craig Topper3164f332014-03-11 03:39:26 +00002125 std::string convertConstraint(const char *&Constraint) const override;
2126 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002127 return "~{dirflag},~{fpsr},~{flags}";
2128 }
Craig Topper3164f332014-03-11 03:39:26 +00002129 void getTargetDefines(const LangOptions &Opts,
2130 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002131 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2132 bool Enabled);
2133 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2134 bool Enabled);
2135 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2136 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002137 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2138 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002139 setFeatureEnabledImpl(Features, Name, Enabled);
2140 }
2141 // This exists purely to cut down on the number of virtual calls in
2142 // getDefaultFeatures which calls this repeatedly.
2143 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2144 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002145 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2146 bool hasFeature(StringRef Feature) const override;
2147 bool handleTargetFeatures(std::vector<std::string> &Features,
2148 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002149 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002150 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002151 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002152 else if (getTriple().getArch() == llvm::Triple::x86 &&
2153 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002154 return "no-mmx";
2155 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002156 }
Craig Topper3164f332014-03-11 03:39:26 +00002157 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002158 CPU = llvm::StringSwitch<CPUKind>(Name)
2159 .Case("i386", CK_i386)
2160 .Case("i486", CK_i486)
2161 .Case("winchip-c6", CK_WinChipC6)
2162 .Case("winchip2", CK_WinChip2)
2163 .Case("c3", CK_C3)
2164 .Case("i586", CK_i586)
2165 .Case("pentium", CK_Pentium)
2166 .Case("pentium-mmx", CK_PentiumMMX)
2167 .Case("i686", CK_i686)
2168 .Case("pentiumpro", CK_PentiumPro)
2169 .Case("pentium2", CK_Pentium2)
2170 .Case("pentium3", CK_Pentium3)
2171 .Case("pentium3m", CK_Pentium3M)
2172 .Case("pentium-m", CK_PentiumM)
2173 .Case("c3-2", CK_C3_2)
2174 .Case("yonah", CK_Yonah)
2175 .Case("pentium4", CK_Pentium4)
2176 .Case("pentium4m", CK_Pentium4M)
2177 .Case("prescott", CK_Prescott)
2178 .Case("nocona", CK_Nocona)
2179 .Case("core2", CK_Core2)
2180 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002181 .Case("bonnell", CK_Bonnell)
2182 .Case("atom", CK_Bonnell) // Legacy name.
2183 .Case("silvermont", CK_Silvermont)
2184 .Case("slm", CK_Silvermont) // Legacy name.
2185 .Case("nehalem", CK_Nehalem)
2186 .Case("corei7", CK_Nehalem) // Legacy name.
2187 .Case("westmere", CK_Westmere)
2188 .Case("sandybridge", CK_SandyBridge)
2189 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2190 .Case("ivybridge", CK_IvyBridge)
2191 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2192 .Case("haswell", CK_Haswell)
2193 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002194 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002195 .Case("skylake", CK_Skylake)
2196 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002197 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002198 .Case("k6", CK_K6)
2199 .Case("k6-2", CK_K6_2)
2200 .Case("k6-3", CK_K6_3)
2201 .Case("athlon", CK_Athlon)
2202 .Case("athlon-tbird", CK_AthlonThunderbird)
2203 .Case("athlon-4", CK_Athlon4)
2204 .Case("athlon-xp", CK_AthlonXP)
2205 .Case("athlon-mp", CK_AthlonMP)
2206 .Case("athlon64", CK_Athlon64)
2207 .Case("athlon64-sse3", CK_Athlon64SSE3)
2208 .Case("athlon-fx", CK_AthlonFX)
2209 .Case("k8", CK_K8)
2210 .Case("k8-sse3", CK_K8SSE3)
2211 .Case("opteron", CK_Opteron)
2212 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002213 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002214 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002215 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002216 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002217 .Case("bdver1", CK_BDVER1)
2218 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002219 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002220 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002221 .Case("x86-64", CK_x86_64)
2222 .Case("geode", CK_Geode)
2223 .Default(CK_Generic);
2224
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002225 // Perform any per-CPU checks necessary to determine if this CPU is
2226 // acceptable.
2227 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2228 // invalid without explaining *why*.
2229 switch (CPU) {
2230 case CK_Generic:
2231 // No processor selected!
2232 return false;
2233
2234 case CK_i386:
2235 case CK_i486:
2236 case CK_WinChipC6:
2237 case CK_WinChip2:
2238 case CK_C3:
2239 case CK_i586:
2240 case CK_Pentium:
2241 case CK_PentiumMMX:
2242 case CK_i686:
2243 case CK_PentiumPro:
2244 case CK_Pentium2:
2245 case CK_Pentium3:
2246 case CK_Pentium3M:
2247 case CK_PentiumM:
2248 case CK_Yonah:
2249 case CK_C3_2:
2250 case CK_Pentium4:
2251 case CK_Pentium4M:
2252 case CK_Prescott:
2253 case CK_K6:
2254 case CK_K6_2:
2255 case CK_K6_3:
2256 case CK_Athlon:
2257 case CK_AthlonThunderbird:
2258 case CK_Athlon4:
2259 case CK_AthlonXP:
2260 case CK_AthlonMP:
2261 case CK_Geode:
2262 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002263 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002264 return false;
2265
2266 // Fallthrough
2267 case CK_Nocona:
2268 case CK_Core2:
2269 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002270 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002271 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002272 case CK_Nehalem:
2273 case CK_Westmere:
2274 case CK_SandyBridge:
2275 case CK_IvyBridge:
2276 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002277 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002278 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002279 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002280 case CK_Athlon64:
2281 case CK_Athlon64SSE3:
2282 case CK_AthlonFX:
2283 case CK_K8:
2284 case CK_K8SSE3:
2285 case CK_Opteron:
2286 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002287 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002288 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002289 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002290 case CK_BDVER1:
2291 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002292 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002293 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002294 case CK_x86_64:
2295 return true;
2296 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002297 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002298 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002299
Craig Topper3164f332014-03-11 03:39:26 +00002300 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002301
Craig Topper3164f332014-03-11 03:39:26 +00002302 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002303 // We accept all non-ARM calling conventions
2304 return (CC == CC_X86ThisCall ||
2305 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002306 CC == CC_X86StdCall ||
2307 CC == CC_X86VectorCall ||
2308 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002309 CC == CC_X86Pascal ||
2310 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002311 }
2312
Craig Topper3164f332014-03-11 03:39:26 +00002313 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002314 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002315 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002316
2317 bool hasSjLjLowering() const override {
2318 return true;
2319 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002320};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002321
Rafael Espindolaeb265472013-08-21 21:59:03 +00002322bool X86TargetInfo::setFPMath(StringRef Name) {
2323 if (Name == "387") {
2324 FPMath = FP_387;
2325 return true;
2326 }
2327 if (Name == "sse") {
2328 FPMath = FP_SSE;
2329 return true;
2330 }
2331 return false;
2332}
2333
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002334void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002335 // FIXME: This *really* should not be here.
2336
2337 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002338 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002339 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002340
Chandler Carruth212334f2011-09-28 08:55:37 +00002341 switch (CPU) {
2342 case CK_Generic:
2343 case CK_i386:
2344 case CK_i486:
2345 case CK_i586:
2346 case CK_Pentium:
2347 case CK_i686:
2348 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002349 break;
2350 case CK_PentiumMMX:
2351 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002352 case CK_K6:
2353 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002354 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002355 break;
2356 case CK_Pentium3:
2357 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002358 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002359 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002360 break;
2361 case CK_PentiumM:
2362 case CK_Pentium4:
2363 case CK_Pentium4M:
2364 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002365 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002366 break;
2367 case CK_Yonah:
2368 case CK_Prescott:
2369 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002370 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002371 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002372 break;
2373 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002374 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002375 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002376 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002377 break;
2378 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002379 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002380 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002381 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002382 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002383 setFeatureEnabledImpl(Features, "avx512f", true);
2384 setFeatureEnabledImpl(Features, "avx512cd", true);
2385 setFeatureEnabledImpl(Features, "avx512dq", true);
2386 setFeatureEnabledImpl(Features, "avx512bw", true);
2387 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002388 // FALLTHROUGH
2389 case CK_Broadwell:
2390 setFeatureEnabledImpl(Features, "rdseed", true);
2391 setFeatureEnabledImpl(Features, "adx", true);
2392 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002393 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002394 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002395 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002396 setFeatureEnabledImpl(Features, "bmi", true);
2397 setFeatureEnabledImpl(Features, "bmi2", true);
2398 setFeatureEnabledImpl(Features, "rtm", true);
2399 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002400 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002401 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002402 setFeatureEnabledImpl(Features, "rdrnd", true);
2403 setFeatureEnabledImpl(Features, "f16c", true);
2404 setFeatureEnabledImpl(Features, "fsgsbase", true);
2405 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002406 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002407 setFeatureEnabledImpl(Features, "avx", true);
2408 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002409 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002410 case CK_Silvermont:
2411 setFeatureEnabledImpl(Features, "aes", true);
2412 setFeatureEnabledImpl(Features, "pclmul", true);
2413 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002414 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002415 setFeatureEnabledImpl(Features, "sse4.2", true);
2416 setFeatureEnabledImpl(Features, "cx16", true);
2417 break;
2418 case CK_KNL:
2419 setFeatureEnabledImpl(Features, "avx512f", true);
2420 setFeatureEnabledImpl(Features, "avx512cd", true);
2421 setFeatureEnabledImpl(Features, "avx512er", true);
2422 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002423 setFeatureEnabledImpl(Features, "rdseed", true);
2424 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002425 setFeatureEnabledImpl(Features, "lzcnt", true);
2426 setFeatureEnabledImpl(Features, "bmi", true);
2427 setFeatureEnabledImpl(Features, "bmi2", true);
2428 setFeatureEnabledImpl(Features, "rtm", true);
2429 setFeatureEnabledImpl(Features, "fma", true);
2430 setFeatureEnabledImpl(Features, "rdrnd", true);
2431 setFeatureEnabledImpl(Features, "f16c", true);
2432 setFeatureEnabledImpl(Features, "fsgsbase", true);
2433 setFeatureEnabledImpl(Features, "aes", true);
2434 setFeatureEnabledImpl(Features, "pclmul", true);
2435 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002436 break;
2437 case CK_K6_2:
2438 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002439 case CK_WinChip2:
2440 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002441 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002442 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002443 case CK_Athlon:
2444 case CK_AthlonThunderbird:
2445 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002446 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002447 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002448 case CK_Athlon4:
2449 case CK_AthlonXP:
2450 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002451 setFeatureEnabledImpl(Features, "sse", true);
2452 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002453 break;
2454 case CK_K8:
2455 case CK_Opteron:
2456 case CK_Athlon64:
2457 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002458 setFeatureEnabledImpl(Features, "sse2", true);
2459 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002460 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002461 case CK_AMDFAM10:
2462 setFeatureEnabledImpl(Features, "sse4a", true);
2463 setFeatureEnabledImpl(Features, "lzcnt", true);
2464 setFeatureEnabledImpl(Features, "popcnt", true);
2465 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002466 case CK_K8SSE3:
2467 case CK_OpteronSSE3:
2468 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002469 setFeatureEnabledImpl(Features, "sse3", true);
2470 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002471 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002472 case CK_BTVER2:
2473 setFeatureEnabledImpl(Features, "avx", true);
2474 setFeatureEnabledImpl(Features, "aes", true);
2475 setFeatureEnabledImpl(Features, "pclmul", true);
2476 setFeatureEnabledImpl(Features, "bmi", true);
2477 setFeatureEnabledImpl(Features, "f16c", true);
2478 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002479 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002480 setFeatureEnabledImpl(Features, "ssse3", true);
2481 setFeatureEnabledImpl(Features, "sse4a", true);
2482 setFeatureEnabledImpl(Features, "lzcnt", true);
2483 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002484 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002485 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002486 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002487 case CK_BDVER4:
2488 setFeatureEnabledImpl(Features, "avx2", true);
2489 setFeatureEnabledImpl(Features, "bmi2", true);
2490 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002491 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002492 setFeatureEnabledImpl(Features, "fsgsbase", true);
2493 // FALLTHROUGH
2494 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002495 setFeatureEnabledImpl(Features, "bmi", true);
2496 setFeatureEnabledImpl(Features, "fma", true);
2497 setFeatureEnabledImpl(Features, "f16c", true);
2498 setFeatureEnabledImpl(Features, "tbm", true);
2499 // FALLTHROUGH
2500 case CK_BDVER1:
2501 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002502 setFeatureEnabledImpl(Features, "xop", true);
2503 setFeatureEnabledImpl(Features, "lzcnt", true);
2504 setFeatureEnabledImpl(Features, "aes", true);
2505 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002506 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002507 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002508 break;
Eli Friedman33465822011-07-08 23:31:17 +00002509 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002510}
2511
Rafael Espindolae62e2792013-08-20 13:44:29 +00002512void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002513 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002514 if (Enabled) {
2515 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002516 case AVX512F:
2517 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002518 case AVX2:
2519 Features["avx2"] = true;
2520 case AVX:
2521 Features["avx"] = true;
2522 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002523 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002524 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002525 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002526 case SSSE3:
2527 Features["ssse3"] = true;
2528 case SSE3:
2529 Features["sse3"] = true;
2530 case SSE2:
2531 Features["sse2"] = true;
2532 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002533 Features["sse"] = true;
2534 case NoSSE:
2535 break;
2536 }
2537 return;
2538 }
2539
2540 switch (Level) {
2541 case NoSSE:
2542 case SSE1:
2543 Features["sse"] = false;
2544 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002545 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2546 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002547 case SSE3:
2548 Features["sse3"] = false;
2549 setXOPLevel(Features, NoXOP, false);
2550 case SSSE3:
2551 Features["ssse3"] = false;
2552 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002553 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002554 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002555 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002556 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002557 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002558 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002559 case AVX2:
2560 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002561 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002562 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002563 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2564 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002565 }
2566}
2567
2568void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002569 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002570 if (Enabled) {
2571 switch (Level) {
2572 case AMD3DNowAthlon:
2573 Features["3dnowa"] = true;
2574 case AMD3DNow:
2575 Features["3dnow"] = true;
2576 case MMX:
2577 Features["mmx"] = true;
2578 case NoMMX3DNow:
2579 break;
2580 }
2581 return;
2582 }
2583
2584 switch (Level) {
2585 case NoMMX3DNow:
2586 case MMX:
2587 Features["mmx"] = false;
2588 case AMD3DNow:
2589 Features["3dnow"] = false;
2590 case AMD3DNowAthlon:
2591 Features["3dnowa"] = false;
2592 }
2593}
2594
2595void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002596 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002597 if (Enabled) {
2598 switch (Level) {
2599 case XOP:
2600 Features["xop"] = true;
2601 case FMA4:
2602 Features["fma4"] = true;
2603 setSSELevel(Features, AVX, true);
2604 case SSE4A:
2605 Features["sse4a"] = true;
2606 setSSELevel(Features, SSE3, true);
2607 case NoXOP:
2608 break;
2609 }
2610 return;
2611 }
2612
2613 switch (Level) {
2614 case NoXOP:
2615 case SSE4A:
2616 Features["sse4a"] = false;
2617 case FMA4:
2618 Features["fma4"] = false;
2619 case XOP:
2620 Features["xop"] = false;
2621 }
2622}
2623
Craig Topper86d79ef2013-09-17 04:51:29 +00002624void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2625 StringRef Name, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002626 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002627
Craig Topper29561122013-09-19 01:13:07 +00002628 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002629 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002630 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002631 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002632 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002633 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002634 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002635 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002636 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002637 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002638 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002639 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002640 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002641 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002642 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002643 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002644 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002645 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002646 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002647 if (Enabled)
2648 setSSELevel(Features, SSE2, Enabled);
2649 } else if (Name == "pclmul") {
2650 if (Enabled)
2651 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002652 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002653 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002654 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002655 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002656 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002657 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002658 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2659 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002660 if (Enabled)
2661 setSSELevel(Features, AVX512F, Enabled);
2662 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002663 if (Enabled)
2664 setSSELevel(Features, AVX, Enabled);
2665 } else if (Name == "fma4") {
2666 setXOPLevel(Features, FMA4, Enabled);
2667 } else if (Name == "xop") {
2668 setXOPLevel(Features, XOP, Enabled);
2669 } else if (Name == "sse4a") {
2670 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002671 } else if (Name == "f16c") {
2672 if (Enabled)
2673 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002674 } else if (Name == "sha") {
2675 if (Enabled)
2676 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002677 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002678}
2679
Eric Christopher3ff21b32013-10-16 21:26:26 +00002680/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002681/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002682bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002683 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002684 // Remember the maximum enabled sselevel.
2685 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2686 // Ignore disabled features.
2687 if (Features[i][0] == '-')
2688 continue;
2689
Benjamin Kramer27402c62012-03-05 15:10:44 +00002690 StringRef Feature = StringRef(Features[i]).substr(1);
2691
2692 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002693 HasAES = true;
2694 continue;
2695 }
2696
Craig Topper3f122a72012-05-31 05:18:48 +00002697 if (Feature == "pclmul") {
2698 HasPCLMUL = true;
2699 continue;
2700 }
2701
Benjamin Kramer27402c62012-03-05 15:10:44 +00002702 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002703 HasLZCNT = true;
2704 continue;
2705 }
2706
Rafael Espindola89049822013-08-23 20:21:37 +00002707 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002708 HasRDRND = true;
2709 continue;
2710 }
2711
Craig Topper8c7f2512014-11-03 06:51:41 +00002712 if (Feature == "fsgsbase") {
2713 HasFSGSBASE = true;
2714 continue;
2715 }
2716
Benjamin Kramer27402c62012-03-05 15:10:44 +00002717 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002718 HasBMI = true;
2719 continue;
2720 }
2721
Benjamin Kramer27402c62012-03-05 15:10:44 +00002722 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002723 HasBMI2 = true;
2724 continue;
2725 }
2726
Benjamin Kramer27402c62012-03-05 15:10:44 +00002727 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002728 HasPOPCNT = true;
2729 continue;
2730 }
2731
Michael Liao625a8752012-11-10 05:17:46 +00002732 if (Feature == "rtm") {
2733 HasRTM = true;
2734 continue;
2735 }
2736
Michael Liao74f4eaf2013-03-26 17:52:08 +00002737 if (Feature == "prfchw") {
2738 HasPRFCHW = true;
2739 continue;
2740 }
2741
Michael Liaoffaae352013-03-29 05:17:55 +00002742 if (Feature == "rdseed") {
2743 HasRDSEED = true;
2744 continue;
2745 }
2746
Robert Khasanov50e6f582014-09-19 09:53:48 +00002747 if (Feature == "adx") {
2748 HasADX = true;
2749 continue;
2750 }
2751
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002752 if (Feature == "tbm") {
2753 HasTBM = true;
2754 continue;
2755 }
2756
Craig Topperbba778b2012-06-03 21:46:30 +00002757 if (Feature == "fma") {
2758 HasFMA = true;
2759 continue;
2760 }
2761
Manman Rena45358c2012-10-11 00:59:55 +00002762 if (Feature == "f16c") {
2763 HasF16C = true;
2764 continue;
2765 }
2766
Craig Topper679b53a2013-08-21 05:29:10 +00002767 if (Feature == "avx512cd") {
2768 HasAVX512CD = true;
2769 continue;
2770 }
2771
2772 if (Feature == "avx512er") {
2773 HasAVX512ER = true;
2774 continue;
2775 }
2776
2777 if (Feature == "avx512pf") {
2778 HasAVX512PF = true;
2779 continue;
2780 }
2781
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002782 if (Feature == "avx512dq") {
2783 HasAVX512DQ = true;
2784 continue;
2785 }
2786
2787 if (Feature == "avx512bw") {
2788 HasAVX512BW = true;
2789 continue;
2790 }
2791
2792 if (Feature == "avx512vl") {
2793 HasAVX512VL = true;
2794 continue;
2795 }
2796
Ben Langmuir58078d02013-09-19 13:22:04 +00002797 if (Feature == "sha") {
2798 HasSHA = true;
2799 continue;
2800 }
2801
Nick Lewycky50e8f482013-10-05 20:14:27 +00002802 if (Feature == "cx16") {
2803 HasCX16 = true;
2804 continue;
2805 }
2806
Daniel Dunbar979586e2009-11-11 09:38:56 +00002807 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002808 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002809 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002810 .Case("avx2", AVX2)
2811 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002812 .Case("sse4.2", SSE42)
2813 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002814 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002815 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002816 .Case("sse2", SSE2)
2817 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002818 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002819 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002820
Eli Friedman33465822011-07-08 23:31:17 +00002821 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002822 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002823 .Case("3dnowa", AMD3DNowAthlon)
2824 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002825 .Case("mmx", MMX)
2826 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002827 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002828
2829 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2830 .Case("xop", XOP)
2831 .Case("fma4", FMA4)
2832 .Case("sse4a", SSE4A)
2833 .Default(NoXOP);
2834 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002835 }
Eli Friedman33465822011-07-08 23:31:17 +00002836
Craig Topper7481d8a2013-09-10 06:55:47 +00002837 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2838 // Can't do this earlier because we need to be able to explicitly enable
2839 // popcnt and still disable sse4.2.
2840 if (!HasPOPCNT && SSELevel >= SSE42 &&
2841 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2842 HasPOPCNT = true;
2843 Features.push_back("+popcnt");
2844 }
2845
Yunzhong Gao61089362013-10-16 19:07:02 +00002846 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2847 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2848 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2849 HasPRFCHW = true;
2850 Features.push_back("+prfchw");
2851 }
2852
Rafael Espindolaeb265472013-08-21 21:59:03 +00002853 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2854 // matches the selected sse level.
2855 if (FPMath == FP_SSE && SSELevel < SSE1) {
2856 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2857 return false;
2858 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2859 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2860 return false;
2861 }
2862
Eli Friedman33465822011-07-08 23:31:17 +00002863 // Don't tell the backend if we're turning off mmx; it will end up disabling
2864 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002865 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2866 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002867 std::vector<std::string>::iterator it;
2868 it = std::find(Features.begin(), Features.end(), "-mmx");
2869 if (it != Features.end())
2870 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002871 else if (SSELevel > NoSSE)
2872 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002873 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002874}
Chris Lattnerecd49032009-03-02 22:27:17 +00002875
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002876/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2877/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002878void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002879 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002880 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002881 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002882 Builder.defineMacro("__amd64__");
2883 Builder.defineMacro("__amd64");
2884 Builder.defineMacro("__x86_64");
2885 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002886 if (getTriple().getArchName() == "x86_64h") {
2887 Builder.defineMacro("__x86_64h");
2888 Builder.defineMacro("__x86_64h__");
2889 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002890 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002891 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002892 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002893
Chris Lattnerecd49032009-03-02 22:27:17 +00002894 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002895 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2896 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002897 switch (CPU) {
2898 case CK_Generic:
2899 break;
2900 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002901 // The rest are coming from the i386 define above.
2902 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002903 break;
2904 case CK_i486:
2905 case CK_WinChipC6:
2906 case CK_WinChip2:
2907 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002908 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002909 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002910 case CK_PentiumMMX:
2911 Builder.defineMacro("__pentium_mmx__");
2912 Builder.defineMacro("__tune_pentium_mmx__");
2913 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002914 case CK_i586:
2915 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002916 defineCPUMacros(Builder, "i586");
2917 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002918 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002919 case CK_Pentium3:
2920 case CK_Pentium3M:
2921 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002922 Builder.defineMacro("__tune_pentium3__");
2923 // Fallthrough
2924 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002925 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002926 Builder.defineMacro("__tune_pentium2__");
2927 // Fallthrough
2928 case CK_PentiumPro:
2929 Builder.defineMacro("__tune_i686__");
2930 Builder.defineMacro("__tune_pentiumpro__");
2931 // Fallthrough
2932 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002933 Builder.defineMacro("__i686");
2934 Builder.defineMacro("__i686__");
2935 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2936 Builder.defineMacro("__pentiumpro");
2937 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002938 break;
2939 case CK_Pentium4:
2940 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002941 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002942 break;
2943 case CK_Yonah:
2944 case CK_Prescott:
2945 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002946 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002947 break;
2948 case CK_Core2:
2949 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002950 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002951 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002952 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002953 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002954 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002955 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002956 defineCPUMacros(Builder, "slm");
2957 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002958 case CK_Nehalem:
2959 case CK_Westmere:
2960 case CK_SandyBridge:
2961 case CK_IvyBridge:
2962 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002963 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002964 // FIXME: Historically, we defined this legacy name, it would be nice to
2965 // remove it at some point. We've never exposed fine-grained names for
2966 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002967 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002968 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002969 case CK_Skylake:
2970 // FIXME: Historically, we defined this legacy name, it would be nice to
2971 // remove it at some point. This is the only fine-grained CPU macro in the
2972 // main intel CPU line, and it would be better to not have these and force
2973 // people to use ISA macros.
2974 defineCPUMacros(Builder, "skx");
2975 break;
Craig Topper449314e2013-08-20 07:09:39 +00002976 case CK_KNL:
2977 defineCPUMacros(Builder, "knl");
2978 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002979 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002980 Builder.defineMacro("__k6_2__");
2981 Builder.defineMacro("__tune_k6_2__");
2982 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002983 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002984 if (CPU != CK_K6_2) { // In case of fallthrough
2985 // FIXME: GCC may be enabling these in cases where some other k6
2986 // architecture is specified but -m3dnow is explicitly provided. The
2987 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002988 Builder.defineMacro("__k6_3__");
2989 Builder.defineMacro("__tune_k6_3__");
2990 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002991 // Fallthrough
2992 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002993 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002994 break;
2995 case CK_Athlon:
2996 case CK_AthlonThunderbird:
2997 case CK_Athlon4:
2998 case CK_AthlonXP:
2999 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003000 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003001 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003002 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003003 Builder.defineMacro("__tune_athlon_sse__");
3004 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003005 break;
3006 case CK_K8:
3007 case CK_K8SSE3:
3008 case CK_x86_64:
3009 case CK_Opteron:
3010 case CK_OpteronSSE3:
3011 case CK_Athlon64:
3012 case CK_Athlon64SSE3:
3013 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003014 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003015 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003016 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003017 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003018 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003019 case CK_BTVER1:
3020 defineCPUMacros(Builder, "btver1");
3021 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003022 case CK_BTVER2:
3023 defineCPUMacros(Builder, "btver2");
3024 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003025 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003026 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003027 break;
3028 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003029 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003030 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003031 case CK_BDVER3:
3032 defineCPUMacros(Builder, "bdver3");
3033 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003034 case CK_BDVER4:
3035 defineCPUMacros(Builder, "bdver4");
3036 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003037 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003038 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003039 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003040 }
Chris Lattner96e43572009-03-02 22:40:39 +00003041
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003042 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003043 Builder.defineMacro("__REGISTER_PREFIX__", "");
3044
Chris Lattner6df41af2009-04-19 17:32:33 +00003045 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3046 // functions in glibc header files that use FP Stack inline asm which the
3047 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003048 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003049
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003050 if (HasAES)
3051 Builder.defineMacro("__AES__");
3052
Craig Topper3f122a72012-05-31 05:18:48 +00003053 if (HasPCLMUL)
3054 Builder.defineMacro("__PCLMUL__");
3055
Craig Topper22967d42011-12-25 05:06:45 +00003056 if (HasLZCNT)
3057 Builder.defineMacro("__LZCNT__");
3058
Benjamin Kramer1e250392012-07-07 09:39:18 +00003059 if (HasRDRND)
3060 Builder.defineMacro("__RDRND__");
3061
Craig Topper8c7f2512014-11-03 06:51:41 +00003062 if (HasFSGSBASE)
3063 Builder.defineMacro("__FSGSBASE__");
3064
Craig Topper22967d42011-12-25 05:06:45 +00003065 if (HasBMI)
3066 Builder.defineMacro("__BMI__");
3067
3068 if (HasBMI2)
3069 Builder.defineMacro("__BMI2__");
3070
Craig Topper1de83482011-12-29 16:10:46 +00003071 if (HasPOPCNT)
3072 Builder.defineMacro("__POPCNT__");
3073
Michael Liao625a8752012-11-10 05:17:46 +00003074 if (HasRTM)
3075 Builder.defineMacro("__RTM__");
3076
Michael Liao74f4eaf2013-03-26 17:52:08 +00003077 if (HasPRFCHW)
3078 Builder.defineMacro("__PRFCHW__");
3079
Michael Liaoffaae352013-03-29 05:17:55 +00003080 if (HasRDSEED)
3081 Builder.defineMacro("__RDSEED__");
3082
Robert Khasanov50e6f582014-09-19 09:53:48 +00003083 if (HasADX)
3084 Builder.defineMacro("__ADX__");
3085
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003086 if (HasTBM)
3087 Builder.defineMacro("__TBM__");
3088
Rafael Espindolae62e2792013-08-20 13:44:29 +00003089 switch (XOPLevel) {
3090 case XOP:
3091 Builder.defineMacro("__XOP__");
3092 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003093 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003094 case SSE4A:
3095 Builder.defineMacro("__SSE4A__");
3096 case NoXOP:
3097 break;
3098 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003099
Craig Topperbba778b2012-06-03 21:46:30 +00003100 if (HasFMA)
3101 Builder.defineMacro("__FMA__");
3102
Manman Rena45358c2012-10-11 00:59:55 +00003103 if (HasF16C)
3104 Builder.defineMacro("__F16C__");
3105
Craig Topper679b53a2013-08-21 05:29:10 +00003106 if (HasAVX512CD)
3107 Builder.defineMacro("__AVX512CD__");
3108 if (HasAVX512ER)
3109 Builder.defineMacro("__AVX512ER__");
3110 if (HasAVX512PF)
3111 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003112 if (HasAVX512DQ)
3113 Builder.defineMacro("__AVX512DQ__");
3114 if (HasAVX512BW)
3115 Builder.defineMacro("__AVX512BW__");
3116 if (HasAVX512VL)
3117 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003118
Ben Langmuir58078d02013-09-19 13:22:04 +00003119 if (HasSHA)
3120 Builder.defineMacro("__SHA__");
3121
Nick Lewycky50e8f482013-10-05 20:14:27 +00003122 if (HasCX16)
3123 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3124
Chris Lattner96e43572009-03-02 22:40:39 +00003125 // Each case falls through to the previous one here.
3126 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003127 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003128 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003129 case AVX2:
3130 Builder.defineMacro("__AVX2__");
3131 case AVX:
3132 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003133 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003134 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003135 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003136 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003137 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003138 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003139 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003140 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003141 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003142 Builder.defineMacro("__SSE2__");
3143 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003144 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003145 Builder.defineMacro("__SSE__");
3146 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003147 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003148 break;
3149 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003150
Derek Schuffc7dd7222012-10-11 15:52:22 +00003151 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003152 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003153 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003154 case AVX2:
3155 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003156 case SSE42:
3157 case SSE41:
3158 case SSSE3:
3159 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003160 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003161 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003162 break;
3163 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003164 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003165 break;
3166 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003167 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003168 }
3169 }
3170
Anders Carlssone437c682010-01-27 03:47:49 +00003171 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003172 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003173 case AMD3DNowAthlon:
3174 Builder.defineMacro("__3dNOW_A__");
3175 case AMD3DNow:
3176 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003177 case MMX:
3178 Builder.defineMacro("__MMX__");
3179 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003180 break;
3181 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003182
3183 if (CPU >= CK_i486) {
3184 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3185 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3186 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3187 }
3188 if (CPU >= CK_i586)
3189 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003190}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003191
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003192bool X86TargetInfo::hasFeature(StringRef Feature) const {
3193 return llvm::StringSwitch<bool>(Feature)
3194 .Case("aes", HasAES)
3195 .Case("avx", SSELevel >= AVX)
3196 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003197 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003198 .Case("avx512cd", HasAVX512CD)
3199 .Case("avx512er", HasAVX512ER)
3200 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003201 .Case("avx512dq", HasAVX512DQ)
3202 .Case("avx512bw", HasAVX512BW)
3203 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003204 .Case("bmi", HasBMI)
3205 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003206 .Case("cx16", HasCX16)
3207 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003208 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003209 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003210 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003211 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003212 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3213 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3214 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003215 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003216 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003217 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003218 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003219 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003220 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003221 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003222 .Case("sse", SSELevel >= SSE1)
3223 .Case("sse2", SSELevel >= SSE2)
3224 .Case("sse3", SSELevel >= SSE3)
3225 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003226 .Case("sse4.1", SSELevel >= SSE41)
3227 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003228 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003229 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003230 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003231 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3232 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003233 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003234 .Default(false);
3235}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003236
Eli Friedman3fd920a2008-08-20 02:34:37 +00003237bool
Anders Carlsson58436352009-02-28 17:11:49 +00003238X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003239 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003240 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003241 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003242 case 'I':
3243 Info.setRequiresImmediate(0, 31);
3244 return true;
3245 case 'J':
3246 Info.setRequiresImmediate(0, 63);
3247 return true;
3248 case 'K':
3249 Info.setRequiresImmediate(-128, 127);
3250 return true;
3251 case 'L':
3252 // FIXME: properly analyze this constraint:
3253 // must be one of 0xff, 0xffff, or 0xffffffff
3254 return true;
3255 case 'M':
3256 Info.setRequiresImmediate(0, 3);
3257 return true;
3258 case 'N':
3259 Info.setRequiresImmediate(0, 255);
3260 return true;
3261 case 'O':
3262 Info.setRequiresImmediate(0, 127);
3263 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003264 case 'Y': // first letter of a pair:
3265 switch (*(Name+1)) {
3266 default: return false;
3267 case '0': // First SSE register.
3268 case 't': // Any SSE register, when SSE2 is enabled.
3269 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3270 case 'm': // any MMX register, when inter-unit moves enabled.
3271 break; // falls through to setAllowsRegister.
3272 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003273 case 'f': // any x87 floating point stack register.
3274 // Constraint 'f' cannot be used for output operands.
3275 if (Info.ConstraintStr[0] == '=')
3276 return false;
3277
3278 Info.setAllowsRegister();
3279 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003280 case 'a': // eax.
3281 case 'b': // ebx.
3282 case 'c': // ecx.
3283 case 'd': // edx.
3284 case 'S': // esi.
3285 case 'D': // edi.
3286 case 'A': // edx:eax.
3287 case 't': // top of floating point stack.
3288 case 'u': // second from top of floating point stack.
3289 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003290 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003291 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003292 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003293 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3294 case 'l': // "Index" registers: any general register that can be used as an
3295 // index in a base+index memory access.
3296 Info.setAllowsRegister();
3297 return true;
3298 case 'C': // SSE floating point constant.
3299 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003300 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003301 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003302 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003303 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003304 return true;
3305 }
3306}
3307
Akira Hatanaka974131e2014-09-18 18:17:18 +00003308bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3309 unsigned Size) const {
3310 // Strip off constraint modifiers.
3311 while (Constraint[0] == '=' ||
3312 Constraint[0] == '+' ||
3313 Constraint[0] == '&')
3314 Constraint = Constraint.substr(1);
3315
3316 return validateOperandSize(Constraint, Size);
3317}
3318
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003319bool X86TargetInfo::validateInputSize(StringRef Constraint,
3320 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003321 return validateOperandSize(Constraint, Size);
3322}
3323
3324bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3325 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003326 switch (Constraint[0]) {
3327 default: break;
3328 case 'y':
3329 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003330 case 'f':
3331 case 't':
3332 case 'u':
3333 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003334 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003335 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003336 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003337 }
3338
3339 return true;
3340}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003341
Eli Friedman3fd920a2008-08-20 02:34:37 +00003342std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003343X86TargetInfo::convertConstraint(const char *&Constraint) const {
3344 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003345 case 'a': return std::string("{ax}");
3346 case 'b': return std::string("{bx}");
3347 case 'c': return std::string("{cx}");
3348 case 'd': return std::string("{dx}");
3349 case 'S': return std::string("{si}");
3350 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003351 case 'p': // address
3352 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003353 case 't': // top of floating point stack.
3354 return std::string("{st}");
3355 case 'u': // second from top of floating point stack.
3356 return std::string("{st(1)}"); // second from top of floating point stack.
3357 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003358 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003359 }
3360}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003361
Eli Friedman3fd920a2008-08-20 02:34:37 +00003362// X86-32 generic target
3363class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003364public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003365 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003366 DoubleAlign = LongLongAlign = 32;
3367 LongDoubleWidth = 96;
3368 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003369 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003370 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003371 SizeType = UnsignedInt;
3372 PtrDiffType = SignedInt;
3373 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003374 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003375
3376 // Use fpret for all types.
3377 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3378 (1 << TargetInfo::Double) |
3379 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003380
3381 // x86-32 has atomics up to 8 bytes
3382 // FIXME: Check that we actually have cmpxchg8b before setting
3383 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3384 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003385 }
Craig Topper3164f332014-03-11 03:39:26 +00003386 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003387 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003388 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003389
Craig Topper3164f332014-03-11 03:39:26 +00003390 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003391 if (RegNo == 0) return 0;
3392 if (RegNo == 1) return 2;
3393 return -1;
3394 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003395 bool validateOperandSize(StringRef Constraint,
3396 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003397 switch (Constraint[0]) {
3398 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003399 case 'R':
3400 case 'q':
3401 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003402 case 'a':
3403 case 'b':
3404 case 'c':
3405 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003406 case 'S':
3407 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003408 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003409 case 'A':
3410 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003411 }
3412
Akira Hatanaka974131e2014-09-18 18:17:18 +00003413 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003414 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003415};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003416
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003417class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3418public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003419 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3420 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003421
Craig Topper3164f332014-03-11 03:39:26 +00003422 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003423 unsigned Major, Minor, Micro;
3424 getTriple().getOSVersion(Major, Minor, Micro);
3425 // New NetBSD uses the default rounding mode.
3426 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3427 return X86_32TargetInfo::getFloatEvalMethod();
3428 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003429 return 1;
3430 }
3431};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003432
Eli Friedmane3aa4542009-07-05 18:47:56 +00003433class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3434public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003435 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3436 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003437 SizeType = UnsignedLong;
3438 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003439 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003440 }
3441};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003442
Eli Friedman9fa28852012-08-08 23:57:20 +00003443class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3444public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003445 BitrigI386TargetInfo(const llvm::Triple &Triple)
3446 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003447 SizeType = UnsignedLong;
3448 IntPtrType = SignedLong;
3449 PtrDiffType = SignedLong;
3450 }
3451};
Eli Friedman9fa28852012-08-08 23:57:20 +00003452
Torok Edwinb2b37c62009-06-30 17:10:35 +00003453class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003454public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003455 DarwinI386TargetInfo(const llvm::Triple &Triple)
3456 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003457 LongDoubleWidth = 128;
3458 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003459 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003460 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003461 SizeType = UnsignedLong;
3462 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003463 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003464 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003465 }
3466
Eli Friedman3fd920a2008-08-20 02:34:37 +00003467};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003468
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003469// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003470class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003471public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003472 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3473 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003474 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003475 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003476 bool IsWinCOFF =
3477 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
3478 DescriptionString = IsWinCOFF ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32"
3479 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003480 }
Craig Topper3164f332014-03-11 03:39:26 +00003481 void getTargetDefines(const LangOptions &Opts,
3482 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003483 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3484 }
3485};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003486
3487// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003488class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003489public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003490 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003491 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003492 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003493 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3494 }
Craig Topper3164f332014-03-11 03:39:26 +00003495 void getTargetDefines(const LangOptions &Opts,
3496 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003497 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3498 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3499 // The value of the following reflects processor type.
3500 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3501 // We lost the original triple, so we use the default.
3502 Builder.defineMacro("_M_IX86", "600");
3503 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003504};
3505} // end anonymous namespace
3506
Reid Kleckner47606832014-04-21 20:58:00 +00003507static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3508 Builder.defineMacro("__MSVCRT__");
3509 Builder.defineMacro("__MINGW32__");
3510
3511 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3512 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3513 // macro anyway for pre-processor compatibility.
3514 if (Opts.MicrosoftExt)
3515 Builder.defineMacro("__declspec", "__declspec");
3516 else
3517 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3518
3519 if (!Opts.MicrosoftExt) {
3520 // Provide macros for all the calling convention keywords. Provide both
3521 // single and double underscore prefixed variants. These are available on
3522 // x64 as well as x86, even though they have no effect.
3523 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3524 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003525 std::string GCCSpelling = "__attribute__((__";
3526 GCCSpelling += CC;
3527 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003528 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3529 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3530 }
3531 }
3532}
3533
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003534namespace {
3535// x86-32 MinGW target
3536class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3537public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003538 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3539 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003540 void getTargetDefines(const LangOptions &Opts,
3541 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003542 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003543 DefineStd(Builder, "WIN32", Opts);
3544 DefineStd(Builder, "WINNT", Opts);
3545 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003546 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003547 }
3548};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003549
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003550// x86-32 Cygwin target
3551class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3552public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003553 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3554 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003555 TLSSupported = false;
3556 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003557 DoubleAlign = LongLongAlign = 64;
David Majnemer8fa8c382015-03-17 23:55:00 +00003558 DescriptionString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003559 }
Craig Topper3164f332014-03-11 03:39:26 +00003560 void getTargetDefines(const LangOptions &Opts,
3561 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003562 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003563 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003564 Builder.defineMacro("__CYGWIN__");
3565 Builder.defineMacro("__CYGWIN32__");
3566 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003567 if (Opts.CPlusPlus)
3568 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003569 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003570};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003571
Chris Lattnerb986aba2010-04-11 19:29:39 +00003572// x86-32 Haiku target
3573class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3574public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003575 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003576 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003577 IntPtrType = SignedLong;
3578 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003579 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003580 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003581 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003582 }
Craig Topper3164f332014-03-11 03:39:26 +00003583 void getTargetDefines(const LangOptions &Opts,
3584 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003585 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3586 Builder.defineMacro("__INTEL__");
3587 Builder.defineMacro("__HAIKU__");
3588 }
3589};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003590
Douglas Gregor9fabd852011-07-01 22:41:14 +00003591// RTEMS Target
3592template<typename Target>
3593class RTEMSTargetInfo : public OSTargetInfo<Target> {
3594protected:
Craig Topper3164f332014-03-11 03:39:26 +00003595 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3596 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003597 // RTEMS defines; list based off of gcc output
3598
Douglas Gregor9fabd852011-07-01 22:41:14 +00003599 Builder.defineMacro("__rtems__");
3600 Builder.defineMacro("__ELF__");
3601 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003602
Douglas Gregor9fabd852011-07-01 22:41:14 +00003603public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003604 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3605 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003606
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003607 switch (Triple.getArch()) {
3608 default:
3609 case llvm::Triple::x86:
3610 // this->MCountName = ".mcount";
3611 break;
3612 case llvm::Triple::mips:
3613 case llvm::Triple::mipsel:
3614 case llvm::Triple::ppc:
3615 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003616 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003617 // this->MCountName = "_mcount";
3618 break;
3619 case llvm::Triple::arm:
3620 // this->MCountName = "__mcount";
3621 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003622 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003623 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003624};
3625
Douglas Gregor9fabd852011-07-01 22:41:14 +00003626// x86-32 RTEMS target
3627class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3628public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003629 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003630 SizeType = UnsignedLong;
3631 IntPtrType = SignedLong;
3632 PtrDiffType = SignedLong;
3633 this->UserLabelPrefix = "";
3634 }
Craig Topper3164f332014-03-11 03:39:26 +00003635 void getTargetDefines(const LangOptions &Opts,
3636 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003637 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3638 Builder.defineMacro("__INTEL__");
3639 Builder.defineMacro("__rtems__");
3640 }
3641};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003642
Eli Friedman3fd920a2008-08-20 02:34:37 +00003643// x86-64 generic target
3644class X86_64TargetInfo : public X86TargetInfo {
3645public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003646 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003647 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003648 bool IsWinCOFF =
3649 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003650 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003651 LongDoubleWidth = 128;
3652 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003653 LargeArrayMinWidth = 128;
3654 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003655 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003656 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3657 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3658 IntPtrType = IsX32 ? SignedInt : SignedLong;
3659 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003660 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003661 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003662
Eric Christopher917e9522014-11-18 22:36:15 +00003663 // Pointers are 32-bit in x32.
David Majnemer8fa8c382015-03-17 23:55:00 +00003664 DescriptionString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3665 : IsWinCOFF
3666 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3667 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003668
3669 // Use fpret only for long double.
3670 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003671
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003672 // Use fp2ret for _Complex long double.
3673 ComplexLongDoubleUsesFP2Ret = true;
3674
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003675 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003676 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003677 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003678 }
Craig Topper3164f332014-03-11 03:39:26 +00003679 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003680 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003681 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003682
Craig Topper3164f332014-03-11 03:39:26 +00003683 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003684 if (RegNo == 0) return 0;
3685 if (RegNo == 1) return 1;
3686 return -1;
3687 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003688
Craig Topper3164f332014-03-11 03:39:26 +00003689 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003690 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003691 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003692 CC == CC_IntelOclBicc ||
3693 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003694 }
3695
Craig Topper3164f332014-03-11 03:39:26 +00003696 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003697 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003698 }
3699
Pavel Chupinfd223e12014-08-04 12:39:43 +00003700 // for x32 we need it here explicitly
3701 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003702};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003703
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003704// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003705class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003706public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003707 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3708 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003709 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003710 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003711 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003712 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003713 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003714 SizeType = UnsignedLongLong;
3715 PtrDiffType = SignedLongLong;
3716 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003717 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003718 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003719
Craig Topper3164f332014-03-11 03:39:26 +00003720 void getTargetDefines(const LangOptions &Opts,
3721 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003722 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003723 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003724 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003725
Craig Topper3164f332014-03-11 03:39:26 +00003726 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003727 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003728 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003729
Craig Topper3164f332014-03-11 03:39:26 +00003730 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003731 switch (CC) {
3732 case CC_X86StdCall:
3733 case CC_X86ThisCall:
3734 case CC_X86FastCall:
3735 return CCCR_Ignore;
3736 case CC_C:
3737 case CC_X86VectorCall:
3738 case CC_IntelOclBicc:
3739 case CC_X86_64SysV:
3740 return CCCR_OK;
3741 default:
3742 return CCCR_Warning;
3743 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003744 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003745};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003746
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003747// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003748class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003749public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003750 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003751 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003752 LongDoubleWidth = LongDoubleAlign = 64;
3753 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003754 }
Craig Topper3164f332014-03-11 03:39:26 +00003755 void getTargetDefines(const LangOptions &Opts,
3756 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003757 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3758 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003759 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003760 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003761 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003762};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003763
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003764// x86-64 MinGW target
3765class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3766public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003767 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3768 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003769 void getTargetDefines(const LangOptions &Opts,
3770 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003771 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003772 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003773 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003774 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003775
3776 // GCC defines this macro when it is using __gxx_personality_seh0.
3777 if (!Opts.SjLjExceptions)
3778 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003779 }
3780};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003781
Eli Friedman2857ccb2009-07-01 03:36:11 +00003782class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3783public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003784 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3785 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003786 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003787 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003788 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3789 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003790 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003791 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003792 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003793 }
3794};
Eli Friedman2857ccb2009-07-01 03:36:11 +00003795
Eli Friedman245f2292009-07-05 22:31:18 +00003796class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3797public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003798 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3799 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003800 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003801 Int64Type = SignedLongLong;
3802 }
3803};
Eli Friedman245f2292009-07-05 22:31:18 +00003804
Eli Friedman9fa28852012-08-08 23:57:20 +00003805class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3806public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003807 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3808 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3809 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003810 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003811 }
3812};
Tim Northover9bb857a2013-01-31 12:13:10 +00003813
Eli Friedmanf05b7722008-08-20 07:44:10 +00003814class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003815 // Possible FPU choices.
3816 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003817 VFP2FPU = (1 << 0),
3818 VFP3FPU = (1 << 1),
3819 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003820 NeonFPU = (1 << 3),
3821 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003822 };
3823
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003824 // Possible HWDiv features.
3825 enum HWDivMode {
3826 HWDivThumb = (1 << 0),
3827 HWDivARM = (1 << 1)
3828 };
3829
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003830 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003831 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003832 }
3833
3834 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3835 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003836
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003837 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003838
Rafael Espindolaeb265472013-08-21 21:59:03 +00003839 enum {
3840 FP_Default,
3841 FP_VFP,
3842 FP_Neon
3843 } FPMath;
3844
Bernard Ogdenda13af32013-10-24 18:32:51 +00003845 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003846
Logan Chien57086ce2012-10-10 06:56:20 +00003847 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003848 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003849 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003850
3851 // Initialized via features.
3852 unsigned SoftFloat : 1;
3853 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003854
Bernard Ogden18b57012013-10-29 09:47:51 +00003855 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003856 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003857
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003858 // ACLE 6.5.1 Hardware floating point
3859 enum {
3860 HW_FP_HP = (1 << 1), /// half (16-bit)
3861 HW_FP_SP = (1 << 2), /// single (32-bit)
3862 HW_FP_DP = (1 << 3), /// double (64-bit)
3863 };
3864 uint32_t HW_FP;
3865
Chris Lattner5cc15e02010-03-03 19:03:45 +00003866 static const Builtin::Info BuiltinInfo[];
3867
Rafael Espindola101d5b92013-05-13 20:09:47 +00003868 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003869 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003870 if (T.getArch() == llvm::Triple::arm ||
3871 T.getArch() == llvm::Triple::armeb) {
3872 StringRef VersionStr;
3873 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003874 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003875 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003876 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003877 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003878 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003879 unsigned Version;
3880 if (VersionStr.getAsInteger(10, Version))
3881 return false;
3882 return Version >= 6;
3883 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003884 assert(T.getArch() == llvm::Triple::thumb ||
3885 T.getArch() == llvm::Triple::thumbeb);
3886 StringRef VersionStr;
3887 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003888 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003889 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003890 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003891 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003892 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003893 unsigned Version;
3894 if (VersionStr.getAsInteger(10, Version))
3895 return false;
3896 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003897 }
3898
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003899 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003900 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003901
3902 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003903 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003904
Renato Golin9ba39232015-02-27 16:35:48 +00003905 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
3906 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
3907 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003908 SizeType = UnsignedLong;
3909 else
3910 SizeType = UnsignedInt;
3911
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003912 switch (T.getOS()) {
3913 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003914 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003915 break;
3916 case llvm::Triple::Win32:
3917 WCharType = UnsignedShort;
3918 break;
3919 case llvm::Triple::Linux:
3920 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003921 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3922 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003923 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003924 }
3925
3926 UseBitFieldTypeAlignment = true;
3927
3928 ZeroLengthBitfieldBoundary = 0;
3929
Tim Northover147cd2f2014-10-14 22:12:21 +00003930 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3931 // so set preferred for small types to 32.
3932 if (T.isOSBinFormatMachO()) {
3933 DescriptionString =
3934 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3935 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3936 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00003937 assert(!BigEndian && "Windows on ARM does not support big endian");
3938 DescriptionString = "e"
David Majnemer8fa8c382015-03-17 23:55:00 +00003939 "-m:w"
Tim Northover147cd2f2014-10-14 22:12:21 +00003940 "-p:32:32"
3941 "-i64:64"
3942 "-v128:64:128"
3943 "-a:0:32"
3944 "-n32"
3945 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003946 } else if (T.isOSNaCl()) {
3947 assert(!BigEndian && "NaCl on ARM does not support big endian");
3948 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003949 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003950 DescriptionString =
3951 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3952 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003953 }
3954
3955 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003956 }
3957
3958 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003959 const llvm::Triple &T = getTriple();
3960
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003961 IsAAPCS = false;
3962
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003963 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003964
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003965 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003966 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003967 SizeType = UnsignedInt;
3968 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003969 SizeType = UnsignedLong;
3970
3971 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3972 WCharType = SignedInt;
3973
3974 // Do not respect the alignment of bit-field types when laying out
3975 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3976 UseBitFieldTypeAlignment = false;
3977
3978 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3979 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3980 /// gcc.
3981 ZeroLengthBitfieldBoundary = 32;
3982
Tim Northover147cd2f2014-10-14 22:12:21 +00003983 if (T.isOSBinFormatMachO())
3984 DescriptionString =
3985 BigEndian
3986 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3987 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3988 else
3989 DescriptionString =
3990 BigEndian
3991 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3992 : "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 +00003993
3994 // FIXME: Override "preferred align" for double and long long.
3995 }
3996
Chris Lattner17df24e2008-04-21 18:56:49 +00003997public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003998 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003999 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004000 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004001 BigEndian = IsBigEndian;
4002
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004003 switch (getTriple().getOS()) {
4004 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004005 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004006 break;
4007 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004008 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004009 break;
4010 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004011
Chris Lattner1a8f3942010-04-23 16:29:58 +00004012 // {} in inline assembly are neon specifiers, not assembly variant
4013 // specifiers.
4014 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004015
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004016 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00004017 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004018
Eric Christopher0e261882014-12-05 01:06:59 +00004019 // FIXME: This duplicates code from the driver that sets the -target-abi
4020 // option - this code is used if -target-abi isn't passed and should
4021 // be unified in some way.
4022 if (Triple.isOSBinFormatMachO()) {
4023 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4024 // the frontend matches that.
4025 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4026 Triple.getOS() == llvm::Triple::UnknownOS ||
4027 StringRef(CPU).startswith("cortex-m")) {
4028 setABI("aapcs");
4029 } else {
4030 setABI("apcs-gnu");
4031 }
4032 } else if (Triple.isOSWindows()) {
4033 // FIXME: this is invalid for WindowsCE
4034 setABI("aapcs");
4035 } else {
4036 // Select the default based on the platform.
4037 switch (Triple.getEnvironment()) {
4038 case llvm::Triple::Android:
4039 case llvm::Triple::GNUEABI:
4040 case llvm::Triple::GNUEABIHF:
4041 setABI("aapcs-linux");
4042 break;
4043 case llvm::Triple::EABIHF:
4044 case llvm::Triple::EABI:
4045 setABI("aapcs");
4046 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004047 case llvm::Triple::GNU:
4048 setABI("apcs-gnu");
4049 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004050 default:
4051 if (Triple.getOS() == llvm::Triple::NetBSD)
4052 setABI("apcs-gnu");
4053 else
4054 setABI("aapcs");
4055 break;
4056 }
4057 }
John McCall86353412010-08-21 22:46:04 +00004058
4059 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004060 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004061
4062 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004063 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00004064 if (shouldUseInlineAtomic(getTriple()))
4065 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00004066
4067 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004068 // the alignment of the zero-length bitfield is greater than the member
4069 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004070 // zero length bitfield.
4071 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004072 }
Alp Toker4925ba72014-06-07 23:30:42 +00004073 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00004074 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004075 ABI = Name;
4076
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004077 // The defaults (above) are for AAPCS, check if we need to change them.
4078 //
4079 // FIXME: We need support for -meabi... we could just mangle it into the
4080 // name.
4081 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004082 setABIAPCS();
4083 return true;
4084 }
4085 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4086 setABIAAPCS();
4087 return true;
4088 }
4089 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004090 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004091
Craig Topper3164f332014-03-11 03:39:26 +00004092 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004093 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004094 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4095 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004096 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004097 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004098 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004099 }
4100 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004101 Features["vfp4"] = true;
4102 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004103 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4104 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004105 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004106 Features["vfp4"] = true;
4107 Features["neon"] = true;
4108 Features["hwdiv"] = true;
4109 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004110 } else if (CPU == "cyclone") {
4111 Features["v8fp"] = true;
4112 Features["neon"] = true;
4113 Features["hwdiv"] = true;
4114 Features["hwdiv-arm"] = true;
Renato Golin84545d72015-02-04 13:31:56 +00004115 } else if (CPU == "cortex-a53" || CPU == "cortex-a57" || CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004116 Features["fp-armv8"] = true;
4117 Features["neon"] = true;
4118 Features["hwdiv"] = true;
4119 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004120 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004121 Features["crypto"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004122 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" ||
Silviu Barangae5690462013-10-21 10:59:33 +00004123 // Enable the hwdiv extension for all v8a AArch32 cores by
4124 // default.
4125 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004126 ArchName == "armebv8a" || ArchName == "armebv8" ||
4127 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4128 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00004129 Features["hwdiv"] = true;
4130 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004131 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
Javed Absar879d18b82015-04-09 14:12:10 +00004132 CPU == "sc300" || CPU == "cortex-r4" || CPU == "cortex-r4f") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004133 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004134 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004135 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004136
Craig Topper3164f332014-03-11 03:39:26 +00004137 bool handleTargetFeatures(std::vector<std::string> &Features,
4138 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004139 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004140 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004141 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004142 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004143 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004144
4145 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004146 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004147 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004148 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004149 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004150 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004151 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004152 HW_FP = HW_FP_SP | HW_FP_DP;
4153 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004154 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004155 HW_FP = HW_FP_SP | HW_FP_DP;
4156 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004157 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004158 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4159 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004160 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004161 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4162 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004163 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004164 HW_FP = HW_FP_SP | HW_FP_DP;
4165 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004166 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004167 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004168 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004169 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004170 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004171 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004172 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004173 } else if (Feature == "+fp-only-sp") {
4174 HW_FP &= ~HW_FP_DP;
4175 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004176 }
4177
Rafael Espindolaeb265472013-08-21 21:59:03 +00004178 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4179 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4180 return false;
4181 }
4182
4183 if (FPMath == FP_Neon)
4184 Features.push_back("+neonfp");
4185 else if (FPMath == FP_VFP)
4186 Features.push_back("-neonfp");
4187
Daniel Dunbar893d4752009-12-19 04:15:38 +00004188 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004189 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4190 for (const auto &FEFeature : FrontEndFeatures) {
4191 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4192 if (Feature != Features.end())
4193 Features.erase(Feature);
4194 }
4195
Rafael Espindolaeb265472013-08-21 21:59:03 +00004196 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004197 }
4198
Craig Topper3164f332014-03-11 03:39:26 +00004199 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004200 return llvm::StringSwitch<bool>(Feature)
4201 .Case("arm", true)
4202 .Case("softfloat", SoftFloat)
4203 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004204 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004205 .Case("hwdiv", HWDiv & HWDivThumb)
4206 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004207 .Default(false);
4208 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004209 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004210 static const char *getCPUDefineSuffix(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004211 return llvm::StringSwitch<const char *>(Name)
4212 .Cases("arm8", "arm810", "4")
4213 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4214 "4")
4215 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4216 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4217 .Case("ep9312", "4T")
4218 .Cases("arm10tdmi", "arm1020t", "5T")
4219 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4220 .Case("arm926ej-s", "5TEJ")
4221 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4222 .Cases("xscale", "iwmmxt", "5TE")
4223 .Case("arm1136j-s", "6J")
Renato Goline11531f2015-03-17 11:55:43 +00004224 .Case("arm1136jf-s", "6")
4225 .Cases("mpcorenovfp", "mpcore", "6K")
4226 .Cases("arm1176jz-s", "arm1176jzf-s", "6K")
Eric Christopher917e9522014-11-18 22:36:15 +00004227 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4228 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4229 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4230 "7A")
Javed Absar879d18b82015-04-09 14:12:10 +00004231 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "7R")
Eric Christopher917e9522014-11-18 22:36:15 +00004232 .Case("swift", "7S")
4233 .Case("cyclone", "8A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004234 .Cases("sc300", "cortex-m3", "7M")
Eric Christopher917e9522014-11-18 22:36:15 +00004235 .Cases("cortex-m4", "cortex-m7", "7EM")
Bradley Smithd86d6702015-02-18 10:34:48 +00004236 .Cases("sc000", "cortex-m0", "cortex-m0plus", "cortex-m1", "6M")
Renato Golin84545d72015-02-04 13:31:56 +00004237 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "8A")
Eric Christopher917e9522014-11-18 22:36:15 +00004238 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004239 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004240 static const char *getCPUProfile(StringRef Name) {
Eric Christopher917e9522014-11-18 22:36:15 +00004241 return llvm::StringSwitch<const char *>(Name)
4242 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4243 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4244 "A")
Renato Golin84545d72015-02-04 13:31:56 +00004245 .Cases("cortex-a53", "cortex-a57", "cortex-a72", "A")
Bradley Smithd86d6702015-02-18 10:34:48 +00004246 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m0plus", "M")
4247 .Cases("cortex-m1", "cortex-m7", "sc000", "sc300", "M")
Javed Absar879d18b82015-04-09 14:12:10 +00004248 .Cases("cortex-r4", "cortex-r4f", "cortex-r5", "cortex-r7", "R")
Eric Christopher917e9522014-11-18 22:36:15 +00004249 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004250 }
Craig Topper3164f332014-03-11 03:39:26 +00004251 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004252 if (!getCPUDefineSuffix(Name))
4253 return false;
4254
Tim Northovere8c37212014-07-09 09:24:43 +00004255 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4256 StringRef Profile = getCPUProfile(Name);
4257 if (Profile == "M" && MaxAtomicInlineWidth) {
4258 MaxAtomicPromoteWidth = 32;
4259 MaxAtomicInlineWidth = 32;
4260 }
4261
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004262 CPU = Name;
4263 return true;
4264 }
Craig Topper3164f332014-03-11 03:39:26 +00004265 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004266 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4267 unsigned CPUArchVer) const {
4268 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4269 (CPUArch.find('M') != StringRef::npos);
4270 }
4271 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4272 unsigned CPUArchVer) const {
4273 // We check both CPUArchVer and ArchName because when only triple is
4274 // specified, the default CPU is arm1136j-s.
4275 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4276 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4277 }
Craig Topper3164f332014-03-11 03:39:26 +00004278 void getTargetDefines(const LangOptions &Opts,
4279 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004280 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004281 Builder.defineMacro("__arm");
4282 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004283
Chris Lattnerecd49032009-03-02 22:27:17 +00004284 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004285 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004286
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004287 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004288 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004289 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004290 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004291 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004292
4293 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004294 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004295 StringRef ArchName = getTriple().getArchName();
4296
4297 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4298 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004299 if (CPUArch[0] >= '8') {
4300 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4301 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004302 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004303
4304 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4305 // is not defined for the M-profile.
4306 // NOTE that the deffault profile is assumed to be 'A'
4307 if (CPUProfile.empty() || CPUProfile != "M")
4308 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4309
4310 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4311 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4312 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4313 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4314 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4315 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4316 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4317
4318 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4319 // instruction set such as ARM or Thumb.
4320 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4321
4322 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4323
4324 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004325 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004326 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004327
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004328 // ACLE 6.5.1 Hardware Floating Point
4329 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004330 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004331
Yi Konga44c4d72014-06-27 21:25:42 +00004332 // ACLE predefines.
4333 Builder.defineMacro("__ARM_ACLE", "200");
4334
Mike Stump9d54bd72009-04-08 02:07:04 +00004335 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004336
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004337 // FIXME: It's more complicated than this and we don't really support
4338 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004339 // Windows on ARM does not "support" interworking
4340 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004341 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004342
David Tweed8f676532012-10-25 13:33:01 +00004343 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004344 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004345 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4346 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004347 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004348 Builder.defineMacro("__ARM_PCS", "1");
4349
David Tweed8f676532012-10-25 13:33:01 +00004350 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004351 Builder.defineMacro("__ARM_PCS_VFP", "1");
4352 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004353
Daniel Dunbar893d4752009-12-19 04:15:38 +00004354 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004355 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004356
4357 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004358 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004359
4360 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004361 Builder.defineMacro("__THUMBEL__");
4362 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004363 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004364 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004365 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004366 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4367 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004368
4369 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004370 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004371
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004372 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004373 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004374 if (FPU & VFP2FPU)
4375 Builder.defineMacro("__ARM_VFPV2__");
4376 if (FPU & VFP3FPU)
4377 Builder.defineMacro("__ARM_VFPV3__");
4378 if (FPU & VFP4FPU)
4379 Builder.defineMacro("__ARM_VFPV4__");
4380 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004381
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004382 // This only gets set when Neon instructions are actually available, unlike
4383 // the VFP define, hence the soft float and arch check. This is subtly
4384 // different from gcc, we follow the intent which was that it should be set
4385 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004386 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4387 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004388 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004389 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004390
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004391 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4392 Opts.ShortWChar ? "2" : "4");
4393
4394 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4395 Opts.ShortEnums ? "1" : "4");
4396
Bernard Ogden18b57012013-10-29 09:47:51 +00004397 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004398 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004399
Tim Northover02e38602014-02-03 17:28:04 +00004400 if (Crypto)
4401 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4402
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004403 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004404 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4405 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4406 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4407 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4408 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004409
4410 bool is5EOrAbove = (CPUArchVer >= 6 ||
4411 (CPUArchVer == 5 &&
4412 CPUArch.find('E') != StringRef::npos));
4413 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4414 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4415 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004416 }
Craig Topper3164f332014-03-11 03:39:26 +00004417 void getTargetBuiltins(const Builtin::Info *&Records,
4418 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004419 Records = BuiltinInfo;
4420 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004421 }
Craig Topper3164f332014-03-11 03:39:26 +00004422 bool isCLZForZeroUndef() const override { return false; }
4423 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004424 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004425 }
Craig Topper3164f332014-03-11 03:39:26 +00004426 void getGCCRegNames(const char * const *&Names,
4427 unsigned &NumNames) const override;
4428 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4429 unsigned &NumAliases) const override;
4430 bool validateAsmConstraint(const char *&Name,
4431 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004432 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004433 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004434 case 'l': // r0-r7
4435 case 'h': // r8-r15
4436 case 'w': // VFP Floating point register single precision
4437 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004438 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004439 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004440 case 'I':
4441 case 'J':
4442 case 'K':
4443 case 'L':
4444 case 'M':
4445 // FIXME
4446 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004447 case 'Q': // A memory address that is a single base register.
4448 Info.setAllowsMemory();
4449 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004450 case 'U': // a memory reference...
4451 switch (Name[1]) {
4452 case 'q': // ...ARMV4 ldrsb
4453 case 'v': // ...VFP load/store (reg+constant offset)
4454 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004455 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004456 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004457 case 'n': // valid address for Neon doubleword vector load/store
4458 case 'm': // valid address for Neon element and structure load/store
4459 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004460 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004461 Info.setAllowsMemory();
4462 Name++;
4463 return true;
4464 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004465 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004466 return false;
4467 }
Craig Topper3164f332014-03-11 03:39:26 +00004468 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004469 std::string R;
4470 switch (*Constraint) {
4471 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004472 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004473 Constraint++;
4474 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004475 case 'p': // 'p' should be translated to 'r' by default.
4476 R = std::string("r");
4477 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004478 default:
4479 return std::string(1, *Constraint);
4480 }
4481 return R;
4482 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004483 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004484 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004485 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004486 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004487 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004488
Bill Wendling9d1ee112012-10-25 23:28:48 +00004489 // Strip off constraint modifiers.
4490 while (Constraint[0] == '=' ||
4491 Constraint[0] == '+' ||
4492 Constraint[0] == '&')
4493 Constraint = Constraint.substr(1);
4494
4495 switch (Constraint[0]) {
4496 default: break;
4497 case 'r': {
4498 switch (Modifier) {
4499 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004500 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004501 case 'q':
4502 // A register of size 32 cannot fit a vector type.
4503 return false;
4504 }
4505 }
4506 }
4507
4508 return true;
4509 }
Craig Topper3164f332014-03-11 03:39:26 +00004510 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004511 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004512 return "";
4513 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004514
Craig Topper3164f332014-03-11 03:39:26 +00004515 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004516 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4517 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004518
Craig Topper3164f332014-03-11 03:39:26 +00004519 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004520 if (RegNo == 0) return 0;
4521 if (RegNo == 1) return 1;
4522 return -1;
4523 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004524};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004525
Rafael Espindolaeb265472013-08-21 21:59:03 +00004526bool ARMTargetInfo::setFPMath(StringRef Name) {
4527 if (Name == "neon") {
4528 FPMath = FP_Neon;
4529 return true;
4530 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4531 Name == "vfp4") {
4532 FPMath = FP_VFP;
4533 return true;
4534 }
4535 return false;
4536}
4537
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004538const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004539 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004540 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004541 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4542
4543 // Float registers
4544 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4545 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4546 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004547 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004548
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004549 // Double registers
4550 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4551 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004552 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4553 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004554
4555 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004556 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4557 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004558};
4559
4560void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004561 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004562 Names = GCCRegNames;
4563 NumNames = llvm::array_lengthof(GCCRegNames);
4564}
4565
4566const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004567 { { "a1" }, "r0" },
4568 { { "a2" }, "r1" },
4569 { { "a3" }, "r2" },
4570 { { "a4" }, "r3" },
4571 { { "v1" }, "r4" },
4572 { { "v2" }, "r5" },
4573 { { "v3" }, "r6" },
4574 { { "v4" }, "r7" },
4575 { { "v5" }, "r8" },
4576 { { "v6", "rfp" }, "r9" },
4577 { { "sl" }, "r10" },
4578 { { "fp" }, "r11" },
4579 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004580 { { "r13" }, "sp" },
4581 { { "r14" }, "lr" },
4582 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004583 // The S, D and Q registers overlap, but aren't really aliases; we
4584 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004585};
4586
4587void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4588 unsigned &NumAliases) const {
4589 Aliases = GCCRegAliases;
4590 NumAliases = llvm::array_lengthof(GCCRegAliases);
4591}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004592
4593const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004594#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004595#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004596 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004597#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004598
4599#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004600#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004601#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4602 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004603#include "clang/Basic/BuiltinsARM.def"
4604};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004605
4606class ARMleTargetInfo : public ARMTargetInfo {
4607public:
4608 ARMleTargetInfo(const llvm::Triple &Triple)
4609 : ARMTargetInfo(Triple, false) { }
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("__ARMEL__");
4613 ARMTargetInfo::getTargetDefines(Opts, Builder);
4614 }
4615};
4616
4617class ARMbeTargetInfo : public ARMTargetInfo {
4618public:
4619 ARMbeTargetInfo(const llvm::Triple &Triple)
4620 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004621 void getTargetDefines(const LangOptions &Opts,
4622 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004623 Builder.defineMacro("__ARMEB__");
4624 Builder.defineMacro("__ARM_BIG_ENDIAN");
4625 ARMTargetInfo::getTargetDefines(Opts, Builder);
4626 }
4627};
Chris Lattner17df24e2008-04-21 18:56:49 +00004628
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004629class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4630 const llvm::Triple Triple;
4631public:
4632 WindowsARMTargetInfo(const llvm::Triple &Triple)
4633 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4634 TLSSupported = false;
4635 WCharType = UnsignedShort;
4636 SizeType = UnsignedInt;
4637 UserLabelPrefix = "";
4638 }
4639 void getVisualStudioDefines(const LangOptions &Opts,
4640 MacroBuilder &Builder) const {
4641 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4642
4643 // FIXME: this is invalid for WindowsCE
4644 Builder.defineMacro("_M_ARM_NT", "1");
4645 Builder.defineMacro("_M_ARMT", "_M_ARM");
4646 Builder.defineMacro("_M_THUMB", "_M_ARM");
4647
4648 assert((Triple.getArch() == llvm::Triple::arm ||
4649 Triple.getArch() == llvm::Triple::thumb) &&
4650 "invalid architecture for Windows ARM target info");
4651 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4652 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4653
4654 // TODO map the complete set of values
4655 // 31: VFPv3 40: VFPv4
4656 Builder.defineMacro("_M_ARM_FP", "31");
4657 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004658 BuiltinVaListKind getBuiltinVaListKind() const override {
4659 return TargetInfo::CharPtrBuiltinVaList;
4660 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004661};
4662
4663// Windows ARM + Itanium C++ ABI Target
4664class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4665public:
4666 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4667 : WindowsARMTargetInfo(Triple) {
4668 TheCXXABI.set(TargetCXXABI::GenericARM);
4669 }
4670
4671 void getTargetDefines(const LangOptions &Opts,
4672 MacroBuilder &Builder) const override {
4673 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4674
4675 if (Opts.MSVCCompat)
4676 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4677 }
4678};
4679
4680// Windows ARM, MS (C++) ABI
4681class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4682public:
4683 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4684 : WindowsARMTargetInfo(Triple) {
4685 TheCXXABI.set(TargetCXXABI::Microsoft);
4686 }
4687
4688 void getTargetDefines(const LangOptions &Opts,
4689 MacroBuilder &Builder) const override {
4690 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4691 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4692 }
4693};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004694
Mike Stump11289f42009-09-09 15:08:12 +00004695class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004696 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004697protected:
Craig Topper3164f332014-03-11 03:39:26 +00004698 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4699 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004700 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004701 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004702
Torok Edwinb2b37c62009-06-30 17:10:35 +00004703public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004704 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004705 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004706 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004707 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004708 // FIXME: This should be based off of the target features in
4709 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004710 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004711
4712 // Darwin on iOS uses a variant of the ARM C++ ABI.
4713 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004714 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004715};
Eli Friedmanf05b7722008-08-20 07:44:10 +00004716
Tim Northover573cbee2014-05-24 12:52:07 +00004717class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004718 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004719 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4720 static const char *const GCCRegNames[];
4721
James Molloy75f5f9e2014-04-16 15:33:48 +00004722 enum FPUModeEnum {
4723 FPUMode,
4724 NeonMode
4725 };
4726
4727 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004728 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004729 unsigned Crypto;
4730
Tim Northovera2ee4332014-03-29 15:09:45 +00004731 static const Builtin::Info BuiltinInfo[];
4732
4733 std::string ABI;
4734
4735public:
Tim Northover573cbee2014-05-24 12:52:07 +00004736 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004737 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004738
4739 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4740 WCharType = SignedInt;
4741
4742 // NetBSD apparently prefers consistency across ARM targets to consistency
4743 // across 64-bit targets.
4744 Int64Type = SignedLongLong;
4745 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004746 } else {
4747 WCharType = UnsignedInt;
4748 Int64Type = SignedLong;
4749 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004750 }
4751
Tim Northovera2ee4332014-03-29 15:09:45 +00004752 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004753 MaxVectorAlign = 128;
4754 RegParmMax = 8;
4755 MaxAtomicInlineWidth = 128;
4756 MaxAtomicPromoteWidth = 128;
4757
Tim Northovera6a19f12015-02-06 01:25:07 +00004758 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00004759 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4760
Tim Northovera2ee4332014-03-29 15:09:45 +00004761 // {} in inline assembly are neon specifiers, not assembly variant
4762 // specifiers.
4763 NoAsmVariants = true;
4764
Tim Northover7ad87af2015-01-16 18:44:04 +00004765 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4766 // contributes to the alignment of the containing aggregate in the same way
4767 // a plain (non bit-field) member of that type would, without exception for
4768 // zero-sized or anonymous bit-fields."
4769 UseBitFieldTypeAlignment = true;
4770 UseZeroLengthBitfieldAlignment = true;
4771
Tim Northover573cbee2014-05-24 12:52:07 +00004772 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004773 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4774 }
4775
Alp Toker4925ba72014-06-07 23:30:42 +00004776 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004777 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004778 if (Name != "aapcs" && Name != "darwinpcs")
4779 return false;
4780
4781 ABI = Name;
4782 return true;
4783 }
4784
David Blaikie1cbb9712014-11-14 19:09:44 +00004785 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004786 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004787 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004788 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004789 .Case("cyclone", true)
4790 .Default(false);
4791 return CPUKnown;
4792 }
4793
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004794 void getTargetDefines(const LangOptions &Opts,
4795 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004796 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004797 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004798
4799 // Target properties.
4800 Builder.defineMacro("_LP64");
4801 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004802
4803 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4804 Builder.defineMacro("__ARM_ACLE", "200");
4805 Builder.defineMacro("__ARM_ARCH", "8");
4806 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4807
4808 Builder.defineMacro("__ARM_64BIT_STATE");
4809 Builder.defineMacro("__ARM_PCS_AAPCS64");
4810 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4811
4812 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4813 Builder.defineMacro("__ARM_FEATURE_CLZ");
4814 Builder.defineMacro("__ARM_FEATURE_FMA");
4815 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004816 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4817 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4818 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4819 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004820
4821 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4822
4823 // 0xe implies support for half, single and double precision operations.
4824 Builder.defineMacro("__ARM_FP", "0xe");
4825
4826 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4827 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4828 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4829
4830 if (Opts.FastMath || Opts.FiniteMathOnly)
4831 Builder.defineMacro("__ARM_FP_FAST");
4832
Richard Smithab506ad2014-10-20 23:26:58 +00004833 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004834 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4835
4836 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4837
4838 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4839 Opts.ShortEnums ? "1" : "4");
4840
James Molloy75f5f9e2014-04-16 15:33:48 +00004841 if (FPU == NeonMode) {
4842 Builder.defineMacro("__ARM_NEON");
4843 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004844 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004845 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004846
Bradley Smith418c5932014-05-02 15:17:51 +00004847 if (CRC)
4848 Builder.defineMacro("__ARM_FEATURE_CRC32");
4849
James Molloy75f5f9e2014-04-16 15:33:48 +00004850 if (Crypto)
4851 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004852 }
4853
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004854 void getTargetBuiltins(const Builtin::Info *&Records,
4855 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004856 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004857 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004858 }
4859
David Blaikie1cbb9712014-11-14 19:09:44 +00004860 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004861 return Feature == "aarch64" ||
4862 Feature == "arm64" ||
4863 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004864 }
4865
James Molloy5e73df52014-04-16 15:06:20 +00004866 bool handleTargetFeatures(std::vector<std::string> &Features,
4867 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004868 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004869 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004870 Crypto = 0;
4871 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4872 if (Features[i] == "+neon")
4873 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004874 if (Features[i] == "+crc")
4875 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004876 if (Features[i] == "+crypto")
4877 Crypto = 1;
4878 }
4879
James Molloy5e73df52014-04-16 15:06:20 +00004880 setDescriptionString();
4881
4882 return true;
4883 }
4884
David Blaikie1cbb9712014-11-14 19:09:44 +00004885 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004886
David Blaikie1cbb9712014-11-14 19:09:44 +00004887 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004888 return TargetInfo::AArch64ABIBuiltinVaList;
4889 }
4890
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004891 void getGCCRegNames(const char *const *&Names,
4892 unsigned &NumNames) const override;
4893 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4894 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004895
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004896 bool validateAsmConstraint(const char *&Name,
4897 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004898 switch (*Name) {
4899 default:
4900 return false;
4901 case 'w': // Floating point and SIMD registers (V0-V31)
4902 Info.setAllowsRegister();
4903 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004904 case 'I': // Constant that can be used with an ADD instruction
4905 case 'J': // Constant that can be used with a SUB instruction
4906 case 'K': // Constant that can be used with a 32-bit logical instruction
4907 case 'L': // Constant that can be used with a 64-bit logical instruction
4908 case 'M': // Constant that can be used as a 32-bit MOV immediate
4909 case 'N': // Constant that can be used as a 64-bit MOV immediate
4910 case 'Y': // Floating point constant zero
4911 case 'Z': // Integer constant zero
4912 return true;
4913 case 'Q': // A memory reference with base register and no offset
4914 Info.setAllowsMemory();
4915 return true;
4916 case 'S': // A symbolic address
4917 Info.setAllowsRegister();
4918 return true;
4919 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00004920 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4921 // Utf: A memory address suitable for ldp/stp in TF mode.
4922 // Usa: An absolute symbolic address.
4923 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4924 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00004925 case 'z': // Zero register, wzr or xzr
4926 Info.setAllowsRegister();
4927 return true;
4928 case 'x': // Floating point and SIMD registers (V0-V15)
4929 Info.setAllowsRegister();
4930 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004931 }
4932 return false;
4933 }
4934
Akira Hatanaka987f1862014-08-22 06:05:21 +00004935 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004936 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004937 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004938 // Strip off constraint modifiers.
4939 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4940 Constraint = Constraint.substr(1);
4941
4942 switch (Constraint[0]) {
4943 default:
4944 return true;
4945 case 'z':
4946 case 'r': {
4947 switch (Modifier) {
4948 case 'x':
4949 case 'w':
4950 // For now assume that the person knows what they're
4951 // doing with the modifier.
4952 return true;
4953 default:
4954 // By default an 'r' constraint will be in the 'x'
4955 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004956 if (Size == 64)
4957 return true;
4958
4959 SuggestedModifier = "w";
4960 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004961 }
4962 }
4963 }
4964 }
4965
David Blaikie1cbb9712014-11-14 19:09:44 +00004966 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004967
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004968 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004969 if (RegNo == 0)
4970 return 0;
4971 if (RegNo == 1)
4972 return 1;
4973 return -1;
4974 }
4975};
4976
Tim Northover573cbee2014-05-24 12:52:07 +00004977const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004978 // 32-bit Integer registers
4979 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4980 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4981 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4982
4983 // 64-bit Integer registers
4984 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4985 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4986 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4987
4988 // 32-bit floating point regsisters
4989 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4990 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4991 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4992
4993 // 64-bit floating point regsisters
4994 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4995 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4996 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4997
4998 // Vector registers
4999 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5000 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5001 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5002};
5003
Tim Northover573cbee2014-05-24 12:52:07 +00005004void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005005 unsigned &NumNames) const {
5006 Names = GCCRegNames;
5007 NumNames = llvm::array_lengthof(GCCRegNames);
5008}
5009
Tim Northover573cbee2014-05-24 12:52:07 +00005010const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005011 { { "w31" }, "wsp" },
5012 { { "x29" }, "fp" },
5013 { { "x30" }, "lr" },
5014 { { "x31" }, "sp" },
5015 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5016 // don't want to substitute one of these for a different-sized one.
5017};
5018
Tim Northover573cbee2014-05-24 12:52:07 +00005019void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005020 unsigned &NumAliases) const {
5021 Aliases = GCCRegAliases;
5022 NumAliases = llvm::array_lengthof(GCCRegAliases);
5023}
5024
Tim Northover573cbee2014-05-24 12:52:07 +00005025const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005026#define BUILTIN(ID, TYPE, ATTRS) \
5027 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5028#include "clang/Basic/BuiltinsNEON.def"
5029
5030#define BUILTIN(ID, TYPE, ATTRS) \
5031 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00005032#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005033};
James Molloy5e73df52014-04-16 15:06:20 +00005034
Tim Northover573cbee2014-05-24 12:52:07 +00005035class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005036 void setDescriptionString() override {
5037 if (getTriple().isOSBinFormatMachO())
5038 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
5039 else
5040 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
5041 }
5042
5043public:
Tim Northover573cbee2014-05-24 12:52:07 +00005044 AArch64leTargetInfo(const llvm::Triple &Triple)
5045 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005046 BigEndian = false;
5047 }
5048 void getTargetDefines(const LangOptions &Opts,
5049 MacroBuilder &Builder) const override {
5050 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005051 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005052 }
5053};
5054
Tim Northover573cbee2014-05-24 12:52:07 +00005055class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005056 void setDescriptionString() override {
5057 assert(!getTriple().isOSBinFormatMachO());
5058 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
5059 }
5060
5061public:
Tim Northover573cbee2014-05-24 12:52:07 +00005062 AArch64beTargetInfo(const llvm::Triple &Triple)
5063 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005064 void getTargetDefines(const LangOptions &Opts,
5065 MacroBuilder &Builder) const override {
5066 Builder.defineMacro("__AARCH64EB__");
5067 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5068 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005069 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005070 }
5071};
Tim Northovera2ee4332014-03-29 15:09:45 +00005072
Tim Northover573cbee2014-05-24 12:52:07 +00005073class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005074protected:
5075 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5076 MacroBuilder &Builder) const override {
5077 Builder.defineMacro("__AARCH64_SIMD__");
5078 Builder.defineMacro("__ARM64_ARCH_8__");
5079 Builder.defineMacro("__ARM_NEON__");
5080 Builder.defineMacro("__LITTLE_ENDIAN__");
5081 Builder.defineMacro("__REGISTER_PREFIX__", "");
5082 Builder.defineMacro("__arm64", "1");
5083 Builder.defineMacro("__arm64__", "1");
5084
5085 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5086 }
5087
Tim Northovera2ee4332014-03-29 15:09:45 +00005088public:
Tim Northover573cbee2014-05-24 12:52:07 +00005089 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5090 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005091 Int64Type = SignedLongLong;
5092 WCharType = SignedInt;
5093 UseSignedCharForObjCBool = false;
5094
Tim Northovera6a19f12015-02-06 01:25:07 +00005095 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005096 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5097
5098 TheCXXABI.set(TargetCXXABI::iOS64);
5099 }
5100
David Blaikie1cbb9712014-11-14 19:09:44 +00005101 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005102 return TargetInfo::CharPtrBuiltinVaList;
5103 }
5104};
Tim Northovera2ee4332014-03-29 15:09:45 +00005105
Tony Linthicum76329bf2011-12-12 21:14:55 +00005106// Hexagon abstract base class
5107class HexagonTargetInfo : public TargetInfo {
5108 static const Builtin::Info BuiltinInfo[];
5109 static const char * const GCCRegNames[];
5110 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5111 std::string CPU;
5112public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005113 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005114 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005115 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005116
5117 // {} in inline assembly are packet specifiers, not assembly variant
5118 // specifiers.
5119 NoAsmVariants = true;
5120 }
5121
Craig Topper3164f332014-03-11 03:39:26 +00005122 void getTargetBuiltins(const Builtin::Info *&Records,
5123 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005124 Records = BuiltinInfo;
5125 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5126 }
5127
Craig Topper3164f332014-03-11 03:39:26 +00005128 bool validateAsmConstraint(const char *&Name,
5129 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005130 return true;
5131 }
5132
Craig Topper3164f332014-03-11 03:39:26 +00005133 void getTargetDefines(const LangOptions &Opts,
5134 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005135
Craig Topper3164f332014-03-11 03:39:26 +00005136 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005137 return Feature == "hexagon";
5138 }
Craig Topper3164f332014-03-11 03:39:26 +00005139
5140 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005141 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005142 }
Craig Topper3164f332014-03-11 03:39:26 +00005143 void getGCCRegNames(const char * const *&Names,
5144 unsigned &NumNames) const override;
5145 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5146 unsigned &NumAliases) const override;
5147 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005148 return "";
5149 }
Sebastian Pop86500282012-01-13 20:37:10 +00005150
5151 static const char *getHexagonCPUSuffix(StringRef Name) {
5152 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005153 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005154 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005155 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005156 }
5157
Craig Topper3164f332014-03-11 03:39:26 +00005158 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005159 if (!getHexagonCPUSuffix(Name))
5160 return false;
5161
Tony Linthicum76329bf2011-12-12 21:14:55 +00005162 CPU = Name;
5163 return true;
5164 }
5165};
5166
5167void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5168 MacroBuilder &Builder) const {
5169 Builder.defineMacro("qdsp6");
5170 Builder.defineMacro("__qdsp6", "1");
5171 Builder.defineMacro("__qdsp6__", "1");
5172
5173 Builder.defineMacro("hexagon");
5174 Builder.defineMacro("__hexagon", "1");
5175 Builder.defineMacro("__hexagon__", "1");
5176
5177 if(CPU == "hexagonv1") {
5178 Builder.defineMacro("__HEXAGON_V1__");
5179 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5180 if(Opts.HexagonQdsp6Compat) {
5181 Builder.defineMacro("__QDSP6_V1__");
5182 Builder.defineMacro("__QDSP6_ARCH__", "1");
5183 }
5184 }
5185 else if(CPU == "hexagonv2") {
5186 Builder.defineMacro("__HEXAGON_V2__");
5187 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5188 if(Opts.HexagonQdsp6Compat) {
5189 Builder.defineMacro("__QDSP6_V2__");
5190 Builder.defineMacro("__QDSP6_ARCH__", "2");
5191 }
5192 }
5193 else if(CPU == "hexagonv3") {
5194 Builder.defineMacro("__HEXAGON_V3__");
5195 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5196 if(Opts.HexagonQdsp6Compat) {
5197 Builder.defineMacro("__QDSP6_V3__");
5198 Builder.defineMacro("__QDSP6_ARCH__", "3");
5199 }
5200 }
5201 else if(CPU == "hexagonv4") {
5202 Builder.defineMacro("__HEXAGON_V4__");
5203 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5204 if(Opts.HexagonQdsp6Compat) {
5205 Builder.defineMacro("__QDSP6_V4__");
5206 Builder.defineMacro("__QDSP6_ARCH__", "4");
5207 }
5208 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005209 else if(CPU == "hexagonv5") {
5210 Builder.defineMacro("__HEXAGON_V5__");
5211 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5212 if(Opts.HexagonQdsp6Compat) {
5213 Builder.defineMacro("__QDSP6_V5__");
5214 Builder.defineMacro("__QDSP6_ARCH__", "5");
5215 }
5216 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005217}
5218
5219const char * const HexagonTargetInfo::GCCRegNames[] = {
5220 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5221 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5222 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5223 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5224 "p0", "p1", "p2", "p3",
5225 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5226};
5227
5228void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5229 unsigned &NumNames) const {
5230 Names = GCCRegNames;
5231 NumNames = llvm::array_lengthof(GCCRegNames);
5232}
5233
5234
5235const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5236 { { "sp" }, "r29" },
5237 { { "fp" }, "r30" },
5238 { { "lr" }, "r31" },
5239 };
5240
5241void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5242 unsigned &NumAliases) const {
5243 Aliases = GCCRegAliases;
5244 NumAliases = llvm::array_lengthof(GCCRegAliases);
5245}
5246
5247
5248const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5249#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5250#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5251 ALL_LANGUAGES },
5252#include "clang/Basic/BuiltinsHexagon.def"
5253};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005254
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005255// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5256class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005257 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5258 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005259 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005260public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005261 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005262
Craig Topper3164f332014-03-11 03:39:26 +00005263 bool handleTargetFeatures(std::vector<std::string> &Features,
5264 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005265 SoftFloat = false;
5266 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5267 if (Features[i] == "+soft-float")
5268 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005269 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005270 }
Craig Topper3164f332014-03-11 03:39:26 +00005271 void getTargetDefines(const LangOptions &Opts,
5272 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005273 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005274 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005275
5276 if (SoftFloat)
5277 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005278 }
Craig Topper3164f332014-03-11 03:39:26 +00005279
5280 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005281 return llvm::StringSwitch<bool>(Feature)
5282 .Case("softfloat", SoftFloat)
5283 .Case("sparc", true)
5284 .Default(false);
5285 }
Craig Topper3164f332014-03-11 03:39:26 +00005286
5287 void getTargetBuiltins(const Builtin::Info *&Records,
5288 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005289 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005290 }
Craig Topper3164f332014-03-11 03:39:26 +00005291 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005292 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005293 }
Craig Topper3164f332014-03-11 03:39:26 +00005294 void getGCCRegNames(const char * const *&Names,
5295 unsigned &NumNames) const override;
5296 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5297 unsigned &NumAliases) const override;
5298 bool validateAsmConstraint(const char *&Name,
5299 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005300 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005301 switch (*Name) {
5302 case 'I': // Signed 13-bit constant
5303 case 'J': // Zero
5304 case 'K': // 32-bit constant with the low 12 bits clear
5305 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5306 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5307 case 'N': // Same as 'K' but zext (required for SIMode)
5308 case 'O': // The constant 4096
5309 return true;
5310 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005311 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005312 }
Craig Topper3164f332014-03-11 03:39:26 +00005313 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005314 // FIXME: Implement!
5315 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005316 }
5317};
5318
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005319const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005320 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5321 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5322 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5323 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5324};
5325
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005326void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5327 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005328 Names = GCCRegNames;
5329 NumNames = llvm::array_lengthof(GCCRegNames);
5330}
5331
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005332const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005333 { { "g0" }, "r0" },
5334 { { "g1" }, "r1" },
5335 { { "g2" }, "r2" },
5336 { { "g3" }, "r3" },
5337 { { "g4" }, "r4" },
5338 { { "g5" }, "r5" },
5339 { { "g6" }, "r6" },
5340 { { "g7" }, "r7" },
5341 { { "o0" }, "r8" },
5342 { { "o1" }, "r9" },
5343 { { "o2" }, "r10" },
5344 { { "o3" }, "r11" },
5345 { { "o4" }, "r12" },
5346 { { "o5" }, "r13" },
5347 { { "o6", "sp" }, "r14" },
5348 { { "o7" }, "r15" },
5349 { { "l0" }, "r16" },
5350 { { "l1" }, "r17" },
5351 { { "l2" }, "r18" },
5352 { { "l3" }, "r19" },
5353 { { "l4" }, "r20" },
5354 { { "l5" }, "r21" },
5355 { { "l6" }, "r22" },
5356 { { "l7" }, "r23" },
5357 { { "i0" }, "r24" },
5358 { { "i1" }, "r25" },
5359 { { "i2" }, "r26" },
5360 { { "i3" }, "r27" },
5361 { { "i4" }, "r28" },
5362 { { "i5" }, "r29" },
5363 { { "i6", "fp" }, "r30" },
5364 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005365};
5366
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005367void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5368 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005369 Aliases = GCCRegAliases;
5370 NumAliases = llvm::array_lengthof(GCCRegAliases);
5371}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005372
5373// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5374class SparcV8TargetInfo : public SparcTargetInfo {
5375public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005376 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005377 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005378 }
5379
Craig Topper3164f332014-03-11 03:39:26 +00005380 void getTargetDefines(const LangOptions &Opts,
5381 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005382 SparcTargetInfo::getTargetDefines(Opts, Builder);
5383 Builder.defineMacro("__sparcv8");
5384 }
5385};
5386
5387// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5388class SparcV9TargetInfo : public SparcTargetInfo {
5389public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005390 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005391 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005392 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005393 // This is an LP64 platform.
5394 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005395
5396 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005397 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005398 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005399 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005400 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005401 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005402
5403 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5404 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5405 LongDoubleWidth = 128;
5406 LongDoubleAlign = 128;
5407 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005408 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005409 }
5410
Craig Topper3164f332014-03-11 03:39:26 +00005411 void getTargetDefines(const LangOptions &Opts,
5412 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005413 SparcTargetInfo::getTargetDefines(Opts, Builder);
5414 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005415 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005416 // Solaris doesn't need these variants, but the BSDs do.
5417 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005418 Builder.defineMacro("__sparc64__");
5419 Builder.defineMacro("__sparc_v9__");
5420 Builder.defineMacro("__sparcv9__");
5421 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005422 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005423
Craig Topper3164f332014-03-11 03:39:26 +00005424 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005425 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5426 .Case("v9", true)
5427 .Case("ultrasparc", true)
5428 .Case("ultrasparc3", true)
5429 .Case("niagara", true)
5430 .Case("niagara2", true)
5431 .Case("niagara3", true)
5432 .Case("niagara4", true)
5433 .Default(false);
5434
5435 // No need to store the CPU yet. There aren't any CPU-specific
5436 // macros to define.
5437 return CPUKnown;
5438 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005439};
5440
Torok Edwinb2b37c62009-06-30 17:10:35 +00005441class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005442public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005443 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5444 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005445 SizeType = UnsignedInt;
5446 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005447 }
5448};
Chris Lattner5ba61f02006-10-14 07:39:34 +00005449
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005450class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005451 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005452 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005453 std::string CPU;
5454 bool HasTransactionalExecution;
Ulrich Weigand47445072013-05-06 16:26:41 +00005455
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005456public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005457 SystemZTargetInfo(const llvm::Triple &Triple)
5458 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005459 IntMaxType = SignedLong;
5460 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005461 TLSSupported = true;
5462 IntWidth = IntAlign = 32;
5463 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5464 PointerWidth = PointerAlign = 64;
5465 LongDoubleWidth = 128;
5466 LongDoubleAlign = 64;
5467 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5468 MinGlobalAlign = 16;
5469 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5470 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5471 }
5472 void getTargetDefines(const LangOptions &Opts,
5473 MacroBuilder &Builder) const override {
5474 Builder.defineMacro("__s390__");
5475 Builder.defineMacro("__s390x__");
5476 Builder.defineMacro("__zarch__");
5477 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005478 if (HasTransactionalExecution)
5479 Builder.defineMacro("__HTM__");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005480 }
5481 void getTargetBuiltins(const Builtin::Info *&Records,
5482 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005483 Records = BuiltinInfo;
5484 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005485 }
5486
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005487 void getGCCRegNames(const char *const *&Names,
5488 unsigned &NumNames) const override;
5489 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5490 unsigned &NumAliases) const override {
5491 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005492 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005493 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005494 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005495 bool validateAsmConstraint(const char *&Name,
5496 TargetInfo::ConstraintInfo &info) const override;
5497 const char *getClobbers() const override {
5498 // FIXME: Is this really right?
5499 return "";
5500 }
5501 BuiltinVaListKind getBuiltinVaListKind() const override {
5502 return TargetInfo::SystemZBuiltinVaList;
5503 }
5504 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005505 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005506 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5507 .Case("z10", true)
5508 .Case("z196", true)
5509 .Case("zEC12", true)
5510 .Default(false);
5511
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005512 return CPUKnown;
5513 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005514 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5515 if (CPU == "zEC12")
5516 Features["transactional-execution"] = true;
5517 }
5518
5519 bool handleTargetFeatures(std::vector<std::string> &Features,
5520 DiagnosticsEngine &Diags) override {
5521 HasTransactionalExecution = false;
5522 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5523 if (Features[i] == "+transactional-execution")
5524 HasTransactionalExecution = true;
5525 }
5526 return true;
5527 }
5528
5529 bool hasFeature(StringRef Feature) const override {
5530 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005531 .Case("systemz", true)
5532 .Case("htm", HasTransactionalExecution)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005533 .Default(false);
5534 }
5535};
5536
5537const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5538#define BUILTIN(ID, TYPE, ATTRS) \
5539 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5540#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005541};
5542
5543const char *const SystemZTargetInfo::GCCRegNames[] = {
5544 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5545 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5546 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5547 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5548};
5549
5550void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5551 unsigned &NumNames) const {
5552 Names = GCCRegNames;
5553 NumNames = llvm::array_lengthof(GCCRegNames);
5554}
5555
5556bool SystemZTargetInfo::
5557validateAsmConstraint(const char *&Name,
5558 TargetInfo::ConstraintInfo &Info) const {
5559 switch (*Name) {
5560 default:
5561 return false;
5562
5563 case 'a': // Address register
5564 case 'd': // Data register (equivalent to 'r')
5565 case 'f': // Floating-point register
5566 Info.setAllowsRegister();
5567 return true;
5568
5569 case 'I': // Unsigned 8-bit constant
5570 case 'J': // Unsigned 12-bit constant
5571 case 'K': // Signed 16-bit constant
5572 case 'L': // Signed 20-bit displacement (on all targets we support)
5573 case 'M': // 0x7fffffff
5574 return true;
5575
5576 case 'Q': // Memory with base and unsigned 12-bit displacement
5577 case 'R': // Likewise, plus an index
5578 case 'S': // Memory with base and signed 20-bit displacement
5579 case 'T': // Likewise, plus an index
5580 Info.setAllowsMemory();
5581 return true;
5582 }
5583}
Ulrich Weigand47445072013-05-06 16:26:41 +00005584
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005585 class MSP430TargetInfo : public TargetInfo {
5586 static const char * const GCCRegNames[];
5587 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005588 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005589 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005590 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005591 IntWidth = 16; IntAlign = 16;
5592 LongWidth = 32; LongLongWidth = 64;
5593 LongAlign = LongLongAlign = 16;
5594 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005595 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005596 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005597 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005598 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005599 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005600 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005601 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005602 }
5603 void getTargetDefines(const LangOptions &Opts,
5604 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005605 Builder.defineMacro("MSP430");
5606 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005607 // FIXME: defines for different 'flavours' of MCU
5608 }
Craig Topper3164f332014-03-11 03:39:26 +00005609 void getTargetBuiltins(const Builtin::Info *&Records,
5610 unsigned &NumRecords) const override {
5611 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005612 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005613 NumRecords = 0;
5614 }
Craig Topper3164f332014-03-11 03:39:26 +00005615 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005616 return Feature == "msp430";
5617 }
Craig Topper3164f332014-03-11 03:39:26 +00005618 void getGCCRegNames(const char * const *&Names,
5619 unsigned &NumNames) const override;
5620 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5621 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005622 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005623 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005624 NumAliases = 0;
5625 }
Eric Christopher917e9522014-11-18 22:36:15 +00005626 bool
5627 validateAsmConstraint(const char *&Name,
5628 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005629 // FIXME: implement
5630 switch (*Name) {
5631 case 'K': // the constant 1
5632 case 'L': // constant -1^20 .. 1^19
5633 case 'M': // constant 1-4:
5634 return true;
5635 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005636 // No target constraints for now.
5637 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005638 }
Craig Topper3164f332014-03-11 03:39:26 +00005639 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005640 // FIXME: Is this really right?
5641 return "";
5642 }
Craig Topper3164f332014-03-11 03:39:26 +00005643 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005644 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005645 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005646 }
5647 };
5648
5649 const char * const MSP430TargetInfo::GCCRegNames[] = {
5650 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5651 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5652 };
5653
5654 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5655 unsigned &NumNames) const {
5656 Names = GCCRegNames;
5657 NumNames = llvm::array_lengthof(GCCRegNames);
5658 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00005659
Mike Stump11289f42009-09-09 15:08:12 +00005660 // LLVM and Clang cannot be used directly to output native binaries for
5661 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005662 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005663 //
5664 // TCE uses the llvm bitcode as input and uses it for generating customized
5665 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005666 // publicly available in http://tce.cs.tut.fi
5667
Eli Friedman1f191002011-10-07 19:51:42 +00005668 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5669 3, // opencl_global
5670 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005671 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005672 // FIXME: generic has to be added to the target
5673 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005674 0, // cuda_device
5675 0, // cuda_constant
5676 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005677 };
5678
Eli Friedmana9c3d712009-08-19 20:47:07 +00005679 class TCETargetInfo : public TargetInfo{
5680 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005681 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005682 TLSSupported = false;
5683 IntWidth = 32;
5684 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005685 PointerWidth = 32;
5686 IntAlign = 32;
5687 LongAlign = LongLongAlign = 32;
5688 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005689 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005690 SizeType = UnsignedInt;
5691 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005692 IntPtrType = SignedInt;
5693 PtrDiffType = SignedInt;
5694 FloatWidth = 32;
5695 FloatAlign = 32;
5696 DoubleWidth = 32;
5697 DoubleAlign = 32;
5698 LongDoubleWidth = 32;
5699 LongDoubleAlign = 32;
5700 FloatFormat = &llvm::APFloat::IEEEsingle;
5701 DoubleFormat = &llvm::APFloat::IEEEsingle;
5702 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005703 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5704 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005705 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005706 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005707 }
5708
Craig Topper3164f332014-03-11 03:39:26 +00005709 void getTargetDefines(const LangOptions &Opts,
5710 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005711 DefineStd(Builder, "tce", Opts);
5712 Builder.defineMacro("__TCE__");
5713 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005714 }
Craig Topper3164f332014-03-11 03:39:26 +00005715 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005716 return Feature == "tce";
5717 }
Craig Topper3164f332014-03-11 03:39:26 +00005718
5719 void getTargetBuiltins(const Builtin::Info *&Records,
5720 unsigned &NumRecords) const override {}
5721 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005722 return "";
5723 }
Craig Topper3164f332014-03-11 03:39:26 +00005724 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005725 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005726 }
Craig Topper3164f332014-03-11 03:39:26 +00005727 void getGCCRegNames(const char * const *&Names,
5728 unsigned &NumNames) const override {}
5729 bool validateAsmConstraint(const char *&Name,
5730 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005731 return true;
5732 }
Craig Topper3164f332014-03-11 03:39:26 +00005733 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5734 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005735 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00005736
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005737class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005738 virtual void setDescriptionString() = 0;
5739
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005740 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005741 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005742 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005743 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005744 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005745 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005746 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005747 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005748 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005749 enum DspRevEnum {
5750 NoDSP, DSP1, DSP2
5751 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005752 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005753
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005754protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005755 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005756 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005757
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005758public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005759 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5760 const std::string &CPUStr)
5761 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005762 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00005763 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5764 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5765 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005766
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005767 bool isNaN2008Default() const {
5768 return CPU == "mips32r6" || CPU == "mips64r6";
5769 }
5770
5771 bool isFP64Default() const {
5772 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5773 }
5774
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00005775 bool isNan2008() const override {
5776 return IsNan2008;
5777 }
5778
Alp Toker4925ba72014-06-07 23:30:42 +00005779 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005780 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005781 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5782 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005783 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005784 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005785 .Case("mips1", IsMips32)
5786 .Case("mips2", IsMips32)
5787 .Case("mips3", true)
5788 .Case("mips4", true)
5789 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005790 .Case("mips32", IsMips32)
5791 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005792 .Case("mips32r3", IsMips32)
5793 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005794 .Case("mips32r6", IsMips32)
5795 .Case("mips64", true)
5796 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005797 .Case("mips64r3", true)
5798 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005799 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005800 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005801 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005802 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005803 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005804 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005805 if (CPU == "octeon")
5806 Features["mips64r2"] = Features["cnmips"] = true;
5807 else
5808 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005809 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005810
Craig Topper3164f332014-03-11 03:39:26 +00005811 void getTargetDefines(const LangOptions &Opts,
5812 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005813 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005814 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005815 if (Opts.GNUMode)
5816 Builder.defineMacro("mips");
5817
Simon Atanasyan683535b2012-08-29 19:14:58 +00005818 Builder.defineMacro("__REGISTER_PREFIX__", "");
5819
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005820 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005821 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005822 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005823 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005824 case SoftFloat:
5825 Builder.defineMacro("__mips_soft_float", Twine(1));
5826 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005827 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005828
Simon Atanasyan16071912013-04-14 14:07:30 +00005829 if (IsSingleFloat)
5830 Builder.defineMacro("__mips_single_float", Twine(1));
5831
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005832 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5833 Builder.defineMacro("_MIPS_FPSET",
5834 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5835
Simon Atanasyan72244b62012-07-05 16:06:06 +00005836 if (IsMips16)
5837 Builder.defineMacro("__mips16", Twine(1));
5838
Simon Atanasyan60777612013-04-14 14:07:51 +00005839 if (IsMicromips)
5840 Builder.defineMacro("__mips_micromips", Twine(1));
5841
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005842 if (IsNan2008)
5843 Builder.defineMacro("__mips_nan2008", Twine(1));
5844
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005845 switch (DspRev) {
5846 default:
5847 break;
5848 case DSP1:
5849 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5850 Builder.defineMacro("__mips_dsp", Twine(1));
5851 break;
5852 case DSP2:
5853 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5854 Builder.defineMacro("__mips_dspr2", Twine(1));
5855 Builder.defineMacro("__mips_dsp", Twine(1));
5856 break;
5857 }
5858
Jack Carter44ff1e52013-08-12 17:20:29 +00005859 if (HasMSA)
5860 Builder.defineMacro("__mips_msa", Twine(1));
5861
Simon Atanasyan26f19672012-04-05 19:28:31 +00005862 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5863 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5864 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005865
5866 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5867 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005868 }
5869
Craig Topper3164f332014-03-11 03:39:26 +00005870 void getTargetBuiltins(const Builtin::Info *&Records,
5871 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005872 Records = BuiltinInfo;
5873 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005874 }
Craig Topper3164f332014-03-11 03:39:26 +00005875 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005876 return llvm::StringSwitch<bool>(Feature)
5877 .Case("mips", true)
5878 .Case("fp64", HasFP64)
5879 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005880 }
Craig Topper3164f332014-03-11 03:39:26 +00005881 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005882 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005883 }
Craig Topper3164f332014-03-11 03:39:26 +00005884 void getGCCRegNames(const char * const *&Names,
5885 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005886 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005887 // CPU register names
5888 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005889 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5890 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5891 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005892 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5893 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005894 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5895 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5896 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5897 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005898 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005899 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005900 "$fcc5","$fcc6","$fcc7",
5901 // MSA register names
5902 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5903 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5904 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5905 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5906 // MSA control register names
5907 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5908 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005909 };
5910 Names = GCCRegNames;
5911 NumNames = llvm::array_lengthof(GCCRegNames);
5912 }
Craig Topper3164f332014-03-11 03:39:26 +00005913 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5914 unsigned &NumAliases) const override = 0;
5915 bool validateAsmConstraint(const char *&Name,
5916 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005917 switch (*Name) {
5918 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005919 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005920 case 'r': // CPU registers.
5921 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005922 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005923 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005924 case 'c': // $25 for indirect jumps
5925 case 'l': // lo register
5926 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005927 Info.setAllowsRegister();
5928 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005929 case 'I': // Signed 16-bit constant
5930 case 'J': // Integer 0
5931 case 'K': // Unsigned 16-bit constant
5932 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5933 case 'M': // Constants not loadable via lui, addiu, or ori
5934 case 'N': // Constant -1 to -65535
5935 case 'O': // A signed 15-bit constant
5936 case 'P': // A constant between 1 go 65535
5937 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005938 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005939 Info.setAllowsMemory();
5940 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00005941 case 'Z':
5942 if (Name[1] == 'C') { // An address usable by ll, and sc.
5943 Info.setAllowsMemory();
5944 Name++; // Skip over 'Z'.
5945 return true;
5946 }
5947 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005948 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005949 }
5950
Daniel Sanders48fa39e2015-03-30 13:47:23 +00005951 std::string convertConstraint(const char *&Constraint) const override {
5952 std::string R;
5953 switch (*Constraint) {
5954 case 'Z': // Two-character constraint; add "^" hint for later parsing.
5955 if (Constraint[1] == 'C') {
5956 R = std::string("^") + std::string(Constraint, 2);
5957 Constraint++;
5958 return R;
5959 }
5960 break;
5961 }
5962 return TargetInfo::convertConstraint(Constraint);
5963 }
5964
Craig Topper3164f332014-03-11 03:39:26 +00005965 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00005966 // In GCC, $1 is not widely used in generated code (it's used only in a few
5967 // specific situations), so there is no real need for users to add it to
5968 // the clobbers list if they want to use it in their inline assembly code.
5969 //
5970 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5971 // code generation, so using it in inline assembly without adding it to the
5972 // clobbers list can cause conflicts between the inline assembly code and
5973 // the surrounding generated code.
5974 //
5975 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5976 // operands, which will conflict with the ".set at" assembler option (which
5977 // we use only for inline assembly, in order to maintain compatibility with
5978 // GCC) and will also conflict with the user's usage of $1.
5979 //
5980 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5981 // register for generated code is to automatically clobber $1 for all inline
5982 // assembly code.
5983 //
5984 // FIXME: We should automatically clobber $1 only for inline assembly code
5985 // which actually uses it. This would allow LLVM to use $1 for inline
5986 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00005987 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005988 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005989
Craig Topper3164f332014-03-11 03:39:26 +00005990 bool handleTargetFeatures(std::vector<std::string> &Features,
5991 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005992 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005993 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005994 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005995 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005996 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005997 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005998 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005999
6000 for (std::vector<std::string>::iterator it = Features.begin(),
6001 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006002 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006003 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006004 else if (*it == "+soft-float")
6005 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006006 else if (*it == "+mips16")
6007 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00006008 else if (*it == "+micromips")
6009 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006010 else if (*it == "+dsp")
6011 DspRev = std::max(DspRev, DSP1);
6012 else if (*it == "+dspr2")
6013 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00006014 else if (*it == "+msa")
6015 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006016 else if (*it == "+fp64")
6017 HasFP64 = true;
6018 else if (*it == "-fp64")
6019 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006020 else if (*it == "+nan2008")
6021 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006022 else if (*it == "-nan2008")
6023 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006024 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006025
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006026 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006027 std::vector<std::string>::iterator it =
6028 std::find(Features.begin(), Features.end(), "+soft-float");
6029 if (it != Features.end())
6030 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00006031
Akira Hatanaka9064e362013-10-29 18:30:33 +00006032 setDescriptionString();
6033
Rafael Espindolaeb265472013-08-21 21:59:03 +00006034 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006035 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006036
Craig Topper3164f332014-03-11 03:39:26 +00006037 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006038 if (RegNo == 0) return 4;
6039 if (RegNo == 1) return 5;
6040 return -1;
6041 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006042
6043 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006044};
6045
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006046const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
6047#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6048#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6049 ALL_LANGUAGES },
6050#include "clang/Basic/BuiltinsMips.def"
6051};
6052
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006053class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006054public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006055 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006056 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006057 SizeType = UnsignedInt;
6058 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006059 Int64Type = SignedLongLong;
6060 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006061 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006062 }
Craig Topper3164f332014-03-11 03:39:26 +00006063 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006064 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006065 ABI = Name;
6066 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006067 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006068 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006069 }
Craig Topper3164f332014-03-11 03:39:26 +00006070 void getTargetDefines(const LangOptions &Opts,
6071 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006072 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006073
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006074 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006075 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6076
6077 const std::string& CPUStr = getCPU();
6078 if (CPUStr == "mips32")
6079 Builder.defineMacro("__mips_isa_rev", "1");
6080 else if (CPUStr == "mips32r2")
6081 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006082 else if (CPUStr == "mips32r3")
6083 Builder.defineMacro("__mips_isa_rev", "3");
6084 else if (CPUStr == "mips32r5")
6085 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006086 else if (CPUStr == "mips32r6")
6087 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006088
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006089 if (ABI == "o32") {
6090 Builder.defineMacro("__mips_o32");
6091 Builder.defineMacro("_ABIO32", "1");
6092 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6093 }
6094 else if (ABI == "eabi")
6095 Builder.defineMacro("__mips_eabi");
6096 else
David Blaikie83d382b2011-09-23 05:06:16 +00006097 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006098 }
Craig Topper3164f332014-03-11 03:39:26 +00006099 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6100 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006101 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6102 { { "at" }, "$1" },
6103 { { "v0" }, "$2" },
6104 { { "v1" }, "$3" },
6105 { { "a0" }, "$4" },
6106 { { "a1" }, "$5" },
6107 { { "a2" }, "$6" },
6108 { { "a3" }, "$7" },
6109 { { "t0" }, "$8" },
6110 { { "t1" }, "$9" },
6111 { { "t2" }, "$10" },
6112 { { "t3" }, "$11" },
6113 { { "t4" }, "$12" },
6114 { { "t5" }, "$13" },
6115 { { "t6" }, "$14" },
6116 { { "t7" }, "$15" },
6117 { { "s0" }, "$16" },
6118 { { "s1" }, "$17" },
6119 { { "s2" }, "$18" },
6120 { { "s3" }, "$19" },
6121 { { "s4" }, "$20" },
6122 { { "s5" }, "$21" },
6123 { { "s6" }, "$22" },
6124 { { "s7" }, "$23" },
6125 { { "t8" }, "$24" },
6126 { { "t9" }, "$25" },
6127 { { "k0" }, "$26" },
6128 { { "k1" }, "$27" },
6129 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006130 { { "sp","$sp" }, "$29" },
6131 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006132 { { "ra" }, "$31" }
6133 };
6134 Aliases = GCCRegAliases;
6135 NumAliases = llvm::array_lengthof(GCCRegAliases);
6136 }
6137};
6138
6139class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006140 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006141 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006142 }
6143
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006144public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006145 Mips32EBTargetInfo(const llvm::Triple &Triple)
6146 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006147 }
Craig Topper3164f332014-03-11 03:39:26 +00006148 void getTargetDefines(const LangOptions &Opts,
6149 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006150 DefineStd(Builder, "MIPSEB", Opts);
6151 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006152 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006153 }
6154};
6155
6156class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006157 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006158 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006159 }
6160
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006161public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006162 Mips32ELTargetInfo(const llvm::Triple &Triple)
6163 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006164 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006165 }
Craig Topper3164f332014-03-11 03:39:26 +00006166 void getTargetDefines(const LangOptions &Opts,
6167 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006168 DefineStd(Builder, "MIPSEL", Opts);
6169 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006170 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006171 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006172};
Akira Hatanakabef17452011-09-20 19:21:49 +00006173
6174class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006175public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006176 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006177 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006178 LongDoubleWidth = LongDoubleAlign = 128;
6179 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006180 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6181 LongDoubleWidth = LongDoubleAlign = 64;
6182 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6183 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006184 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006185 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006186 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006187 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006188
6189 void setN64ABITypes() {
6190 LongWidth = LongAlign = 64;
6191 PointerWidth = PointerAlign = 64;
6192 SizeType = UnsignedLong;
6193 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006194 Int64Type = SignedLong;
6195 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006196 }
6197
6198 void setN32ABITypes() {
6199 LongWidth = LongAlign = 32;
6200 PointerWidth = PointerAlign = 32;
6201 SizeType = UnsignedInt;
6202 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006203 Int64Type = SignedLongLong;
6204 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006205 }
6206
Craig Topper3164f332014-03-11 03:39:26 +00006207 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006208 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006209 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006210 ABI = Name;
6211 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006212 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006213 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006214 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006215 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006216 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006217 }
6218 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006219 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006220
Craig Topper3164f332014-03-11 03:39:26 +00006221 void getTargetDefines(const LangOptions &Opts,
6222 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006223 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006224
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006225 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006226 Builder.defineMacro("__mips64");
6227 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006228 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6229
6230 const std::string& CPUStr = getCPU();
6231 if (CPUStr == "mips64")
6232 Builder.defineMacro("__mips_isa_rev", "1");
6233 else if (CPUStr == "mips64r2")
6234 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006235 else if (CPUStr == "mips64r3")
6236 Builder.defineMacro("__mips_isa_rev", "3");
6237 else if (CPUStr == "mips64r5")
6238 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006239 else if (CPUStr == "mips64r6")
6240 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006241
Akira Hatanakabef17452011-09-20 19:21:49 +00006242 if (ABI == "n32") {
6243 Builder.defineMacro("__mips_n32");
6244 Builder.defineMacro("_ABIN32", "2");
6245 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6246 }
6247 else if (ABI == "n64") {
6248 Builder.defineMacro("__mips_n64");
6249 Builder.defineMacro("_ABI64", "3");
6250 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6251 }
6252 else
David Blaikie83d382b2011-09-23 05:06:16 +00006253 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006254 }
Craig Topper3164f332014-03-11 03:39:26 +00006255 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6256 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006257 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6258 { { "at" }, "$1" },
6259 { { "v0" }, "$2" },
6260 { { "v1" }, "$3" },
6261 { { "a0" }, "$4" },
6262 { { "a1" }, "$5" },
6263 { { "a2" }, "$6" },
6264 { { "a3" }, "$7" },
6265 { { "a4" }, "$8" },
6266 { { "a5" }, "$9" },
6267 { { "a6" }, "$10" },
6268 { { "a7" }, "$11" },
6269 { { "t0" }, "$12" },
6270 { { "t1" }, "$13" },
6271 { { "t2" }, "$14" },
6272 { { "t3" }, "$15" },
6273 { { "s0" }, "$16" },
6274 { { "s1" }, "$17" },
6275 { { "s2" }, "$18" },
6276 { { "s3" }, "$19" },
6277 { { "s4" }, "$20" },
6278 { { "s5" }, "$21" },
6279 { { "s6" }, "$22" },
6280 { { "s7" }, "$23" },
6281 { { "t8" }, "$24" },
6282 { { "t9" }, "$25" },
6283 { { "k0" }, "$26" },
6284 { { "k1" }, "$27" },
6285 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006286 { { "sp","$sp" }, "$29" },
6287 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006288 { { "ra" }, "$31" }
6289 };
6290 Aliases = GCCRegAliases;
6291 NumAliases = llvm::array_lengthof(GCCRegAliases);
6292 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006293
6294 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006295};
6296
6297class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006298 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006299 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006300 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 +00006301 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006302 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006303
Akira Hatanakabef17452011-09-20 19:21:49 +00006304 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006305
Akira Hatanakabef17452011-09-20 19:21:49 +00006306public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006307 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006308 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006309 void getTargetDefines(const LangOptions &Opts,
6310 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006311 DefineStd(Builder, "MIPSEB", Opts);
6312 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006313 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006314 }
6315};
6316
6317class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006318 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006319 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006320 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 +00006321 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006322 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006323 }
6324public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006325 Mips64ELTargetInfo(const llvm::Triple &Triple)
6326 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006327 // Default ABI is n64.
6328 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006329 }
Craig Topper3164f332014-03-11 03:39:26 +00006330 void getTargetDefines(const LangOptions &Opts,
6331 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006332 DefineStd(Builder, "MIPSEL", Opts);
6333 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006334 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006335 }
6336};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006337
Ivan Krasindd7403e2011-08-24 20:22:22 +00006338class PNaClTargetInfo : public TargetInfo {
6339public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006340 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006341 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006342 this->UserLabelPrefix = "";
6343 this->LongAlign = 32;
6344 this->LongWidth = 32;
6345 this->PointerAlign = 32;
6346 this->PointerWidth = 32;
6347 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006348 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006349 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006350 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006351 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006352 this->SizeType = TargetInfo::UnsignedInt;
6353 this->PtrDiffType = TargetInfo::SignedInt;
6354 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006355 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006356 }
6357
Craig Topper3164f332014-03-11 03:39:26 +00006358 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006359 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006360 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006361 Builder.defineMacro("__le32__");
6362 Builder.defineMacro("__pnacl__");
6363 }
Craig Topper3164f332014-03-11 03:39:26 +00006364 void getTargetDefines(const LangOptions &Opts,
6365 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006366 getArchDefines(Opts, Builder);
6367 }
Craig Topper3164f332014-03-11 03:39:26 +00006368 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006369 return Feature == "pnacl";
6370 }
Craig Topper3164f332014-03-11 03:39:26 +00006371 void getTargetBuiltins(const Builtin::Info *&Records,
6372 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006373 }
Craig Topper3164f332014-03-11 03:39:26 +00006374 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006375 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006376 }
Craig Topper3164f332014-03-11 03:39:26 +00006377 void getGCCRegNames(const char * const *&Names,
6378 unsigned &NumNames) const override;
6379 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6380 unsigned &NumAliases) const override;
6381 bool validateAsmConstraint(const char *&Name,
6382 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006383 return false;
6384 }
6385
Craig Topper3164f332014-03-11 03:39:26 +00006386 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006387 return "";
6388 }
6389};
6390
6391void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6392 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006393 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006394 NumNames = 0;
6395}
6396
6397void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6398 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006399 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006400 NumAliases = 0;
6401}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006402
JF Bastien643817d2014-09-12 17:52:47 +00006403class Le64TargetInfo : public TargetInfo {
6404 static const Builtin::Info BuiltinInfo[];
6405
6406public:
6407 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6408 BigEndian = false;
6409 NoAsmVariants = true;
6410 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6411 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6412 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006413 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006414 }
6415
6416 void getTargetDefines(const LangOptions &Opts,
6417 MacroBuilder &Builder) const override {
6418 DefineStd(Builder, "unix", Opts);
6419 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6420 Builder.defineMacro("__ELF__");
6421 }
6422 void getTargetBuiltins(const Builtin::Info *&Records,
6423 unsigned &NumRecords) const override {
6424 Records = BuiltinInfo;
6425 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6426 }
6427 BuiltinVaListKind getBuiltinVaListKind() const override {
6428 return TargetInfo::PNaClABIBuiltinVaList;
6429 }
6430 const char *getClobbers() const override { return ""; }
6431 void getGCCRegNames(const char *const *&Names,
6432 unsigned &NumNames) const override {
6433 Names = nullptr;
6434 NumNames = 0;
6435 }
6436 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6437 unsigned &NumAliases) const override {
6438 Aliases = nullptr;
6439 NumAliases = 0;
6440 }
6441 bool validateAsmConstraint(const char *&Name,
6442 TargetInfo::ConstraintInfo &Info) const override {
6443 return false;
6444 }
6445
6446 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006447};
6448} // end anonymous namespace.
6449
6450const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6451#define BUILTIN(ID, TYPE, ATTRS) \
6452 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6453#include "clang/Basic/BuiltinsLe64.def"
6454};
6455
6456namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006457 static const unsigned SPIRAddrSpaceMap[] = {
6458 1, // opencl_global
6459 3, // opencl_local
6460 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006461 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006462 0, // cuda_device
6463 0, // cuda_constant
6464 0 // cuda_shared
6465 };
6466 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006467 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006468 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006469 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6470 "SPIR target must use unknown OS");
6471 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6472 "SPIR target must use unknown environment type");
6473 BigEndian = false;
6474 TLSSupported = false;
6475 LongWidth = LongAlign = 64;
6476 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006477 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006478 // Define available target features
6479 // These must be defined in sorted order!
6480 NoAsmVariants = true;
6481 }
Craig Topper3164f332014-03-11 03:39:26 +00006482 void getTargetDefines(const LangOptions &Opts,
6483 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006484 DefineStd(Builder, "SPIR", Opts);
6485 }
Craig Topper3164f332014-03-11 03:39:26 +00006486 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006487 return Feature == "spir";
6488 }
Craig Topper3164f332014-03-11 03:39:26 +00006489
6490 void getTargetBuiltins(const Builtin::Info *&Records,
6491 unsigned &NumRecords) const override {}
6492 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006493 return "";
6494 }
Craig Topper3164f332014-03-11 03:39:26 +00006495 void getGCCRegNames(const char * const *&Names,
6496 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006497 bool
6498 validateAsmConstraint(const char *&Name,
6499 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006500 return true;
6501 }
Craig Topper3164f332014-03-11 03:39:26 +00006502 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6503 unsigned &NumAliases) const override {}
6504 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006505 return TargetInfo::VoidPtrBuiltinVaList;
6506 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006507
6508 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6509 return (CC == CC_SpirFunction ||
6510 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6511 }
6512
6513 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6514 return CC_SpirFunction;
6515 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006516 };
6517
6518
6519 class SPIR32TargetInfo : public SPIRTargetInfo {
6520 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006521 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006522 PointerWidth = PointerAlign = 32;
6523 SizeType = TargetInfo::UnsignedInt;
6524 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6525 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006526 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6527 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006528 }
Craig Topper3164f332014-03-11 03:39:26 +00006529 void getTargetDefines(const LangOptions &Opts,
6530 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006531 DefineStd(Builder, "SPIR32", Opts);
6532 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006533 };
6534
6535 class SPIR64TargetInfo : public SPIRTargetInfo {
6536 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006537 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006538 PointerWidth = PointerAlign = 64;
6539 SizeType = TargetInfo::UnsignedLong;
6540 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006541 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6542 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006543 }
Craig Topper3164f332014-03-11 03:39:26 +00006544 void getTargetDefines(const LangOptions &Opts,
6545 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006546 DefineStd(Builder, "SPIR64", Opts);
6547 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006548 };
Guy Benyeib798fc92012-12-11 21:38:14 +00006549
Robert Lytton0e076492013-08-13 09:43:10 +00006550class XCoreTargetInfo : public TargetInfo {
6551 static const Builtin::Info BuiltinInfo[];
6552public:
6553 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6554 BigEndian = false;
6555 NoAsmVariants = true;
6556 LongLongAlign = 32;
6557 SuitableAlign = 32;
6558 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006559 SizeType = UnsignedInt;
6560 PtrDiffType = SignedInt;
6561 IntPtrType = SignedInt;
6562 WCharType = UnsignedChar;
6563 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006564 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006565 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 +00006566 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006567 }
Craig Topper3164f332014-03-11 03:39:26 +00006568 void getTargetDefines(const LangOptions &Opts,
6569 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006570 Builder.defineMacro("__XS1B__");
6571 }
Craig Topper3164f332014-03-11 03:39:26 +00006572 void getTargetBuiltins(const Builtin::Info *&Records,
6573 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006574 Records = BuiltinInfo;
6575 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6576 }
Craig Topper3164f332014-03-11 03:39:26 +00006577 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006578 return TargetInfo::VoidPtrBuiltinVaList;
6579 }
Craig Topper3164f332014-03-11 03:39:26 +00006580 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006581 return "";
6582 }
Craig Topper3164f332014-03-11 03:39:26 +00006583 void getGCCRegNames(const char * const *&Names,
6584 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006585 static const char * const GCCRegNames[] = {
6586 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6587 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6588 };
6589 Names = GCCRegNames;
6590 NumNames = llvm::array_lengthof(GCCRegNames);
6591 }
Craig Topper3164f332014-03-11 03:39:26 +00006592 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6593 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006594 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006595 NumAliases = 0;
6596 }
Craig Topper3164f332014-03-11 03:39:26 +00006597 bool validateAsmConstraint(const char *&Name,
6598 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006599 return false;
6600 }
Craig Topper3164f332014-03-11 03:39:26 +00006601 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006602 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6603 return (RegNo < 2)? RegNo : -1;
6604 }
Robert Lytton0e076492013-08-13 09:43:10 +00006605};
6606
6607const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6608#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6609#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6610 ALL_LANGUAGES },
6611#include "clang/Basic/BuiltinsXCore.def"
6612};
6613} // end anonymous namespace.
6614
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006615namespace {
6616// x86_32 Android target
6617class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
6618public:
6619 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
6620 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
6621 SuitableAlign = 32;
6622 LongDoubleWidth = 64;
6623 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6624 }
6625};
6626} // end anonymous namespace
6627
6628namespace {
6629// x86_64 Android target
6630class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
6631public:
6632 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
6633 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
6634 LongDoubleFormat = &llvm::APFloat::IEEEquad;
6635 }
6636};
6637} // end anonymous namespace
6638
Ivan Krasindd7403e2011-08-24 20:22:22 +00006639
Chris Lattner5ba61f02006-10-14 07:39:34 +00006640//===----------------------------------------------------------------------===//
6641// Driver code
6642//===----------------------------------------------------------------------===//
6643
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006644static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006645 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006646
Daniel Dunbar52322032009-08-18 05:47:58 +00006647 switch (Triple.getArch()) {
6648 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006649 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006650
Tim Northover2a0783d2014-05-30 14:14:07 +00006651 case llvm::Triple::xcore:
6652 return new XCoreTargetInfo(Triple);
6653
6654 case llvm::Triple::hexagon:
6655 return new HexagonTargetInfo(Triple);
6656
6657 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006658 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006659 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006660
6661 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006662 case llvm::Triple::FreeBSD:
6663 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006664 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006665 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006666 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006667 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006668 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006669 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006670 }
6671
Christian Pirker9b019ae2014-02-25 13:51:00 +00006672 case llvm::Triple::aarch64_be:
6673 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006674 case llvm::Triple::FreeBSD:
6675 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006676 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006677 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006678 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006679 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006680 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006681 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006682 }
6683
Daniel Dunbar52322032009-08-18 05:47:58 +00006684 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006685 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006686 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006687 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006688
Daniel Dunbar52322032009-08-18 05:47:58 +00006689 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006690 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006691 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006692 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006693 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006694 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006695 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006696 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006697 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006698 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006699 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006700 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006701 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006702 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006703 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006704 case llvm::Triple::Win32:
6705 switch (Triple.getEnvironment()) {
6706 default:
6707 return new ARMleTargetInfo(Triple);
6708 case llvm::Triple::Itanium:
6709 return new ItaniumWindowsARMleTargetInfo(Triple);
6710 case llvm::Triple::MSVC:
6711 return new MicrosoftARMleTargetInfo(Triple);
6712 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006713 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006714 return new ARMleTargetInfo(Triple);
6715 }
6716
6717 case llvm::Triple::armeb:
6718 case llvm::Triple::thumbeb:
6719 if (Triple.isOSDarwin())
6720 return new DarwinARMTargetInfo(Triple);
6721
6722 switch (os) {
6723 case llvm::Triple::Linux:
6724 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6725 case llvm::Triple::FreeBSD:
6726 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6727 case llvm::Triple::NetBSD:
6728 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6729 case llvm::Triple::OpenBSD:
6730 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6731 case llvm::Triple::Bitrig:
6732 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6733 case llvm::Triple::RTEMS:
6734 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6735 case llvm::Triple::NaCl:
6736 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6737 default:
6738 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006739 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006740
Daniel Dunbar52322032009-08-18 05:47:58 +00006741 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006742 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006743
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006744 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006745 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006746 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006747 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006748 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006749 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006750 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006751 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006752 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006753 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006754 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006755 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006756 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006757
6758 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006759 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006760 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006761 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006762 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006763 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006764 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006765 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006766 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006767 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006768 case llvm::Triple::NaCl:
6769 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006770 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006771 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006772 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006773
Akira Hatanakabef17452011-09-20 19:21:49 +00006774 case llvm::Triple::mips64:
6775 switch (os) {
6776 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006777 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006778 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006779 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006780 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006781 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006782 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006783 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006784 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006785 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006786 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006787 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006788 }
6789
6790 case llvm::Triple::mips64el:
6791 switch (os) {
6792 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006793 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006794 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006795 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006796 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006797 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006798 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006799 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006800 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006801 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006802 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006803 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006804 }
6805
Ivan Krasindd7403e2011-08-24 20:22:22 +00006806 case llvm::Triple::le32:
6807 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006808 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006809 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006810 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006811 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006812 }
6813
JF Bastien643817d2014-09-12 17:52:47 +00006814 case llvm::Triple::le64:
6815 return new Le64TargetInfo(Triple);
6816
Daniel Dunbar52322032009-08-18 05:47:58 +00006817 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006818 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006819 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006820 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006821 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006822 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006823 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006824 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006825 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006826 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006827 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006828 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006829 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006830 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006831 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006832 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006833 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006834
6835 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006836 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006837 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006838 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006839 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006840 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006841 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006842 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006843 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006844 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006845 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006846 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006847 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006848 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006849 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006850
Bill Schmidt778d3872013-07-26 01:36:11 +00006851 case llvm::Triple::ppc64le:
6852 switch (os) {
6853 case llvm::Triple::Linux:
6854 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00006855 case llvm::Triple::NetBSD:
6856 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00006857 default:
6858 return new PPC64TargetInfo(Triple);
6859 }
6860
Peter Collingbournec947aae2012-05-20 23:28:41 +00006861 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006862 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006863 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006864 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006865
Tom Stellardd8e38a32015-01-06 20:34:47 +00006866 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00006867 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006868 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006869
Daniel Dunbar52322032009-08-18 05:47:58 +00006870 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006871 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006872 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006873 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006874 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006875 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006876 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006877 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006878 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006879 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006880 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006881 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006882 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006883 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006884 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006885
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006886 case llvm::Triple::sparcv9:
6887 switch (os) {
6888 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006889 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006890 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006891 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006892 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006893 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006894 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006895 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006896 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006897 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006898 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006899 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006900 }
6901
Ulrich Weigand47445072013-05-06 16:26:41 +00006902 case llvm::Triple::systemz:
6903 switch (os) {
6904 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006905 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006906 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006907 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006908 }
6909
Eli Friedmana9c3d712009-08-19 20:47:07 +00006910 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006911 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006912
Daniel Dunbar52322032009-08-18 05:47:58 +00006913 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006914 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006915 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006916
Daniel Dunbar52322032009-08-18 05:47:58 +00006917 switch (os) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006918 case llvm::Triple::Linux: {
6919 switch (Triple.getEnvironment()) {
6920 default:
6921 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
6922 case llvm::Triple::Android:
6923 return new AndroidX86_32TargetInfo(Triple);
6924 }
6925 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006926 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006927 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006928 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006929 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006930 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006931 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006932 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006933 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006934 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006935 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006936 case llvm::Triple::KFreeBSD:
6937 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006938 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006939 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006940 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006941 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006942 case llvm::Triple::Win32: {
6943 switch (Triple.getEnvironment()) {
6944 default:
6945 return new X86_32TargetInfo(Triple);
6946 case llvm::Triple::Cygnus:
6947 return new CygwinX86_32TargetInfo(Triple);
6948 case llvm::Triple::GNU:
6949 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006950 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006951 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006952 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006953 }
6954 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006955 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006956 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006957 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006958 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006959 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006960 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006961 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006962 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006963 }
6964
6965 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006966 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006967 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006968
Daniel Dunbar52322032009-08-18 05:47:58 +00006969 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00006970 case llvm::Triple::CloudABI:
6971 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006972 case llvm::Triple::Linux: {
6973 switch (Triple.getEnvironment()) {
6974 default:
6975 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
6976 case llvm::Triple::Android:
6977 return new AndroidX86_64TargetInfo(Triple);
6978 }
6979 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00006980 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006981 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006982 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006983 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006984 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006985 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006986 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006987 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006988 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006989 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006990 case llvm::Triple::KFreeBSD:
6991 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006992 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006993 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006994 case llvm::Triple::Win32: {
6995 switch (Triple.getEnvironment()) {
6996 default:
6997 return new X86_64TargetInfo(Triple);
6998 case llvm::Triple::GNU:
6999 return new MinGWX86_64TargetInfo(Triple);
7000 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007001 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007002 }
7003 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007004 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007005 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007006 case llvm::Triple::PS4:
7007 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007008 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007009 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007010 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007011
7012 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00007013 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007014 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00007015 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007016 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00007017 }
7018 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00007019 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007020 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00007021 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007022 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00007023 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007024 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007025}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007026
7027/// CreateTargetInfo - Return the target info object for the specified target
7028/// triple.
Alp Toker80758082014-07-06 05:26:44 +00007029TargetInfo *
7030TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7031 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007032 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007033
7034 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007035 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007036 if (!Target) {
7037 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007038 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007039 }
Alp Toker80758082014-07-06 05:26:44 +00007040 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007041
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007042 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007043 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7044 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007045 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007046 }
7047
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007048 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007049 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7050 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007051 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007052 }
7053
Rafael Espindolaeb265472013-08-21 21:59:03 +00007054 // Set the fp math unit.
7055 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7056 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007057 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007058 }
7059
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007060 // Compute the default target features, we need the target to handle this
7061 // because features may have dependencies on one another.
7062 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00007063 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007064
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007065 // Apply the user specified deltas.
7066 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
7067 I < N; ++I) {
7068 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00007069 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007070 bool Enabled = Name[0] == '+';
7071 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007072 }
7073
7074 // Add the features to the compile options.
7075 //
7076 // FIXME: If we are completely confident that we have the right set, we only
7077 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007078 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007079 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
7080 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00007081 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00007082 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007083 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007084
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007085 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007086}