blob: b969f2a0797463b50f4e4f1ce36a4d74dd16a22a [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
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"
Renato Golinf5c4dec2015-05-27 13:33:00 +000030#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000032#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000033
Chris Lattner5ba61f02006-10-14 07:39:34 +000034using namespace clang;
35
Chris Lattner5ba61f02006-10-14 07:39:34 +000036//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000037// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000038//===----------------------------------------------------------------------===//
39
Chris Lattner1e1c0b92009-03-20 16:06:38 +000040/// DefineStd - Define a macro name and standard variants. For example if
41/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
42/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000043static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000044 const LangOptions &Opts) {
45 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000046
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
48 // in the user's namespace.
49 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000050 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000051
Chris Lattner1e1c0b92009-03-20 16:06:38 +000052 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000057}
58
Benjamin Kramere3b442d2012-01-10 11:50:09 +000059static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
60 bool Tuning = true) {
61 Builder.defineMacro("__" + CPUName);
62 Builder.defineMacro("__" + CPUName + "__");
63 if (Tuning)
64 Builder.defineMacro("__tune_" + CPUName + "__");
65}
66
Chris Lattner09d98f52008-10-05 21:50:58 +000067//===----------------------------------------------------------------------===//
68// Defines specific to certain operating systems.
69//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000070
Torok Edwinb2b37c62009-06-30 17:10:35 +000071namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000072template<typename TgtInfo>
73class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000074protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000075 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000076 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000077public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000078 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000079 void getTargetDefines(const LangOptions &Opts,
80 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000081 TgtInfo::getTargetDefines(Opts, Builder);
82 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000083 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000084
85};
Chris Lattner859c37a2009-08-12 06:24:27 +000086} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000087
Chris Lattner30ba6742009-08-10 19:03:04 +000088
Daniel Dunbard86666f2010-01-26 01:44:04 +000089static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000090 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000091 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000092 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000093 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000094 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000095 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000096 // AddressSanitizer doesn't play well with source fortification, which is on
97 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +000098 if (Opts.Sanitize.has(SanitizerKind::Address))
99 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000100
John McCall5d36a8c2011-06-16 00:03:19 +0000101 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000102 // __weak is always defined, for use in blocks and with objc pointers.
103 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000104
John McCall31168b02011-06-15 23:02:42 +0000105 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000106 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000107 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
108 else
109 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000110
John McCall31168b02011-06-15 23:02:42 +0000111 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
112 // allow this in C, since one might have block pointers in structs that
113 // are used in pure C code and in Objective-C ARC.
114 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000115 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000116
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000117 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000119 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000121
122 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000123 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000124
Daniel Dunbarecf13562011-04-19 21:40:34 +0000125 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000126 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000127 if (Triple.isMacOSX()) {
128 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000129 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000130 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000131 Triple.getOSVersion(Maj, Min, Rev);
132 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000133 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000134
Sebastian Pop422377c2012-01-20 22:01:23 +0000135 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000136 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000137 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
138 if (PlatformName == "win32") {
139 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
140 return;
141 }
142
Evan Cheng31dd9a62014-01-26 23:12:43 +0000143 // Set the appropriate OS version define.
144 if (Triple.isiOS()) {
145 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
146 char Str[6];
147 Str[0] = '0' + Maj;
148 Str[1] = '0' + (Min / 10);
149 Str[2] = '0' + (Min % 10);
150 Str[3] = '0' + (Rev / 10);
151 Str[4] = '0' + (Rev % 10);
152 Str[5] = '\0';
153 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
154 Str);
155 } else if (Triple.isMacOSX()) {
156 // Note that the Driver allows versions which aren't representable in the
157 // define (because we only get a single digit for the minor and micro
158 // revision numbers). So, we limit them to the maximum representable
159 // version.
160 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000161 char Str[7];
162 if (Maj < 10 || (Maj == 10 && Min < 10)) {
163 Str[0] = '0' + (Maj / 10);
164 Str[1] = '0' + (Maj % 10);
165 Str[2] = '0' + std::min(Min, 9U);
166 Str[3] = '0' + std::min(Rev, 9U);
167 Str[4] = '\0';
168 } else {
169 // Handle versions > 10.9.
170 Str[0] = '0' + (Maj / 10);
171 Str[1] = '0' + (Maj % 10);
172 Str[2] = '0' + (Min / 10);
173 Str[3] = '0' + (Min % 10);
174 Str[4] = '0' + (Rev / 10);
175 Str[5] = '0' + (Rev % 10);
176 Str[6] = '\0';
177 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000178 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000179 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000180
Tim Northover157d9112014-01-16 08:48:16 +0000181 // Tell users about the kernel if there is one.
182 if (Triple.isOSDarwin())
183 Builder.defineMacro("__MACH__");
184
Daniel Dunbarecf13562011-04-19 21:40:34 +0000185 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000186}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000187
Benjamin Kramerd5748c72015-03-23 12:31:05 +0000188namespace {
Ed Schoutenf33c6072015-03-11 08:42:46 +0000189// CloudABI Target
190template <typename Target>
191class CloudABITargetInfo : public OSTargetInfo<Target> {
192protected:
193 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
194 MacroBuilder &Builder) const override {
195 Builder.defineMacro("__CloudABI__");
196 Builder.defineMacro("__ELF__");
197
198 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
199 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
200 Builder.defineMacro("__STDC_UTF_16__");
201 Builder.defineMacro("__STDC_UTF_32__");
202 }
203
204public:
205 CloudABITargetInfo(const llvm::Triple &Triple)
206 : OSTargetInfo<Target>(Triple) {
207 this->UserLabelPrefix = "";
208 }
209};
210
Torok Edwinb2b37c62009-06-30 17:10:35 +0000211template<typename Target>
212class DarwinTargetInfo : public OSTargetInfo<Target> {
213protected:
Craig Topper3164f332014-03-11 03:39:26 +0000214 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
215 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000216 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000217 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000218 }
Mike Stump11289f42009-09-09 15:08:12 +0000219
Torok Edwinb2b37c62009-06-30 17:10:35 +0000220public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000221 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
222 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
223 this->MCountName = "\01mcount";
224 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000225
Craig Topper3164f332014-03-11 03:39:26 +0000226 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000227 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000228 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000229 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000230 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000231 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000232 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000233 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000234
Craig Topper3164f332014-03-11 03:39:26 +0000235 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000236 // FIXME: We should return 0 when building kexts.
237 return "__TEXT,__StaticInit,regular,pure_instructions";
238 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000239
John McCalleed64c72012-01-29 01:20:30 +0000240 /// Darwin does not support protected visibility. Darwin's "default"
241 /// is very similar to ELF's "protected"; Darwin requires a "weak"
242 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000243 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000244 return false;
245 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000246};
247
Chris Lattner30ba6742009-08-10 19:03:04 +0000248
Torok Edwinb2b37c62009-06-30 17:10:35 +0000249// DragonFlyBSD Target
250template<typename Target>
251class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
252protected:
Craig Topper3164f332014-03-11 03:39:26 +0000253 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
254 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000255 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000256 Builder.defineMacro("__DragonFly__");
257 Builder.defineMacro("__DragonFly_cc_version", "100001");
258 Builder.defineMacro("__ELF__");
259 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
260 Builder.defineMacro("__tune_i386__");
261 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000262 }
263public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
265 : OSTargetInfo<Target>(Triple) {
266 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000267
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000268 switch (Triple.getArch()) {
269 default:
270 case llvm::Triple::x86:
271 case llvm::Triple::x86_64:
272 this->MCountName = ".mcount";
273 break;
274 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000275 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000276};
277
278// FreeBSD Target
279template<typename Target>
280class FreeBSDTargetInfo : public OSTargetInfo<Target> {
281protected:
Craig Topper3164f332014-03-11 03:39:26 +0000282 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
283 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000284 // FreeBSD defines; list based off of gcc output
285
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000286 unsigned Release = Triple.getOSMajorVersion();
287 if (Release == 0U)
288 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000289
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000290 Builder.defineMacro("__FreeBSD__", Twine(Release));
291 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000292 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
293 DefineStd(Builder, "unix", Opts);
294 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000295
296 // On FreeBSD, wchar_t contains the number of the code point as
297 // used by the character set of the locale. These character sets are
298 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000299 //
300 // FIXME: This is wrong; the macro refers to the numerical values
301 // of wchar_t *literals*, which are not locale-dependent. However,
302 // FreeBSD systems apparently depend on us getting this wrong, and
303 // setting this to 1 is conforming even if all the basic source
304 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000305 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000306 }
307public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000308 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
309 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000310
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000311 switch (Triple.getArch()) {
312 default:
313 case llvm::Triple::x86:
314 case llvm::Triple::x86_64:
315 this->MCountName = ".mcount";
316 break;
317 case llvm::Triple::mips:
318 case llvm::Triple::mipsel:
319 case llvm::Triple::ppc:
320 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000321 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000322 this->MCountName = "_mcount";
323 break;
324 case llvm::Triple::arm:
325 this->MCountName = "__mcount";
326 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000327 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000328 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000329};
330
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000331// GNU/kFreeBSD Target
332template<typename Target>
333class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
334protected:
Craig Topper3164f332014-03-11 03:39:26 +0000335 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
336 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000337 // GNU/kFreeBSD defines; list based off of gcc output
338
339 DefineStd(Builder, "unix", Opts);
340 Builder.defineMacro("__FreeBSD_kernel__");
341 Builder.defineMacro("__GLIBC__");
342 Builder.defineMacro("__ELF__");
343 if (Opts.POSIXThreads)
344 Builder.defineMacro("_REENTRANT");
345 if (Opts.CPlusPlus)
346 Builder.defineMacro("_GNU_SOURCE");
347 }
348public:
Eric Christopher917e9522014-11-18 22:36:15 +0000349 KFreeBSDTargetInfo(const llvm::Triple &Triple)
350 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000351 this->UserLabelPrefix = "";
352 }
353};
354
Chris Lattner3e2ee142010-07-07 16:01:42 +0000355// Minix Target
356template<typename Target>
357class MinixTargetInfo : public OSTargetInfo<Target> {
358protected:
Craig Topper3164f332014-03-11 03:39:26 +0000359 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
360 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000361 // Minix defines
362
363 Builder.defineMacro("__minix", "3");
364 Builder.defineMacro("_EM_WSIZE", "4");
365 Builder.defineMacro("_EM_PSIZE", "4");
366 Builder.defineMacro("_EM_SSIZE", "2");
367 Builder.defineMacro("_EM_LSIZE", "4");
368 Builder.defineMacro("_EM_FSIZE", "4");
369 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000370 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000371 DefineStd(Builder, "unix", Opts);
372 }
373public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
375 this->UserLabelPrefix = "";
376 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000377};
378
Torok Edwinb2b37c62009-06-30 17:10:35 +0000379// Linux target
380template<typename Target>
381class LinuxTargetInfo : public OSTargetInfo<Target> {
382protected:
Craig Topper3164f332014-03-11 03:39:26 +0000383 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
384 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000385 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000386 DefineStd(Builder, "unix", Opts);
387 DefineStd(Builder, "linux", Opts);
388 Builder.defineMacro("__gnu_linux__");
389 Builder.defineMacro("__ELF__");
Dan Albert84aee012015-03-03 18:28:38 +0000390 if (Triple.getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000391 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000392 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000393 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000394 this->PlatformName = "android";
395 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
396 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000397 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000398 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000399 if (Opts.CPlusPlus)
400 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000401 }
402public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000403 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000404 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000405 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000406
407 switch (Triple.getArch()) {
408 default:
409 break;
410 case llvm::Triple::ppc:
411 case llvm::Triple::ppc64:
412 case llvm::Triple::ppc64le:
413 this->MCountName = "_mcount";
414 break;
415 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000416 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000417
Craig Topper3164f332014-03-11 03:39:26 +0000418 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000419 return ".text.startup";
420 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000421};
422
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000423// NetBSD Target
424template<typename Target>
425class NetBSDTargetInfo : public OSTargetInfo<Target> {
426protected:
Craig Topper3164f332014-03-11 03:39:26 +0000427 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
428 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000429 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000430 Builder.defineMacro("__NetBSD__");
431 Builder.defineMacro("__unix__");
432 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000433 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000434 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000435
436 switch (Triple.getArch()) {
437 default:
438 break;
439 case llvm::Triple::arm:
440 case llvm::Triple::armeb:
441 case llvm::Triple::thumb:
442 case llvm::Triple::thumbeb:
443 Builder.defineMacro("__ARM_DWARF_EH__");
444 break;
445 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000446 }
447public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000448 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
449 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000450 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000451 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000452};
453
Torok Edwinb2b37c62009-06-30 17:10:35 +0000454// OpenBSD Target
455template<typename Target>
456class OpenBSDTargetInfo : public OSTargetInfo<Target> {
457protected:
Craig Topper3164f332014-03-11 03:39:26 +0000458 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
459 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000460 // OpenBSD defines; list based off of gcc output
461
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000462 Builder.defineMacro("__OpenBSD__");
463 DefineStd(Builder, "unix", Opts);
464 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000465 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000466 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000467 }
468public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000469 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
470 this->UserLabelPrefix = "";
471 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000472
Eli Friedman3715d1f2011-12-15 02:15:56 +0000473 switch (Triple.getArch()) {
474 default:
475 case llvm::Triple::x86:
476 case llvm::Triple::x86_64:
477 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000478 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000479 this->MCountName = "__mcount";
480 break;
481 case llvm::Triple::mips64:
482 case llvm::Triple::mips64el:
483 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000484 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000485 this->MCountName = "_mcount";
486 break;
487 }
488 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000489};
490
Eli Friedman9fa28852012-08-08 23:57:20 +0000491// Bitrig Target
492template<typename Target>
493class BitrigTargetInfo : public OSTargetInfo<Target> {
494protected:
Craig Topper3164f332014-03-11 03:39:26 +0000495 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
496 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000497 // Bitrig defines; list based off of gcc output
498
499 Builder.defineMacro("__Bitrig__");
500 DefineStd(Builder, "unix", Opts);
501 Builder.defineMacro("__ELF__");
502 if (Opts.POSIXThreads)
503 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000504
505 switch (Triple.getArch()) {
506 default:
507 break;
508 case llvm::Triple::arm:
509 case llvm::Triple::armeb:
510 case llvm::Triple::thumb:
511 case llvm::Triple::thumbeb:
512 Builder.defineMacro("__ARM_DWARF_EH__");
513 break;
514 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000515 }
516public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000517 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
518 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000519 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000520 }
521};
522
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000523// PSP Target
524template<typename Target>
525class PSPTargetInfo : public OSTargetInfo<Target> {
526protected:
Craig Topper3164f332014-03-11 03:39:26 +0000527 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
528 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000529 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000530 Builder.defineMacro("PSP");
531 Builder.defineMacro("_PSP");
532 Builder.defineMacro("__psp__");
533 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000534 }
535public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000536 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000537 this->UserLabelPrefix = "";
538 }
539};
540
John Thompsone467e192009-11-19 17:18:50 +0000541// PS3 PPU Target
542template<typename Target>
543class PS3PPUTargetInfo : public OSTargetInfo<Target> {
544protected:
Craig Topper3164f332014-03-11 03:39:26 +0000545 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
546 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000547 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000548 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000549 Builder.defineMacro("__PPU__");
550 Builder.defineMacro("__CELLOS_LV2__");
551 Builder.defineMacro("__ELF__");
552 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000553 Builder.defineMacro("_ARCH_PPC64");
554 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000555 }
556public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000557 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000558 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000559 this->LongWidth = this->LongAlign = 32;
560 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000561 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000562 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000563 this->SizeType = TargetInfo::UnsignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +0000564 this->DataLayoutString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000565 }
566};
567
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000568template <typename Target>
569class PS4OSTargetInfo : public OSTargetInfo<Target> {
570protected:
571 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
572 MacroBuilder &Builder) const override {
573 Builder.defineMacro("__FreeBSD__", "9");
574 Builder.defineMacro("__FreeBSD_cc_version", "900001");
575 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
576 DefineStd(Builder, "unix", Opts);
577 Builder.defineMacro("__ELF__");
578 Builder.defineMacro("__PS4__");
579 }
580public:
581 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
582 this->WCharType = this->UnsignedShort;
583
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000584 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
585 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000586 this->UserLabelPrefix = "";
587
588 switch (Triple.getArch()) {
589 default:
590 case llvm::Triple::x86_64:
591 this->MCountName = ".mcount";
592 break;
593 }
594 }
595};
596
Torok Edwinb2b37c62009-06-30 17:10:35 +0000597// Solaris target
598template<typename Target>
599class SolarisTargetInfo : public OSTargetInfo<Target> {
600protected:
Craig Topper3164f332014-03-11 03:39:26 +0000601 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
602 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000603 DefineStd(Builder, "sun", Opts);
604 DefineStd(Builder, "unix", Opts);
605 Builder.defineMacro("__ELF__");
606 Builder.defineMacro("__svr4__");
607 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000608 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
609 // newer, but to 500 for everything else. feature_test.h has a check to
610 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000611 // with a new version.
612 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000613 Builder.defineMacro("_XOPEN_SOURCE", "600");
614 else
615 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000616 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000617 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000618 Builder.defineMacro("_LARGEFILE_SOURCE");
619 Builder.defineMacro("_LARGEFILE64_SOURCE");
620 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000621 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000622 }
623public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000624 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000625 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000626 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000627 // FIXME: WIntType should be SignedLong
628 }
629};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000630
631// Windows target
632template<typename Target>
633class WindowsTargetInfo : public OSTargetInfo<Target> {
634protected:
Craig Topper3164f332014-03-11 03:39:26 +0000635 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
636 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000637 Builder.defineMacro("_WIN32");
638 }
639 void getVisualStudioDefines(const LangOptions &Opts,
640 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000641 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000642 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000643 Builder.defineMacro("_CPPRTTI");
644
Reid Kleckner16514352015-01-30 21:42:55 +0000645 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000646 Builder.defineMacro("_CPPUNWIND");
647 }
648
David Majnemer6a658902015-07-22 22:36:26 +0000649 if (Opts.Bool)
650 Builder.defineMacro("__BOOL_DEFINED");
651
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000652 if (!Opts.CharIsSigned)
653 Builder.defineMacro("_CHAR_UNSIGNED");
654
655 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
656 // but it works for now.
657 if (Opts.POSIXThreads)
658 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000659
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000660 if (Opts.MSCompatibilityVersion) {
661 Builder.defineMacro("_MSC_VER",
662 Twine(Opts.MSCompatibilityVersion / 100000));
663 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000664 // FIXME We cannot encode the revision information into 32-bits
665 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000666
David Majnemerb710a932015-05-11 03:57:49 +0000667 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000668 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000669 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000670
671 if (Opts.MicrosoftExt) {
672 Builder.defineMacro("_MSC_EXTENSIONS");
673
674 if (Opts.CPlusPlus11) {
675 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
676 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
677 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
678 }
679 }
680
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000681 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000682 }
683
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000684public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000685 WindowsTargetInfo(const llvm::Triple &Triple)
686 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000687};
688
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000689template <typename Target>
690class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000691protected:
Craig Topper3164f332014-03-11 03:39:26 +0000692 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
693 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000694 if (Opts.POSIXThreads)
695 Builder.defineMacro("_REENTRANT");
696 if (Opts.CPlusPlus)
697 Builder.defineMacro("_GNU_SOURCE");
698
699 DefineStd(Builder, "unix", Opts);
700 Builder.defineMacro("__ELF__");
701 Builder.defineMacro("__native_client__");
702 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000703
704public:
705 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000706 this->UserLabelPrefix = "";
707 this->LongAlign = 32;
708 this->LongWidth = 32;
709 this->PointerAlign = 32;
710 this->PointerWidth = 32;
711 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000712 this->Int64Type = TargetInfo::SignedLongLong;
713 this->DoubleAlign = 64;
714 this->LongDoubleWidth = 64;
715 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000716 this->LongLongWidth = 64;
717 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000718 this->SizeType = TargetInfo::UnsignedInt;
719 this->PtrDiffType = TargetInfo::SignedInt;
720 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000721 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000722 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000723 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000724 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000725 } else if (Triple.getArch() == llvm::Triple::x86) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000726 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000727 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000728 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000729 } else if (Triple.getArch() == llvm::Triple::mipsel) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000730 // Handled on mips' setDataLayoutString.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000731 } else {
732 assert(Triple.getArch() == llvm::Triple::le32);
Eric Christopher964a5f32015-08-05 23:48:05 +0000733 this->DataLayoutString = "e-p:32:32-i64:64";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000734 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000735 }
736};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000737
Dan Gohmanc2853072015-09-03 22:51:53 +0000738namespace {
739// WebAssembly target
740template <typename Target>
741class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
742 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000743 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000744 // A common platform macro.
745 if (Opts.POSIXThreads)
746 Builder.defineMacro("_REENTRANT");
747 // Follow g++ convention and predefine _GNU_SOURCE for C++.
748 if (Opts.CPlusPlus)
749 Builder.defineMacro("_GNU_SOURCE");
750 }
751
752 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000753 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000754 return ".text.__startup";
755 }
756
757public:
758 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
759 : OSTargetInfo<Target>(Triple) {
760 this->MCountName = "__mcount";
761 this->UserLabelPrefix = "";
762 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
763 }
764};
765} // end anonymous namespace
766
Chris Lattner09d98f52008-10-05 21:50:58 +0000767//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000768// Specific target implementations.
769//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000770
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000771// PPC abstract base class
772class PPCTargetInfo : public TargetInfo {
773 static const Builtin::Info BuiltinInfo[];
774 static const char * const GCCRegNames[];
775 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000776 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000777
778 // Target cpu features.
779 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000780 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000781 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000782 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000783 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000784 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000785 bool HasBPERMD;
786 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000787
Ulrich Weigand8afad612014-07-28 13:17:52 +0000788protected:
789 std::string ABI;
790
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000791public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000792 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000793 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000794 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000795 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000796 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000797 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000798 LongDoubleWidth = LongDoubleAlign = 128;
799 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
800 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000801
Hal Finkel6b984f02012-07-03 16:51:04 +0000802 /// \brief Flags for architecture specific defines.
803 typedef enum {
804 ArchDefineNone = 0,
805 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
806 ArchDefinePpcgr = 1 << 1,
807 ArchDefinePpcsq = 1 << 2,
808 ArchDefine440 = 1 << 3,
809 ArchDefine603 = 1 << 4,
810 ArchDefine604 = 1 << 5,
811 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000812 ArchDefinePwr5 = 1 << 7,
813 ArchDefinePwr5x = 1 << 8,
814 ArchDefinePwr6 = 1 << 9,
815 ArchDefinePwr6x = 1 << 10,
816 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000817 ArchDefinePwr8 = 1 << 12,
818 ArchDefineA2 = 1 << 13,
819 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000820 } ArchDefineTypes;
821
Bill Schmidt38378a02013-02-01 20:23:10 +0000822 // Note: GCC recognizes the following additional cpus:
823 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
824 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
825 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000826 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000827 bool CPUKnown = llvm::StringSwitch<bool>(Name)
828 .Case("generic", true)
829 .Case("440", true)
830 .Case("450", true)
831 .Case("601", true)
832 .Case("602", true)
833 .Case("603", true)
834 .Case("603e", true)
835 .Case("603ev", true)
836 .Case("604", true)
837 .Case("604e", true)
838 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000839 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000840 .Case("g3", true)
841 .Case("7400", true)
842 .Case("g4", true)
843 .Case("7450", true)
844 .Case("g4+", true)
845 .Case("750", true)
846 .Case("970", true)
847 .Case("g5", true)
848 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000849 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000850 .Case("e500mc", true)
851 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000852 .Case("power3", true)
853 .Case("pwr3", true)
854 .Case("power4", true)
855 .Case("pwr4", true)
856 .Case("power5", true)
857 .Case("pwr5", true)
858 .Case("power5x", true)
859 .Case("pwr5x", true)
860 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000861 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000862 .Case("power6x", true)
863 .Case("pwr6x", true)
864 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000865 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000866 .Case("power8", true)
867 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000868 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000869 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000870 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000871 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000872 .Case("powerpc64le", true)
873 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000874 .Default(false);
875
876 if (CPUKnown)
877 CPU = Name;
878
879 return CPUKnown;
880 }
881
Ulrich Weigand8afad612014-07-28 13:17:52 +0000882
883 StringRef getABI() const override { return ABI; }
884
Craig Topper3164f332014-03-11 03:39:26 +0000885 void getTargetBuiltins(const Builtin::Info *&Records,
886 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000887 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000888 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000889 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000890
Craig Topper3164f332014-03-11 03:39:26 +0000891 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000892
Craig Topper3164f332014-03-11 03:39:26 +0000893 void getTargetDefines(const LangOptions &Opts,
894 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000895
Eric Christopheref1e2952015-08-28 02:13:58 +0000896 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
897 StringRef CPU,
Eric Christopher007b0a02015-08-28 22:32:01 +0000898 std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000899
Craig Topper3164f332014-03-11 03:39:26 +0000900 bool handleTargetFeatures(std::vector<std::string> &Features,
901 DiagnosticsEngine &Diags) override;
902 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000903 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
904 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000905
906 void getGCCRegNames(const char * const *&Names,
907 unsigned &NumNames) const override;
908 void getGCCRegAliases(const GCCRegAlias *&Aliases,
909 unsigned &NumAliases) const override;
910 bool validateAsmConstraint(const char *&Name,
911 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000912 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000913 default: return false;
914 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000915 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000916 case 'b': // Base register
917 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000918 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000919 break;
920 // FIXME: The following are added to allow parsing.
921 // I just took a guess at what the actions should be.
922 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000923 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000924 case 'v': // Altivec vector register
925 Info.setAllowsRegister();
926 break;
927 case 'w':
928 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000929 case 'd':// VSX vector register to hold vector double data
930 case 'f':// VSX vector register to hold vector float data
931 case 's':// VSX vector register to hold scalar float data
932 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000933 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000934 break;
935 default:
936 return false;
937 }
938 Info.setAllowsRegister();
939 Name++; // Skip over 'w'.
940 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000941 case 'h': // `MQ', `CTR', or `LINK' register
942 case 'q': // `MQ' register
943 case 'c': // `CTR' register
944 case 'l': // `LINK' register
945 case 'x': // `CR' register (condition register) number 0
946 case 'y': // `CR' register (condition register)
947 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000948 Info.setAllowsRegister();
949 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000950 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000951 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000952 // (use `L' instead for SImode constants)
953 case 'K': // Unsigned 16-bit constant
954 case 'L': // Signed 16-bit constant shifted left 16 bits
955 case 'M': // Constant larger than 31
956 case 'N': // Exact power of 2
957 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000958 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000959 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000960 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000961 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000962 break;
963 case 'm': // Memory operand. Note that on PowerPC targets, m can
964 // include addresses that update the base register. It
965 // is therefore only safe to use `m' in an asm statement
966 // if that asm statement accesses the operand exactly once.
967 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000968 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000969 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000970 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000971 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000972 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
973 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000974 // register to be updated.
975 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000976 if (Name[1] != 's')
977 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000978 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000979 // include any automodification of the base register. Unlike
980 // `m', this constraint can be used in asm statements that
981 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000982 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000983 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000984 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000985 break;
986 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000987 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000988 case 'Z': // Memory operand that is an indexed or indirect from a
989 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000990 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000991 Info.setAllowsMemory();
992 Info.setAllowsRegister();
993 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000994 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000995 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000996 // register (`p' is preferable for asm statements)
997 case 'S': // Constant suitable as a 64-bit mask operand
998 case 'T': // Constant suitable as a 32-bit mask operand
999 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001000 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001001 // instructions
1002 case 'W': // Vector constant that does not require memory
1003 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001004 break;
1005 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001006 }
John Thompson07a61a42010-06-24 22:44:13 +00001007 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001008 }
Craig Topper3164f332014-03-11 03:39:26 +00001009 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001010 std::string R;
1011 switch (*Constraint) {
1012 case 'e':
1013 case 'w':
1014 // Two-character constraint; add "^" hint for later parsing.
1015 R = std::string("^") + std::string(Constraint, 2);
1016 Constraint++;
1017 break;
1018 default:
1019 return TargetInfo::convertConstraint(Constraint);
1020 }
1021 return R;
1022 }
Craig Topper3164f332014-03-11 03:39:26 +00001023 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001024 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001025 }
Craig Topper3164f332014-03-11 03:39:26 +00001026 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001027 if (RegNo == 0) return 3;
1028 if (RegNo == 1) return 4;
1029 return -1;
1030 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001031
1032 bool hasSjLjLowering() const override {
1033 return true;
1034 }
David Majnemer2617ea62015-06-09 18:05:33 +00001035
1036 bool useFloat128ManglingForLongDouble() const override {
1037 return LongDoubleWidth == 128 &&
1038 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1039 getTriple().isOSBinFormatELF();
1040 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001041};
Anders Carlssonf511f642007-11-27 04:11:28 +00001042
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001043const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001044#define BUILTIN(ID, TYPE, ATTRS) \
1045 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1046#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1047 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001048#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001049};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001050
Eric Christopher917e9522014-11-18 22:36:15 +00001051/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001052/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001053bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001054 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001055 for (const auto &Feature : Features) {
1056 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001057 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001058 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001059 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001060 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001061 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001062 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001063 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001064 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001065 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001066 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001067 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001068 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001069 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001070 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001071 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001072 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001073 // TODO: Finish this list and add an assert that we've handled them
1074 // all.
1075 }
Eric Christopher02c33352015-08-25 00:59:11 +00001076
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001077 return true;
1078}
1079
Chris Lattnerecd49032009-03-02 22:27:17 +00001080/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1081/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001082void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001083 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001084 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001085 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001086 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001087 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001088 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001089 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001090 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001091 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001092 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001093 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001094 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001095 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001096
Chris Lattnerecd49032009-03-02 22:27:17 +00001097 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001098 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1099 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001100 } else {
1101 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1102 getTriple().getOS() != llvm::Triple::OpenBSD)
1103 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001104 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001105
Ulrich Weigand8afad612014-07-28 13:17:52 +00001106 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001107 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001108 Builder.defineMacro("_CALL_ELF", "1");
1109 if (ABI == "elfv2")
1110 Builder.defineMacro("_CALL_ELF", "2");
1111
Chris Lattnerecd49032009-03-02 22:27:17 +00001112 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001113 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1114 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001115
Chris Lattnerecd49032009-03-02 22:27:17 +00001116 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001117 if (LongDoubleWidth == 128)
1118 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001119
John Thompsone467e192009-11-19 17:18:50 +00001120 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001121 Builder.defineMacro("__VEC__", "10206");
1122 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001123 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001124
1125 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001126 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1127 .Case("440", ArchDefineName)
1128 .Case("450", ArchDefineName | ArchDefine440)
1129 .Case("601", ArchDefineName)
1130 .Case("602", ArchDefineName | ArchDefinePpcgr)
1131 .Case("603", ArchDefineName | ArchDefinePpcgr)
1132 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1133 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1134 .Case("604", ArchDefineName | ArchDefinePpcgr)
1135 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1136 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001137 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001138 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1139 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1140 .Case("750", ArchDefineName | ArchDefinePpcgr)
1141 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1142 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001143 .Case("a2", ArchDefineA2)
1144 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001145 .Case("pwr3", ArchDefinePpcgr)
1146 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1147 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1148 | ArchDefinePpcsq)
1149 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1150 | ArchDefinePpcgr | ArchDefinePpcsq)
1151 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1152 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1153 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1154 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1155 | ArchDefinePpcsq)
1156 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1157 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001158 | ArchDefinePpcgr | ArchDefinePpcsq)
1159 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1160 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1161 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001162 .Case("power3", ArchDefinePpcgr)
1163 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1164 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1165 | ArchDefinePpcsq)
1166 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1167 | ArchDefinePpcgr | ArchDefinePpcsq)
1168 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1169 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1170 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1171 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1172 | ArchDefinePpcsq)
1173 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1174 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001175 | ArchDefinePpcgr | ArchDefinePpcsq)
1176 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1177 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1178 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001179 .Default(ArchDefineNone);
1180
1181 if (defs & ArchDefineName)
1182 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1183 if (defs & ArchDefinePpcgr)
1184 Builder.defineMacro("_ARCH_PPCGR");
1185 if (defs & ArchDefinePpcsq)
1186 Builder.defineMacro("_ARCH_PPCSQ");
1187 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001188 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001189 if (defs & ArchDefine603)
1190 Builder.defineMacro("_ARCH_603");
1191 if (defs & ArchDefine604)
1192 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001193 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001194 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001195 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001196 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001197 if (defs & ArchDefinePwr5x)
1198 Builder.defineMacro("_ARCH_PWR5X");
1199 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001200 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001201 if (defs & ArchDefinePwr6x)
1202 Builder.defineMacro("_ARCH_PWR6X");
1203 if (defs & ArchDefinePwr7)
1204 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001205 if (defs & ArchDefinePwr8)
1206 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001207 if (defs & ArchDefineA2)
1208 Builder.defineMacro("_ARCH_A2");
1209 if (defs & ArchDefineA2q) {
1210 Builder.defineMacro("_ARCH_A2Q");
1211 Builder.defineMacro("_ARCH_QP");
1212 }
1213
1214 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1215 Builder.defineMacro("__bg__");
1216 Builder.defineMacro("__THW_BLUEGENE__");
1217 Builder.defineMacro("__bgq__");
1218 Builder.defineMacro("__TOS_BGQ__");
1219 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001220
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001221 if (HasVSX)
1222 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001223 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001224 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001225 if (HasP8Crypto)
1226 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001227 if (HasHTM)
1228 Builder.defineMacro("__HTM__");
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001229 if (getTriple().getArch() == llvm::Triple::ppc64le ||
Nemanja Ivanovice97e1112015-05-14 20:02:24 +00001230 (defs & ArchDefinePwr8) || (CPU == "pwr8")) {
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001231 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1232 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1233 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1234 if (PointerWidth == 64)
1235 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1236 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001237
Bill Schmidt38378a02013-02-01 20:23:10 +00001238 // FIXME: The following are not yet generated here by Clang, but are
1239 // generated by GCC:
1240 //
1241 // _SOFT_FLOAT_
1242 // __RECIP_PRECISION__
1243 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001244 // __RECIP__
1245 // __RECIPF__
1246 // __RSQRTE__
1247 // __RSQRTEF__
1248 // _SOFT_DOUBLE_
1249 // __NO_LWSYNC__
1250 // __HAVE_BSWAP__
1251 // __LONGDOUBLE128
1252 // __CMODEL_MEDIUM__
1253 // __CMODEL_LARGE__
1254 // _CALL_SYSV
1255 // _CALL_DARWIN
1256 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001257}
1258
Eric Christophera8a14c32015-08-31 18:39:16 +00001259// Handle explicit options being passed to the compiler here: if we've
1260// explicitly turned off vsx and turned on power8-vector or direct-move then
1261// go ahead and error since the customer has expressed a somewhat incompatible
1262// set of options.
1263static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
1264 std::vector<std::string> &FeaturesVec) {
1265
1266 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1267 FeaturesVec.end()) {
1268 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1269 FeaturesVec.end()) {
1270 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1271 << "-mno-vsx";
1272 return false;
1273 }
1274
1275 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1276 FeaturesVec.end()) {
1277 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1278 << "-mno-vsx";
1279 return false;
1280 }
1281 }
1282
1283 return true;
1284}
1285
1286bool PPCTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
1287 DiagnosticsEngine &Diags, StringRef CPU,
1288 std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001289 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1290 .Case("7400", true)
1291 .Case("g4", true)
1292 .Case("7450", true)
1293 .Case("g4+", true)
1294 .Case("970", true)
1295 .Case("g5", true)
1296 .Case("pwr6", true)
1297 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001298 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001299 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001300 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001301 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001302
1303 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001304 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1305 .Case("ppc64le", true)
1306 .Case("pwr8", true)
1307 .Default(false);
1308 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1309 .Case("ppc64le", true)
1310 .Case("pwr8", true)
1311 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001312 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1313 .Case("ppc64le", true)
1314 .Case("pwr8", true)
1315 .Case("pwr7", true)
1316 .Default(false);
1317 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1318 .Case("ppc64le", true)
1319 .Case("pwr8", true)
1320 .Case("pwr7", true)
1321 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001322 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1323 .Case("ppc64le", true)
1324 .Case("pwr8", true)
1325 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001326 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1327 .Case("ppc64le", true)
1328 .Case("pwr8", true)
1329 .Case("pwr7", true)
1330 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001331
Eric Christophera8a14c32015-08-31 18:39:16 +00001332 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1333 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001334
Eric Christopher007b0a02015-08-28 22:32:01 +00001335 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001336}
1337
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001338bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001339 return llvm::StringSwitch<bool>(Feature)
1340 .Case("powerpc", true)
1341 .Case("vsx", HasVSX)
1342 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001343 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001344 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001345 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001346 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001347 .Case("bpermd", HasBPERMD)
1348 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001349 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001350}
Chris Lattner17df24e2008-04-21 18:56:49 +00001351
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001352void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1353 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001354 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1355 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1356 // incompatible options.
1357 if (Enabled) {
1358 if (Name == "vsx") {
1359 Features[Name] = true;
1360 } else if (Name == "direct-move") {
1361 Features[Name] = Features["vsx"] = true;
1362 } else if (Name == "power8-vector") {
1363 Features[Name] = Features["vsx"] = true;
1364 } else {
1365 Features[Name] = true;
1366 }
1367 } else {
1368 if (Name == "vsx") {
1369 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1370 false;
1371 } else {
1372 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001373 }
1374 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001375}
1376
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001377const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001378 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1379 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1380 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1381 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1382 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1383 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1384 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1385 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001386 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001387 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001388 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001389 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1390 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1391 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1392 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001393 "vrsave", "vscr",
1394 "spe_acc", "spefscr",
1395 "sfp"
1396};
Chris Lattner10a5b382007-01-29 05:24:35 +00001397
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001398void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001399 unsigned &NumNames) const {
1400 Names = GCCRegNames;
1401 NumNames = llvm::array_lengthof(GCCRegNames);
1402}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001403
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001404const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1405 // While some of these aliases do map to different registers
1406 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001407 { { "0" }, "r0" },
1408 { { "1"}, "r1" },
1409 { { "2" }, "r2" },
1410 { { "3" }, "r3" },
1411 { { "4" }, "r4" },
1412 { { "5" }, "r5" },
1413 { { "6" }, "r6" },
1414 { { "7" }, "r7" },
1415 { { "8" }, "r8" },
1416 { { "9" }, "r9" },
1417 { { "10" }, "r10" },
1418 { { "11" }, "r11" },
1419 { { "12" }, "r12" },
1420 { { "13" }, "r13" },
1421 { { "14" }, "r14" },
1422 { { "15" }, "r15" },
1423 { { "16" }, "r16" },
1424 { { "17" }, "r17" },
1425 { { "18" }, "r18" },
1426 { { "19" }, "r19" },
1427 { { "20" }, "r20" },
1428 { { "21" }, "r21" },
1429 { { "22" }, "r22" },
1430 { { "23" }, "r23" },
1431 { { "24" }, "r24" },
1432 { { "25" }, "r25" },
1433 { { "26" }, "r26" },
1434 { { "27" }, "r27" },
1435 { { "28" }, "r28" },
1436 { { "29" }, "r29" },
1437 { { "30" }, "r30" },
1438 { { "31" }, "r31" },
1439 { { "fr0" }, "f0" },
1440 { { "fr1" }, "f1" },
1441 { { "fr2" }, "f2" },
1442 { { "fr3" }, "f3" },
1443 { { "fr4" }, "f4" },
1444 { { "fr5" }, "f5" },
1445 { { "fr6" }, "f6" },
1446 { { "fr7" }, "f7" },
1447 { { "fr8" }, "f8" },
1448 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001449 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001450 { { "fr11" }, "f11" },
1451 { { "fr12" }, "f12" },
1452 { { "fr13" }, "f13" },
1453 { { "fr14" }, "f14" },
1454 { { "fr15" }, "f15" },
1455 { { "fr16" }, "f16" },
1456 { { "fr17" }, "f17" },
1457 { { "fr18" }, "f18" },
1458 { { "fr19" }, "f19" },
1459 { { "fr20" }, "f20" },
1460 { { "fr21" }, "f21" },
1461 { { "fr22" }, "f22" },
1462 { { "fr23" }, "f23" },
1463 { { "fr24" }, "f24" },
1464 { { "fr25" }, "f25" },
1465 { { "fr26" }, "f26" },
1466 { { "fr27" }, "f27" },
1467 { { "fr28" }, "f28" },
1468 { { "fr29" }, "f29" },
1469 { { "fr30" }, "f30" },
1470 { { "fr31" }, "f31" },
1471 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001472};
1473
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001474void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001475 unsigned &NumAliases) const {
1476 Aliases = GCCRegAliases;
1477 NumAliases = llvm::array_lengthof(GCCRegAliases);
1478}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001479
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001480class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001481public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001482 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001483 DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001484
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001485 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001486 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001487 case llvm::Triple::FreeBSD:
1488 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001489 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001490 PtrDiffType = SignedInt;
1491 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001492 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001493 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001494 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001495 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001496
Roman Divacky3ffe7462012-03-13 19:20:17 +00001497 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1498 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001499 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001500 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001501
1502 // PPC32 supports atomics up to 4 bytes.
1503 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001504 }
1505
Craig Topper3164f332014-03-11 03:39:26 +00001506 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001507 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001508 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001509 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001510};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001511
Bill Schmidt778d3872013-07-26 01:36:11 +00001512// Note: ABI differences may eventually require us to have a separate
1513// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001514class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001515public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001516 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001517 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001518 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001519 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001520
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001521 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001522 DataLayoutString = "e-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001523 ABI = "elfv2";
1524 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001525 DataLayoutString = "E-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001526 ABI = "elfv1";
1527 }
1528
1529 switch (getTriple().getOS()) {
1530 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001531 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001532 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001533 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001534 case llvm::Triple::NetBSD:
1535 IntMaxType = SignedLongLong;
1536 Int64Type = SignedLongLong;
1537 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001538 default:
1539 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001540 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001541
1542 // PPC64 supports atomics up to 8 bytes.
1543 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001544 }
Craig Topper3164f332014-03-11 03:39:26 +00001545 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001546 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001547 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001548 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001549 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001550 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001551 ABI = Name;
1552 return true;
1553 }
1554 return false;
1555 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001556};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001557
Roman Divacky965b0b72011-01-06 08:27:10 +00001558class DarwinPPC32TargetInfo :
1559 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001560public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001561 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1562 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001563 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001564 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001565 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001566 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001567 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001568 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001569 }
Craig Topper3164f332014-03-11 03:39:26 +00001570 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001571 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001572 }
1573};
1574
1575class DarwinPPC64TargetInfo :
1576 public DarwinTargetInfo<PPC64TargetInfo> {
1577public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001578 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1579 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001580 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001581 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001582 DataLayoutString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001583 }
1584};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001585
Peter Collingbournec947aae2012-05-20 23:28:41 +00001586 static const unsigned NVPTXAddrSpaceMap[] = {
1587 1, // opencl_global
1588 3, // opencl_local
1589 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001590 // FIXME: generic has to be added to the target
1591 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001592 1, // cuda_device
1593 4, // cuda_constant
1594 3, // cuda_shared
1595 };
1596 class NVPTXTargetInfo : public TargetInfo {
1597 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001598 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001599
1600 // The GPU profiles supported by the NVPTX backend
1601 enum GPUKind {
1602 GK_NONE,
1603 GK_SM20,
1604 GK_SM21,
1605 GK_SM30,
1606 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001607 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001608 } GPU;
1609
Peter Collingbournec947aae2012-05-20 23:28:41 +00001610 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001611 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001612 BigEndian = false;
1613 TLSSupported = false;
1614 LongWidth = LongAlign = 64;
1615 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001616 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001617 // Define available target features
1618 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001619 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001620 // Set the default GPU to sm20
1621 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001622 }
Craig Topper3164f332014-03-11 03:39:26 +00001623 void getTargetDefines(const LangOptions &Opts,
1624 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001625 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001626 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001627 if (Opts.CUDAIsDevice) {
1628 // Set __CUDA_ARCH__ for the GPU specified.
1629 std::string CUDAArchCode;
1630 switch (GPU) {
1631 case GK_SM20:
1632 CUDAArchCode = "200";
1633 break;
1634 case GK_SM21:
1635 CUDAArchCode = "210";
1636 break;
1637 case GK_SM30:
1638 CUDAArchCode = "300";
1639 break;
1640 case GK_SM35:
1641 CUDAArchCode = "350";
1642 break;
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001643 case GK_SM37:
1644 CUDAArchCode = "370";
1645 break;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001646 default:
1647 llvm_unreachable("Unhandled target CPU");
1648 }
1649 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1650 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001651 }
Craig Topper3164f332014-03-11 03:39:26 +00001652 void getTargetBuiltins(const Builtin::Info *&Records,
1653 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001654 Records = BuiltinInfo;
1655 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001656 }
Craig Topper3164f332014-03-11 03:39:26 +00001657 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001658 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001659 }
Craig Topper3164f332014-03-11 03:39:26 +00001660
1661 void getGCCRegNames(const char * const *&Names,
1662 unsigned &NumNames) const override;
1663 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1664 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001665 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001666 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001667 NumAliases = 0;
1668 }
Eric Christopher917e9522014-11-18 22:36:15 +00001669 bool
1670 validateAsmConstraint(const char *&Name,
1671 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001672 switch (*Name) {
1673 default: return false;
1674 case 'c':
1675 case 'h':
1676 case 'r':
1677 case 'l':
1678 case 'f':
1679 case 'd':
1680 Info.setAllowsRegister();
1681 return true;
1682 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001683 }
Craig Topper3164f332014-03-11 03:39:26 +00001684 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001685 // FIXME: Is this really right?
1686 return "";
1687 }
Craig Topper3164f332014-03-11 03:39:26 +00001688 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001689 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001690 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001691 }
Craig Topper3164f332014-03-11 03:39:26 +00001692 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001693 GPU = llvm::StringSwitch<GPUKind>(Name)
1694 .Case("sm_20", GK_SM20)
1695 .Case("sm_21", GK_SM21)
1696 .Case("sm_30", GK_SM30)
1697 .Case("sm_35", GK_SM35)
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001698 .Case("sm_37", GK_SM37)
Reid Klecknerbbc01782014-12-03 21:53:36 +00001699 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001700
Reid Klecknerbbc01782014-12-03 21:53:36 +00001701 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001702 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001703 };
1704
1705 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001706#define BUILTIN(ID, TYPE, ATTRS) \
1707 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1708#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1709 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Justin Holewinski83e96682012-05-24 17:43:12 +00001710#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001711 };
1712
1713 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1714 "r0"
1715 };
1716
1717 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1718 unsigned &NumNames) const {
1719 Names = GCCRegNames;
1720 NumNames = llvm::array_lengthof(GCCRegNames);
1721 }
1722
1723 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1724 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001725 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001726 PointerWidth = PointerAlign = 32;
Eli Bendersky13467172015-04-01 20:29:18 +00001727 SizeType = TargetInfo::UnsignedInt;
1728 PtrDiffType = TargetInfo::SignedInt;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001729 IntPtrType = TargetInfo::SignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +00001730 DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001731 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001732 };
1733
1734 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1735 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001736 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001737 PointerWidth = PointerAlign = 64;
Eli Bendersky13467172015-04-01 20:29:18 +00001738 SizeType = TargetInfo::UnsignedLong;
1739 PtrDiffType = TargetInfo::SignedLong;
Eli Bendersky15f63422015-04-01 18:29:27 +00001740 IntPtrType = TargetInfo::SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00001741 DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001742 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001743 };
Eli Friedmand13b41e2012-10-12 23:32:00 +00001744
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001745static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001746 1, // opencl_global
1747 3, // opencl_local
1748 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001749 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001750 1, // cuda_device
1751 2, // cuda_constant
1752 3 // cuda_shared
1753};
1754
Tom Stellarda96344b2014-08-21 13:58:40 +00001755// If you edit the description strings, make sure you update
1756// getPointerWidthV().
1757
Eric Christopher964a5f32015-08-05 23:48:05 +00001758static const char *DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001759 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1760 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001761
Eric Christopher964a5f32015-08-05 23:48:05 +00001762static const char *DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001763 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1764 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001765
Eric Christopher964a5f32015-08-05 23:48:05 +00001766static const char *DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001767 "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 +00001768 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1769 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001770
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001771class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001772 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001773 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001774
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001775 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001776 enum GPUKind {
1777 GK_NONE,
1778 GK_R600,
1779 GK_R600_DOUBLE_OPS,
1780 GK_R700,
1781 GK_R700_DOUBLE_OPS,
1782 GK_EVERGREEN,
1783 GK_EVERGREEN_DOUBLE_OPS,
1784 GK_NORTHERN_ISLANDS,
1785 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001786 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001787 GK_SEA_ISLANDS,
1788 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001789 } GPU;
1790
Jan Veselyeebeaea2015-05-04 19:53:36 +00001791 bool hasFP64:1;
1792 bool hasFMAF:1;
1793 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001794
Eli Friedmand13b41e2012-10-12 23:32:00 +00001795public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001796 AMDGPUTargetInfo(const llvm::Triple &Triple)
1797 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001798
1799 if (Triple.getArch() == llvm::Triple::amdgcn) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001800 DataLayoutString = DataLayoutStringSI;
Tom Stellardd99fb952015-01-28 15:38:44 +00001801 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001802 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001803 hasFMAF = true;
1804 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001805 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001806 DataLayoutString = DataLayoutStringR600;
Tom Stellardd99fb952015-01-28 15:38:44 +00001807 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001808 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001809 hasFMAF = false;
1810 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001811 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001812 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001813 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001814 }
1815
Tom Stellarda96344b2014-08-21 13:58:40 +00001816 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1817 if (GPU <= GK_CAYMAN)
1818 return 32;
1819
1820 switch(AddrSpace) {
1821 default:
1822 return 64;
1823 case 0:
1824 case 3:
1825 case 5:
1826 return 32;
1827 }
1828 }
1829
Craig Topper3164f332014-03-11 03:39:26 +00001830 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001831 return "";
1832 }
1833
Craig Topper3164f332014-03-11 03:39:26 +00001834 void getGCCRegNames(const char * const *&Names,
Tom Stellard7b1059b2015-04-14 14:36:56 +00001835 unsigned &NumNames) const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001836
Craig Topper3164f332014-03-11 03:39:26 +00001837 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1838 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001839 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001840 NumAliases = 0;
1841 }
1842
Craig Topper3164f332014-03-11 03:39:26 +00001843 bool validateAsmConstraint(const char *&Name,
1844 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001845 return true;
1846 }
1847
Craig Topper3164f332014-03-11 03:39:26 +00001848 void getTargetBuiltins(const Builtin::Info *&Records,
1849 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001850 Records = BuiltinInfo;
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001851 NumRecords = clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001852 }
1853
Craig Topper3164f332014-03-11 03:39:26 +00001854 void getTargetDefines(const LangOptions &Opts,
1855 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001856 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001857 if (hasFMAF)
1858 Builder.defineMacro("__HAS_FMAF__");
1859 if (hasLDEXPF)
1860 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001861 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001862 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001863 if (Opts.OpenCL) {
1864 if (GPU >= GK_NORTHERN_ISLANDS) {
1865 Builder.defineMacro("cl_khr_byte_addressable_store");
1866 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1867 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1868 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1869 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1870 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001871 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001872 }
1873
Craig Topper3164f332014-03-11 03:39:26 +00001874 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001875 return TargetInfo::CharPtrBuiltinVaList;
1876 }
1877
Craig Topper3164f332014-03-11 03:39:26 +00001878 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001879 GPU = llvm::StringSwitch<GPUKind>(Name)
1880 .Case("r600" , GK_R600)
1881 .Case("rv610", GK_R600)
1882 .Case("rv620", GK_R600)
1883 .Case("rv630", GK_R600)
1884 .Case("rv635", GK_R600)
1885 .Case("rs780", GK_R600)
1886 .Case("rs880", GK_R600)
1887 .Case("rv670", GK_R600_DOUBLE_OPS)
1888 .Case("rv710", GK_R700)
1889 .Case("rv730", GK_R700)
1890 .Case("rv740", GK_R700_DOUBLE_OPS)
1891 .Case("rv770", GK_R700_DOUBLE_OPS)
1892 .Case("palm", GK_EVERGREEN)
1893 .Case("cedar", GK_EVERGREEN)
1894 .Case("sumo", GK_EVERGREEN)
1895 .Case("sumo2", GK_EVERGREEN)
1896 .Case("redwood", GK_EVERGREEN)
1897 .Case("juniper", GK_EVERGREEN)
1898 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1899 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1900 .Case("barts", GK_NORTHERN_ISLANDS)
1901 .Case("turks", GK_NORTHERN_ISLANDS)
1902 .Case("caicos", GK_NORTHERN_ISLANDS)
1903 .Case("cayman", GK_CAYMAN)
1904 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001905 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001906 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1907 .Case("verde", GK_SOUTHERN_ISLANDS)
1908 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001909 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001910 .Case("bonaire", GK_SEA_ISLANDS)
1911 .Case("kabini", GK_SEA_ISLANDS)
1912 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001913 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001914 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001915 .Case("tonga", GK_VOLCANIC_ISLANDS)
1916 .Case("iceland", GK_VOLCANIC_ISLANDS)
1917 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001918 .Default(GK_NONE);
1919
1920 if (GPU == GK_NONE) {
1921 return false;
1922 }
1923
1924 // Set the correct data layout
1925 switch (GPU) {
1926 case GK_NONE:
1927 case GK_R600:
1928 case GK_R700:
1929 case GK_EVERGREEN:
1930 case GK_NORTHERN_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001931 DataLayoutString = DataLayoutStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001932 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001933 hasFMAF = false;
1934 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001935 break;
1936 case GK_R600_DOUBLE_OPS:
1937 case GK_R700_DOUBLE_OPS:
1938 case GK_EVERGREEN_DOUBLE_OPS:
1939 case GK_CAYMAN:
Eric Christopher964a5f32015-08-05 23:48:05 +00001940 DataLayoutString = DataLayoutStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001941 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001942 hasFMAF = true;
1943 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001944 break;
1945 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001946 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001947 case GK_VOLCANIC_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001948 DataLayoutString = DataLayoutStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001949 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001950 hasFMAF = true;
1951 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001952 break;
1953 }
1954
1955 return true;
1956 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001957};
1958
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001959const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001960#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001961 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001962#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001963};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001964const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001965 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1966 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1967 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1968 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1969 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1970 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1971 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1972 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1973 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1974 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1975 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1976 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1977 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1978 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1979 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1980 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1981 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1982 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1983 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1984 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1985 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1986 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1987 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1988 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1989 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1990 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1991 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1992 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1993 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1994 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1995 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1996 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1997 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1998 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1999 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2000 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2001 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2002 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2003 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2004 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2005 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2006 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2007 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2008 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2009 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2010 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2011 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
2012 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
2013 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
2014 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
2015};
2016
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002017void AMDGPUTargetInfo::getGCCRegNames(const char * const *&Names,
2018 unsigned &NumNames) const {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002019 Names = GCCRegNames;
2020 NumNames = llvm::array_lengthof(GCCRegNames);
2021}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002022
Eli Friedman3fd920a2008-08-20 02:34:37 +00002023// Namespace for x86 abstract base class
2024const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002025#define BUILTIN(ID, TYPE, ATTRS) \
2026 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002027#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002028 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002029#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002030 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002031#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002032};
Eli Friedmanb5366062008-05-20 14:21:01 +00002033
Nuno Lopescfca1f02009-12-23 17:49:57 +00002034static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002035 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2036 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002037 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002038 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2039 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2040 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002041 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002042 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2043 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002044};
2045
Eric Christophercdd36352011-06-21 00:05:20 +00002046const TargetInfo::AddlRegName AddlRegNames[] = {
2047 { { "al", "ah", "eax", "rax" }, 0 },
2048 { { "bl", "bh", "ebx", "rbx" }, 3 },
2049 { { "cl", "ch", "ecx", "rcx" }, 2 },
2050 { { "dl", "dh", "edx", "rdx" }, 1 },
2051 { { "esi", "rsi" }, 4 },
2052 { { "edi", "rdi" }, 5 },
2053 { { "esp", "rsp" }, 7 },
2054 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002055 { { "r8d", "r8w", "r8b" }, 38 },
2056 { { "r9d", "r9w", "r9b" }, 39 },
2057 { { "r10d", "r10w", "r10b" }, 40 },
2058 { { "r11d", "r11w", "r11b" }, 41 },
2059 { { "r12d", "r12w", "r12b" }, 42 },
2060 { { "r13d", "r13w", "r13b" }, 43 },
2061 { { "r14d", "r14w", "r14b" }, 44 },
2062 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002063};
2064
2065// X86 target abstract base class; x86-32 and x86-64 are very close, so
2066// most of the implementation can be shared.
2067class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002068 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002069 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00002070 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00002071 enum MMX3DNowEnum {
2072 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
2073 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002074 enum XOPEnum {
2075 NoXOP,
2076 SSE4A,
2077 FMA4,
2078 XOP
2079 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00002080
Eric Christophere1ddaf92010-04-02 23:50:19 +00002081 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00002082 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00002083 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00002084 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00002085 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00002086 bool HasBMI;
2087 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00002088 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00002089 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00002090 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00002091 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00002092 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002093 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00002094 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00002095 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00002096 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
2097 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00002098 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002099 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002100
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002101 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2102 ///
2103 /// Each enumeration represents a particular CPU supported by Clang. These
2104 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2105 enum CPUKind {
2106 CK_Generic,
2107
2108 /// \name i386
2109 /// i386-generation processors.
2110 //@{
2111 CK_i386,
2112 //@}
2113
2114 /// \name i486
2115 /// i486-generation processors.
2116 //@{
2117 CK_i486,
2118 CK_WinChipC6,
2119 CK_WinChip2,
2120 CK_C3,
2121 //@}
2122
2123 /// \name i586
2124 /// i586-generation processors, P5 microarchitecture based.
2125 //@{
2126 CK_i586,
2127 CK_Pentium,
2128 CK_PentiumMMX,
2129 //@}
2130
2131 /// \name i686
2132 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2133 //@{
2134 CK_i686,
2135 CK_PentiumPro,
2136 CK_Pentium2,
2137 CK_Pentium3,
2138 CK_Pentium3M,
2139 CK_PentiumM,
2140 CK_C3_2,
2141
2142 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2143 /// Clang however has some logic to suport this.
2144 // FIXME: Warn, deprecate, and potentially remove this.
2145 CK_Yonah,
2146 //@}
2147
2148 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002149 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002150 //@{
2151 CK_Pentium4,
2152 CK_Pentium4M,
2153 CK_Prescott,
2154 CK_Nocona,
2155 //@}
2156
2157 /// \name Core
2158 /// Core microarchitecture based processors.
2159 //@{
2160 CK_Core2,
2161
2162 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2163 /// codename which GCC no longer accepts as an option to -march, but Clang
2164 /// has some logic for recognizing it.
2165 // FIXME: Warn, deprecate, and potentially remove this.
2166 CK_Penryn,
2167 //@}
2168
2169 /// \name Atom
2170 /// Atom processors
2171 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002172 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002173 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002174 //@}
2175
2176 /// \name Nehalem
2177 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002178 CK_Nehalem,
2179
2180 /// \name Westmere
2181 /// Westmere microarchitecture based processors.
2182 CK_Westmere,
2183
2184 /// \name Sandy Bridge
2185 /// Sandy Bridge microarchitecture based processors.
2186 CK_SandyBridge,
2187
2188 /// \name Ivy Bridge
2189 /// Ivy Bridge microarchitecture based processors.
2190 CK_IvyBridge,
2191
2192 /// \name Haswell
2193 /// Haswell microarchitecture based processors.
2194 CK_Haswell,
2195
2196 /// \name Broadwell
2197 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002198 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002199
2200 /// \name Skylake
2201 /// Skylake microarchitecture based processors.
2202 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002203
Craig Topper449314e2013-08-20 07:09:39 +00002204 /// \name Knights Landing
2205 /// Knights Landing processor.
2206 CK_KNL,
2207
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002208 /// \name K6
2209 /// K6 architecture processors.
2210 //@{
2211 CK_K6,
2212 CK_K6_2,
2213 CK_K6_3,
2214 //@}
2215
2216 /// \name K7
2217 /// K7 architecture processors.
2218 //@{
2219 CK_Athlon,
2220 CK_AthlonThunderbird,
2221 CK_Athlon4,
2222 CK_AthlonXP,
2223 CK_AthlonMP,
2224 //@}
2225
2226 /// \name K8
2227 /// K8 architecture processors.
2228 //@{
2229 CK_Athlon64,
2230 CK_Athlon64SSE3,
2231 CK_AthlonFX,
2232 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002233 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002234 CK_Opteron,
2235 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002236 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002237 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002238
Benjamin Kramer569f2152012-01-10 11:50:18 +00002239 /// \name Bobcat
2240 /// Bobcat architecture processors.
2241 //@{
2242 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002243 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002244 //@}
2245
2246 /// \name Bulldozer
2247 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002248 //@{
2249 CK_BDVER1,
2250 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002251 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002252 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002253 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002254
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002255 /// This specification is deprecated and will be removed in the future.
2256 /// Users should prefer \see CK_K8.
2257 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002258 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002259 CK_x86_64,
2260 //@}
2261
2262 /// \name Geode
2263 /// Geode processors.
2264 //@{
2265 CK_Geode
2266 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002267 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002268
Eric Christopherc50738f2015-08-27 00:05:50 +00002269 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002270 return llvm::StringSwitch<CPUKind>(CPU)
2271 .Case("i386", CK_i386)
2272 .Case("i486", CK_i486)
2273 .Case("winchip-c6", CK_WinChipC6)
2274 .Case("winchip2", CK_WinChip2)
2275 .Case("c3", CK_C3)
2276 .Case("i586", CK_i586)
2277 .Case("pentium", CK_Pentium)
2278 .Case("pentium-mmx", CK_PentiumMMX)
2279 .Case("i686", CK_i686)
2280 .Case("pentiumpro", CK_PentiumPro)
2281 .Case("pentium2", CK_Pentium2)
2282 .Case("pentium3", CK_Pentium3)
2283 .Case("pentium3m", CK_Pentium3M)
2284 .Case("pentium-m", CK_PentiumM)
2285 .Case("c3-2", CK_C3_2)
2286 .Case("yonah", CK_Yonah)
2287 .Case("pentium4", CK_Pentium4)
2288 .Case("pentium4m", CK_Pentium4M)
2289 .Case("prescott", CK_Prescott)
2290 .Case("nocona", CK_Nocona)
2291 .Case("core2", CK_Core2)
2292 .Case("penryn", CK_Penryn)
2293 .Case("bonnell", CK_Bonnell)
2294 .Case("atom", CK_Bonnell) // Legacy name.
2295 .Case("silvermont", CK_Silvermont)
2296 .Case("slm", CK_Silvermont) // Legacy name.
2297 .Case("nehalem", CK_Nehalem)
2298 .Case("corei7", CK_Nehalem) // Legacy name.
2299 .Case("westmere", CK_Westmere)
2300 .Case("sandybridge", CK_SandyBridge)
2301 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2302 .Case("ivybridge", CK_IvyBridge)
2303 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2304 .Case("haswell", CK_Haswell)
2305 .Case("core-avx2", CK_Haswell) // Legacy name.
2306 .Case("broadwell", CK_Broadwell)
2307 .Case("skylake", CK_Skylake)
2308 .Case("skx", CK_Skylake) // Legacy name.
2309 .Case("knl", CK_KNL)
2310 .Case("k6", CK_K6)
2311 .Case("k6-2", CK_K6_2)
2312 .Case("k6-3", CK_K6_3)
2313 .Case("athlon", CK_Athlon)
2314 .Case("athlon-tbird", CK_AthlonThunderbird)
2315 .Case("athlon-4", CK_Athlon4)
2316 .Case("athlon-xp", CK_AthlonXP)
2317 .Case("athlon-mp", CK_AthlonMP)
2318 .Case("athlon64", CK_Athlon64)
2319 .Case("athlon64-sse3", CK_Athlon64SSE3)
2320 .Case("athlon-fx", CK_AthlonFX)
2321 .Case("k8", CK_K8)
2322 .Case("k8-sse3", CK_K8SSE3)
2323 .Case("opteron", CK_Opteron)
2324 .Case("opteron-sse3", CK_OpteronSSE3)
2325 .Case("barcelona", CK_AMDFAM10)
2326 .Case("amdfam10", CK_AMDFAM10)
2327 .Case("btver1", CK_BTVER1)
2328 .Case("btver2", CK_BTVER2)
2329 .Case("bdver1", CK_BDVER1)
2330 .Case("bdver2", CK_BDVER2)
2331 .Case("bdver3", CK_BDVER3)
2332 .Case("bdver4", CK_BDVER4)
2333 .Case("x86-64", CK_x86_64)
2334 .Case("geode", CK_Geode)
2335 .Default(CK_Generic);
2336 }
2337
Rafael Espindolaeb265472013-08-21 21:59:03 +00002338 enum FPMathKind {
2339 FP_Default,
2340 FP_SSE,
2341 FP_387
2342 } FPMath;
2343
Eli Friedman3fd920a2008-08-20 02:34:37 +00002344public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002345 X86TargetInfo(const llvm::Triple &Triple)
2346 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002347 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002348 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2349 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2350 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2351 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2352 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2353 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002354 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002355 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002356 }
Craig Topper3164f332014-03-11 03:39:26 +00002357 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002358 // X87 evaluates with 80 bits "long double" precision.
2359 return SSELevel == NoSSE ? 2 : 0;
2360 }
Craig Topper3164f332014-03-11 03:39:26 +00002361 void getTargetBuiltins(const Builtin::Info *&Records,
2362 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002363 Records = BuiltinInfo;
2364 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002365 }
Craig Topper3164f332014-03-11 03:39:26 +00002366 void getGCCRegNames(const char * const *&Names,
2367 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002368 Names = GCCRegNames;
2369 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002370 }
Craig Topper3164f332014-03-11 03:39:26 +00002371 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2372 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002373 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002374 NumAliases = 0;
2375 }
Craig Topper3164f332014-03-11 03:39:26 +00002376 void getGCCAddlRegNames(const AddlRegName *&Names,
2377 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002378 Names = AddlRegNames;
2379 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002380 }
Eric Christopherd9832702015-06-29 21:00:05 +00002381 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002382 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002383 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002384
Akira Hatanaka974131e2014-09-18 18:17:18 +00002385 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2386
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002387 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2388
Akira Hatanaka974131e2014-09-18 18:17:18 +00002389 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2390
Craig Topper3164f332014-03-11 03:39:26 +00002391 std::string convertConstraint(const char *&Constraint) const override;
2392 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002393 return "~{dirflag},~{fpsr},~{flags}";
2394 }
Craig Topper3164f332014-03-11 03:39:26 +00002395 void getTargetDefines(const LangOptions &Opts,
2396 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002397 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2398 bool Enabled);
2399 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2400 bool Enabled);
2401 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2402 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002403 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2404 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002405 setFeatureEnabledImpl(Features, Name, Enabled);
2406 }
2407 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002408 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002409 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2410 StringRef Name, bool Enabled);
Eric Christopheref1e2952015-08-28 02:13:58 +00002411 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2412 StringRef CPU,
Eric Christopher007b0a02015-08-28 22:32:01 +00002413 std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002414 bool hasFeature(StringRef Feature) const override;
2415 bool handleTargetFeatures(std::vector<std::string> &Features,
2416 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002417 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002418 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2419 return "avx512";
2420 else if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002421 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002422 else if (getTriple().getArch() == llvm::Triple::x86 &&
2423 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002424 return "no-mmx";
2425 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002426 }
Craig Topper3164f332014-03-11 03:39:26 +00002427 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002428 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002429
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002430 // Perform any per-CPU checks necessary to determine if this CPU is
2431 // acceptable.
2432 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2433 // invalid without explaining *why*.
2434 switch (CPU) {
2435 case CK_Generic:
2436 // No processor selected!
2437 return false;
2438
2439 case CK_i386:
2440 case CK_i486:
2441 case CK_WinChipC6:
2442 case CK_WinChip2:
2443 case CK_C3:
2444 case CK_i586:
2445 case CK_Pentium:
2446 case CK_PentiumMMX:
2447 case CK_i686:
2448 case CK_PentiumPro:
2449 case CK_Pentium2:
2450 case CK_Pentium3:
2451 case CK_Pentium3M:
2452 case CK_PentiumM:
2453 case CK_Yonah:
2454 case CK_C3_2:
2455 case CK_Pentium4:
2456 case CK_Pentium4M:
2457 case CK_Prescott:
2458 case CK_K6:
2459 case CK_K6_2:
2460 case CK_K6_3:
2461 case CK_Athlon:
2462 case CK_AthlonThunderbird:
2463 case CK_Athlon4:
2464 case CK_AthlonXP:
2465 case CK_AthlonMP:
2466 case CK_Geode:
2467 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002468 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002469 return false;
2470
2471 // Fallthrough
2472 case CK_Nocona:
2473 case CK_Core2:
2474 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002475 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002476 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002477 case CK_Nehalem:
2478 case CK_Westmere:
2479 case CK_SandyBridge:
2480 case CK_IvyBridge:
2481 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002482 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002483 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002484 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002485 case CK_Athlon64:
2486 case CK_Athlon64SSE3:
2487 case CK_AthlonFX:
2488 case CK_K8:
2489 case CK_K8SSE3:
2490 case CK_Opteron:
2491 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002492 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002493 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002494 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002495 case CK_BDVER1:
2496 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002497 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002498 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002499 case CK_x86_64:
2500 return true;
2501 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002502 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002503 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002504
Craig Topper3164f332014-03-11 03:39:26 +00002505 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002506
Craig Topper3164f332014-03-11 03:39:26 +00002507 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002508 // We accept all non-ARM calling conventions
2509 return (CC == CC_X86ThisCall ||
2510 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002511 CC == CC_X86StdCall ||
2512 CC == CC_X86VectorCall ||
2513 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002514 CC == CC_X86Pascal ||
2515 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002516 }
2517
Craig Topper3164f332014-03-11 03:39:26 +00002518 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002519 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002520 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002521
2522 bool hasSjLjLowering() const override {
2523 return true;
2524 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002525};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002526
Rafael Espindolaeb265472013-08-21 21:59:03 +00002527bool X86TargetInfo::setFPMath(StringRef Name) {
2528 if (Name == "387") {
2529 FPMath = FP_387;
2530 return true;
2531 }
2532 if (Name == "sse") {
2533 FPMath = FP_SSE;
2534 return true;
2535 }
2536 return false;
2537}
2538
Eric Christopher007b0a02015-08-28 22:32:01 +00002539bool X86TargetInfo::initFeatureMap(
2540 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
2541 std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002542 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002543 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002544 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002545 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002546
Eric Christopher2b4a7252015-08-27 00:05:52 +00002547 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002548 case CK_Generic:
2549 case CK_i386:
2550 case CK_i486:
2551 case CK_i586:
2552 case CK_Pentium:
2553 case CK_i686:
2554 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002555 break;
2556 case CK_PentiumMMX:
2557 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002558 case CK_K6:
2559 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002560 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002561 break;
2562 case CK_Pentium3:
2563 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002564 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002565 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002566 break;
2567 case CK_PentiumM:
2568 case CK_Pentium4:
2569 case CK_Pentium4M:
2570 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002571 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002572 break;
2573 case CK_Yonah:
2574 case CK_Prescott:
2575 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002576 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002577 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002578 break;
2579 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002580 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002581 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002582 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002583 break;
2584 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002585 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002586 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002587 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002588 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002589 setFeatureEnabledImpl(Features, "avx512f", true);
2590 setFeatureEnabledImpl(Features, "avx512cd", true);
2591 setFeatureEnabledImpl(Features, "avx512dq", true);
2592 setFeatureEnabledImpl(Features, "avx512bw", true);
2593 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002594 // FALLTHROUGH
2595 case CK_Broadwell:
2596 setFeatureEnabledImpl(Features, "rdseed", true);
2597 setFeatureEnabledImpl(Features, "adx", true);
2598 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002599 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002600 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002601 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002602 setFeatureEnabledImpl(Features, "bmi", true);
2603 setFeatureEnabledImpl(Features, "bmi2", true);
2604 setFeatureEnabledImpl(Features, "rtm", true);
2605 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002606 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002607 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002608 setFeatureEnabledImpl(Features, "rdrnd", true);
2609 setFeatureEnabledImpl(Features, "f16c", true);
2610 setFeatureEnabledImpl(Features, "fsgsbase", true);
2611 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002612 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002613 setFeatureEnabledImpl(Features, "avx", true);
2614 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002615 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002616 case CK_Silvermont:
2617 setFeatureEnabledImpl(Features, "aes", true);
2618 setFeatureEnabledImpl(Features, "pclmul", true);
2619 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002620 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002621 setFeatureEnabledImpl(Features, "sse4.2", true);
2622 setFeatureEnabledImpl(Features, "cx16", true);
2623 break;
2624 case CK_KNL:
2625 setFeatureEnabledImpl(Features, "avx512f", true);
2626 setFeatureEnabledImpl(Features, "avx512cd", true);
2627 setFeatureEnabledImpl(Features, "avx512er", true);
2628 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002629 setFeatureEnabledImpl(Features, "rdseed", true);
2630 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002631 setFeatureEnabledImpl(Features, "lzcnt", true);
2632 setFeatureEnabledImpl(Features, "bmi", true);
2633 setFeatureEnabledImpl(Features, "bmi2", true);
2634 setFeatureEnabledImpl(Features, "rtm", true);
2635 setFeatureEnabledImpl(Features, "fma", true);
2636 setFeatureEnabledImpl(Features, "rdrnd", true);
2637 setFeatureEnabledImpl(Features, "f16c", true);
2638 setFeatureEnabledImpl(Features, "fsgsbase", true);
2639 setFeatureEnabledImpl(Features, "aes", true);
2640 setFeatureEnabledImpl(Features, "pclmul", true);
2641 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002642 break;
2643 case CK_K6_2:
2644 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002645 case CK_WinChip2:
2646 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002647 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002648 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002649 case CK_Athlon:
2650 case CK_AthlonThunderbird:
2651 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002652 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002653 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002654 case CK_Athlon4:
2655 case CK_AthlonXP:
2656 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002657 setFeatureEnabledImpl(Features, "sse", true);
2658 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002659 break;
2660 case CK_K8:
2661 case CK_Opteron:
2662 case CK_Athlon64:
2663 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002664 setFeatureEnabledImpl(Features, "sse2", true);
2665 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002666 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002667 case CK_AMDFAM10:
2668 setFeatureEnabledImpl(Features, "sse4a", true);
2669 setFeatureEnabledImpl(Features, "lzcnt", true);
2670 setFeatureEnabledImpl(Features, "popcnt", true);
2671 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002672 case CK_K8SSE3:
2673 case CK_OpteronSSE3:
2674 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002675 setFeatureEnabledImpl(Features, "sse3", true);
2676 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002677 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002678 case CK_BTVER2:
2679 setFeatureEnabledImpl(Features, "avx", true);
2680 setFeatureEnabledImpl(Features, "aes", true);
2681 setFeatureEnabledImpl(Features, "pclmul", true);
2682 setFeatureEnabledImpl(Features, "bmi", true);
2683 setFeatureEnabledImpl(Features, "f16c", true);
2684 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002685 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002686 setFeatureEnabledImpl(Features, "ssse3", true);
2687 setFeatureEnabledImpl(Features, "sse4a", true);
2688 setFeatureEnabledImpl(Features, "lzcnt", true);
2689 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002690 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002691 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002692 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002693 case CK_BDVER4:
2694 setFeatureEnabledImpl(Features, "avx2", true);
2695 setFeatureEnabledImpl(Features, "bmi2", true);
2696 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002697 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002698 setFeatureEnabledImpl(Features, "fsgsbase", true);
2699 // FALLTHROUGH
2700 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002701 setFeatureEnabledImpl(Features, "bmi", true);
2702 setFeatureEnabledImpl(Features, "fma", true);
2703 setFeatureEnabledImpl(Features, "f16c", true);
2704 setFeatureEnabledImpl(Features, "tbm", true);
2705 // FALLTHROUGH
2706 case CK_BDVER1:
2707 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002708 setFeatureEnabledImpl(Features, "xop", true);
2709 setFeatureEnabledImpl(Features, "lzcnt", true);
2710 setFeatureEnabledImpl(Features, "aes", true);
2711 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002712 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002713 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002714 break;
Eli Friedman33465822011-07-08 23:31:17 +00002715 }
Eric Christopher007b0a02015-08-28 22:32:01 +00002716 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002717}
2718
Rafael Espindolae62e2792013-08-20 13:44:29 +00002719void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002720 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002721 if (Enabled) {
2722 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002723 case AVX512F:
2724 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002725 case AVX2:
2726 Features["avx2"] = true;
2727 case AVX:
2728 Features["avx"] = true;
2729 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002730 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002731 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002732 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002733 case SSSE3:
2734 Features["ssse3"] = true;
2735 case SSE3:
2736 Features["sse3"] = true;
2737 case SSE2:
2738 Features["sse2"] = true;
2739 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002740 Features["sse"] = true;
2741 case NoSSE:
2742 break;
2743 }
2744 return;
2745 }
2746
2747 switch (Level) {
2748 case NoSSE:
2749 case SSE1:
2750 Features["sse"] = false;
2751 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002752 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2753 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002754 case SSE3:
2755 Features["sse3"] = false;
2756 setXOPLevel(Features, NoXOP, false);
2757 case SSSE3:
2758 Features["ssse3"] = false;
2759 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002760 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002761 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002762 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002763 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002764 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002765 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002766 case AVX2:
2767 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002768 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002769 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002770 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2771 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002772 }
2773}
2774
2775void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002776 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002777 if (Enabled) {
2778 switch (Level) {
2779 case AMD3DNowAthlon:
2780 Features["3dnowa"] = true;
2781 case AMD3DNow:
2782 Features["3dnow"] = true;
2783 case MMX:
2784 Features["mmx"] = true;
2785 case NoMMX3DNow:
2786 break;
2787 }
2788 return;
2789 }
2790
2791 switch (Level) {
2792 case NoMMX3DNow:
2793 case MMX:
2794 Features["mmx"] = false;
2795 case AMD3DNow:
2796 Features["3dnow"] = false;
2797 case AMD3DNowAthlon:
2798 Features["3dnowa"] = false;
2799 }
2800}
2801
2802void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002803 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002804 if (Enabled) {
2805 switch (Level) {
2806 case XOP:
2807 Features["xop"] = true;
2808 case FMA4:
2809 Features["fma4"] = true;
2810 setSSELevel(Features, AVX, true);
2811 case SSE4A:
2812 Features["sse4a"] = true;
2813 setSSELevel(Features, SSE3, true);
2814 case NoXOP:
2815 break;
2816 }
2817 return;
2818 }
2819
2820 switch (Level) {
2821 case NoXOP:
2822 case SSE4A:
2823 Features["sse4a"] = false;
2824 case FMA4:
2825 Features["fma4"] = false;
2826 case XOP:
2827 Features["xop"] = false;
2828 }
2829}
2830
Craig Topper86d79ef2013-09-17 04:51:29 +00002831void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2832 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002833 // This is a bit of a hack to deal with the sse4 target feature when used
2834 // as part of the target attribute. We handle sse4 correctly everywhere
2835 // else. See below for more information on how we handle the sse4 options.
2836 if (Name != "sse4")
2837 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002838
Craig Topper29561122013-09-19 01:13:07 +00002839 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002840 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002841 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002842 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002843 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002844 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002845 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002846 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002847 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002848 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002849 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002850 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002851 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002852 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002853 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002854 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002855 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002856 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002857 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002858 if (Enabled)
2859 setSSELevel(Features, SSE2, Enabled);
2860 } else if (Name == "pclmul") {
2861 if (Enabled)
2862 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002863 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002864 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002865 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002866 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002867 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002868 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002869 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2870 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002871 if (Enabled)
2872 setSSELevel(Features, AVX512F, Enabled);
2873 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002874 if (Enabled)
2875 setSSELevel(Features, AVX, Enabled);
2876 } else if (Name == "fma4") {
2877 setXOPLevel(Features, FMA4, Enabled);
2878 } else if (Name == "xop") {
2879 setXOPLevel(Features, XOP, Enabled);
2880 } else if (Name == "sse4a") {
2881 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002882 } else if (Name == "f16c") {
2883 if (Enabled)
2884 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002885 } else if (Name == "sha") {
2886 if (Enabled)
2887 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002888 } else if (Name == "sse4") {
2889 // We can get here via the __target__ attribute since that's not controlled
2890 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2891 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2892 // disabled.
2893 if (Enabled)
2894 setSSELevel(Features, SSE42, Enabled);
2895 else
2896 setSSELevel(Features, SSE41, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002897 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002898}
2899
Eric Christopher3ff21b32013-10-16 21:26:26 +00002900/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002901/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002902bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002903 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00002904 for (const auto &Feature : Features) {
2905 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00002906 continue;
2907
Eric Christopher610fe112015-08-26 08:21:55 +00002908 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002909 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002910 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00002911 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002912 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002913 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002914 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002915 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002916 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00002917 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002918 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002919 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002920 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002921 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002922 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002923 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002924 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00002925 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002926 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00002927 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002928 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00002929 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002930 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00002931 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002932 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002933 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002934 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00002935 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002936 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00002937 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002938 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00002939 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002940 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00002941 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002942 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002943 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002944 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002945 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002946 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002947 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002948 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002949 HasAVX512VL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002950 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00002951 HasSHA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002952 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00002953 HasCX16 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002954 }
2955
Benjamin Kramer27402c62012-03-05 15:10:44 +00002956 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002957 .Case("+avx512f", AVX512F)
2958 .Case("+avx2", AVX2)
2959 .Case("+avx", AVX)
2960 .Case("+sse4.2", SSE42)
2961 .Case("+sse4.1", SSE41)
2962 .Case("+ssse3", SSSE3)
2963 .Case("+sse3", SSE3)
2964 .Case("+sse2", SSE2)
2965 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002966 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002967 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002968
Eli Friedman33465822011-07-08 23:31:17 +00002969 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002970 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002971 .Case("+3dnowa", AMD3DNowAthlon)
2972 .Case("+3dnow", AMD3DNow)
2973 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00002974 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002975 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002976
2977 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002978 .Case("+xop", XOP)
2979 .Case("+fma4", FMA4)
2980 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002981 .Default(NoXOP);
2982 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002983 }
Eli Friedman33465822011-07-08 23:31:17 +00002984
Craig Topper7481d8a2013-09-10 06:55:47 +00002985 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2986 // Can't do this earlier because we need to be able to explicitly enable
2987 // popcnt and still disable sse4.2.
2988 if (!HasPOPCNT && SSELevel >= SSE42 &&
2989 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2990 HasPOPCNT = true;
2991 Features.push_back("+popcnt");
2992 }
2993
Yunzhong Gao61089362013-10-16 19:07:02 +00002994 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2995 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2996 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2997 HasPRFCHW = true;
2998 Features.push_back("+prfchw");
2999 }
3000
Rafael Espindolaeb265472013-08-21 21:59:03 +00003001 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3002 // matches the selected sse level.
3003 if (FPMath == FP_SSE && SSELevel < SSE1) {
3004 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
3005 return false;
3006 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
3007 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
3008 return false;
3009 }
3010
Eli Friedman33465822011-07-08 23:31:17 +00003011 // Don't tell the backend if we're turning off mmx; it will end up disabling
3012 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00003013 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3014 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00003015 std::vector<std::string>::iterator it;
3016 it = std::find(Features.begin(), Features.end(), "-mmx");
3017 if (it != Features.end())
3018 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00003019 else if (SSELevel > NoSSE)
3020 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Alexey Bataev00396512015-07-02 03:40:19 +00003021
3022 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003023 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003024 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003025}
Chris Lattnerecd49032009-03-02 22:27:17 +00003026
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003027/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3028/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003029void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003030 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003031 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003032 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003033 Builder.defineMacro("__amd64__");
3034 Builder.defineMacro("__amd64");
3035 Builder.defineMacro("__x86_64");
3036 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003037 if (getTriple().getArchName() == "x86_64h") {
3038 Builder.defineMacro("__x86_64h");
3039 Builder.defineMacro("__x86_64h__");
3040 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003041 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003042 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003043 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003044
Chris Lattnerecd49032009-03-02 22:27:17 +00003045 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003046 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3047 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003048 switch (CPU) {
3049 case CK_Generic:
3050 break;
3051 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003052 // The rest are coming from the i386 define above.
3053 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003054 break;
3055 case CK_i486:
3056 case CK_WinChipC6:
3057 case CK_WinChip2:
3058 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003059 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003060 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003061 case CK_PentiumMMX:
3062 Builder.defineMacro("__pentium_mmx__");
3063 Builder.defineMacro("__tune_pentium_mmx__");
3064 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003065 case CK_i586:
3066 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003067 defineCPUMacros(Builder, "i586");
3068 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003069 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003070 case CK_Pentium3:
3071 case CK_Pentium3M:
3072 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003073 Builder.defineMacro("__tune_pentium3__");
3074 // Fallthrough
3075 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003076 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003077 Builder.defineMacro("__tune_pentium2__");
3078 // Fallthrough
3079 case CK_PentiumPro:
3080 Builder.defineMacro("__tune_i686__");
3081 Builder.defineMacro("__tune_pentiumpro__");
3082 // Fallthrough
3083 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003084 Builder.defineMacro("__i686");
3085 Builder.defineMacro("__i686__");
3086 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3087 Builder.defineMacro("__pentiumpro");
3088 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003089 break;
3090 case CK_Pentium4:
3091 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003092 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003093 break;
3094 case CK_Yonah:
3095 case CK_Prescott:
3096 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003097 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003098 break;
3099 case CK_Core2:
3100 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003101 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003102 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003103 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003104 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003105 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003106 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003107 defineCPUMacros(Builder, "slm");
3108 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003109 case CK_Nehalem:
3110 case CK_Westmere:
3111 case CK_SandyBridge:
3112 case CK_IvyBridge:
3113 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003114 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003115 // FIXME: Historically, we defined this legacy name, it would be nice to
3116 // remove it at some point. We've never exposed fine-grained names for
3117 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003118 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003119 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003120 case CK_Skylake:
3121 // FIXME: Historically, we defined this legacy name, it would be nice to
3122 // remove it at some point. This is the only fine-grained CPU macro in the
3123 // main intel CPU line, and it would be better to not have these and force
3124 // people to use ISA macros.
3125 defineCPUMacros(Builder, "skx");
3126 break;
Craig Topper449314e2013-08-20 07:09:39 +00003127 case CK_KNL:
3128 defineCPUMacros(Builder, "knl");
3129 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003130 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003131 Builder.defineMacro("__k6_2__");
3132 Builder.defineMacro("__tune_k6_2__");
3133 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003134 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003135 if (CPU != CK_K6_2) { // In case of fallthrough
3136 // FIXME: GCC may be enabling these in cases where some other k6
3137 // architecture is specified but -m3dnow is explicitly provided. The
3138 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003139 Builder.defineMacro("__k6_3__");
3140 Builder.defineMacro("__tune_k6_3__");
3141 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003142 // Fallthrough
3143 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003144 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003145 break;
3146 case CK_Athlon:
3147 case CK_AthlonThunderbird:
3148 case CK_Athlon4:
3149 case CK_AthlonXP:
3150 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003151 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003152 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003153 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003154 Builder.defineMacro("__tune_athlon_sse__");
3155 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003156 break;
3157 case CK_K8:
3158 case CK_K8SSE3:
3159 case CK_x86_64:
3160 case CK_Opteron:
3161 case CK_OpteronSSE3:
3162 case CK_Athlon64:
3163 case CK_Athlon64SSE3:
3164 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003165 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003166 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003167 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003168 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003169 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003170 case CK_BTVER1:
3171 defineCPUMacros(Builder, "btver1");
3172 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003173 case CK_BTVER2:
3174 defineCPUMacros(Builder, "btver2");
3175 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003176 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003177 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003178 break;
3179 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003180 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003181 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003182 case CK_BDVER3:
3183 defineCPUMacros(Builder, "bdver3");
3184 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003185 case CK_BDVER4:
3186 defineCPUMacros(Builder, "bdver4");
3187 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003188 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003189 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003190 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003191 }
Chris Lattner96e43572009-03-02 22:40:39 +00003192
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003193 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003194 Builder.defineMacro("__REGISTER_PREFIX__", "");
3195
Chris Lattner6df41af2009-04-19 17:32:33 +00003196 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3197 // functions in glibc header files that use FP Stack inline asm which the
3198 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003199 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003200
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003201 if (HasAES)
3202 Builder.defineMacro("__AES__");
3203
Craig Topper3f122a72012-05-31 05:18:48 +00003204 if (HasPCLMUL)
3205 Builder.defineMacro("__PCLMUL__");
3206
Craig Topper22967d42011-12-25 05:06:45 +00003207 if (HasLZCNT)
3208 Builder.defineMacro("__LZCNT__");
3209
Benjamin Kramer1e250392012-07-07 09:39:18 +00003210 if (HasRDRND)
3211 Builder.defineMacro("__RDRND__");
3212
Craig Topper8c7f2512014-11-03 06:51:41 +00003213 if (HasFSGSBASE)
3214 Builder.defineMacro("__FSGSBASE__");
3215
Craig Topper22967d42011-12-25 05:06:45 +00003216 if (HasBMI)
3217 Builder.defineMacro("__BMI__");
3218
3219 if (HasBMI2)
3220 Builder.defineMacro("__BMI2__");
3221
Craig Topper1de83482011-12-29 16:10:46 +00003222 if (HasPOPCNT)
3223 Builder.defineMacro("__POPCNT__");
3224
Michael Liao625a8752012-11-10 05:17:46 +00003225 if (HasRTM)
3226 Builder.defineMacro("__RTM__");
3227
Michael Liao74f4eaf2013-03-26 17:52:08 +00003228 if (HasPRFCHW)
3229 Builder.defineMacro("__PRFCHW__");
3230
Michael Liaoffaae352013-03-29 05:17:55 +00003231 if (HasRDSEED)
3232 Builder.defineMacro("__RDSEED__");
3233
Robert Khasanov50e6f582014-09-19 09:53:48 +00003234 if (HasADX)
3235 Builder.defineMacro("__ADX__");
3236
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003237 if (HasTBM)
3238 Builder.defineMacro("__TBM__");
3239
Rafael Espindolae62e2792013-08-20 13:44:29 +00003240 switch (XOPLevel) {
3241 case XOP:
3242 Builder.defineMacro("__XOP__");
3243 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003244 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003245 case SSE4A:
3246 Builder.defineMacro("__SSE4A__");
3247 case NoXOP:
3248 break;
3249 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003250
Craig Topperbba778b2012-06-03 21:46:30 +00003251 if (HasFMA)
3252 Builder.defineMacro("__FMA__");
3253
Manman Rena45358c2012-10-11 00:59:55 +00003254 if (HasF16C)
3255 Builder.defineMacro("__F16C__");
3256
Craig Topper679b53a2013-08-21 05:29:10 +00003257 if (HasAVX512CD)
3258 Builder.defineMacro("__AVX512CD__");
3259 if (HasAVX512ER)
3260 Builder.defineMacro("__AVX512ER__");
3261 if (HasAVX512PF)
3262 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003263 if (HasAVX512DQ)
3264 Builder.defineMacro("__AVX512DQ__");
3265 if (HasAVX512BW)
3266 Builder.defineMacro("__AVX512BW__");
3267 if (HasAVX512VL)
3268 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003269
Ben Langmuir58078d02013-09-19 13:22:04 +00003270 if (HasSHA)
3271 Builder.defineMacro("__SHA__");
3272
Nick Lewycky50e8f482013-10-05 20:14:27 +00003273 if (HasCX16)
3274 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3275
Chris Lattner96e43572009-03-02 22:40:39 +00003276 // Each case falls through to the previous one here.
3277 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003278 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003279 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003280 case AVX2:
3281 Builder.defineMacro("__AVX2__");
3282 case AVX:
3283 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003284 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003285 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003286 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003287 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003288 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003289 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003290 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003291 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003292 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003293 Builder.defineMacro("__SSE2__");
3294 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003295 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003296 Builder.defineMacro("__SSE__");
3297 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003298 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003299 break;
3300 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003301
Derek Schuffc7dd7222012-10-11 15:52:22 +00003302 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003303 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003304 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003305 case AVX2:
3306 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003307 case SSE42:
3308 case SSE41:
3309 case SSSE3:
3310 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003311 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003312 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003313 break;
3314 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003315 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003316 break;
3317 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003318 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003319 }
3320 }
3321
Anders Carlssone437c682010-01-27 03:47:49 +00003322 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003323 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003324 case AMD3DNowAthlon:
3325 Builder.defineMacro("__3dNOW_A__");
3326 case AMD3DNow:
3327 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003328 case MMX:
3329 Builder.defineMacro("__MMX__");
3330 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003331 break;
3332 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003333
3334 if (CPU >= CK_i486) {
3335 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3336 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3337 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3338 }
3339 if (CPU >= CK_i586)
3340 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003341}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003342
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003343bool X86TargetInfo::hasFeature(StringRef Feature) const {
3344 return llvm::StringSwitch<bool>(Feature)
3345 .Case("aes", HasAES)
3346 .Case("avx", SSELevel >= AVX)
3347 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003348 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003349 .Case("avx512cd", HasAVX512CD)
3350 .Case("avx512er", HasAVX512ER)
3351 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003352 .Case("avx512dq", HasAVX512DQ)
3353 .Case("avx512bw", HasAVX512BW)
3354 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003355 .Case("bmi", HasBMI)
3356 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003357 .Case("cx16", HasCX16)
3358 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003359 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003360 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003361 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003362 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003363 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3364 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3365 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003366 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003367 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003368 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003369 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003370 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003371 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003372 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003373 .Case("sse", SSELevel >= SSE1)
3374 .Case("sse2", SSELevel >= SSE2)
3375 .Case("sse3", SSELevel >= SSE3)
3376 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003377 .Case("sse4.1", SSELevel >= SSE41)
3378 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003379 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003380 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003381 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003382 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3383 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003384 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003385 .Default(false);
3386}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003387
Eric Christopherd9832702015-06-29 21:00:05 +00003388// We can't use a generic validation scheme for the features accepted here
3389// versus subtarget features accepted in the target attribute because the
3390// bitfield structure that's initialized in the runtime only supports the
3391// below currently rather than the full range of subtarget features. (See
3392// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3393bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3394 return llvm::StringSwitch<bool>(FeatureStr)
3395 .Case("cmov", true)
3396 .Case("mmx", true)
3397 .Case("popcnt", true)
3398 .Case("sse", true)
3399 .Case("sse2", true)
3400 .Case("sse3", true)
3401 .Case("sse4.1", true)
3402 .Case("sse4.2", true)
3403 .Case("avx", true)
3404 .Case("avx2", true)
3405 .Case("sse4a", true)
3406 .Case("fma4", true)
3407 .Case("xop", true)
3408 .Case("fma", true)
3409 .Case("avx512f", true)
3410 .Case("bmi", true)
3411 .Case("bmi2", true)
3412 .Default(false);
3413}
3414
Eli Friedman3fd920a2008-08-20 02:34:37 +00003415bool
Anders Carlsson58436352009-02-28 17:11:49 +00003416X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003417 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003418 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003419 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003420 // Constant constraints.
3421 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3422 // instructions.
3423 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3424 // x86_64 instructions.
3425 case 's':
3426 Info.setRequiresImmediate();
3427 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003428 case 'I':
3429 Info.setRequiresImmediate(0, 31);
3430 return true;
3431 case 'J':
3432 Info.setRequiresImmediate(0, 63);
3433 return true;
3434 case 'K':
3435 Info.setRequiresImmediate(-128, 127);
3436 return true;
3437 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003438 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003439 return true;
3440 case 'M':
3441 Info.setRequiresImmediate(0, 3);
3442 return true;
3443 case 'N':
3444 Info.setRequiresImmediate(0, 255);
3445 return true;
3446 case 'O':
3447 Info.setRequiresImmediate(0, 127);
3448 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003449 // Register constraints.
3450 case 'Y': // 'Y' is the first character for several 2-character constraints.
3451 // Shift the pointer to the second character of the constraint.
3452 Name++;
3453 switch (*Name) {
3454 default:
3455 return false;
3456 case '0': // First SSE register.
3457 case 't': // Any SSE register, when SSE2 is enabled.
3458 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3459 case 'm': // Any MMX register, when inter-unit moves enabled.
3460 Info.setAllowsRegister();
3461 return true;
3462 }
3463 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003464 // Constraint 'f' cannot be used for output operands.
3465 if (Info.ConstraintStr[0] == '=')
3466 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003467 Info.setAllowsRegister();
3468 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003469 case 'a': // eax.
3470 case 'b': // ebx.
3471 case 'c': // ecx.
3472 case 'd': // edx.
3473 case 'S': // esi.
3474 case 'D': // edi.
3475 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003476 case 't': // Top of floating point stack.
3477 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003478 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003479 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003480 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003481 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003482 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3483 case 'l': // "Index" registers: any general register that can be used as an
3484 // index in a base+index memory access.
3485 Info.setAllowsRegister();
3486 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003487 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003488 case 'C': // SSE floating point constant.
3489 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003490 return true;
3491 }
3492}
3493
Akira Hatanaka974131e2014-09-18 18:17:18 +00003494bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3495 unsigned Size) const {
3496 // Strip off constraint modifiers.
3497 while (Constraint[0] == '=' ||
3498 Constraint[0] == '+' ||
3499 Constraint[0] == '&')
3500 Constraint = Constraint.substr(1);
3501
3502 return validateOperandSize(Constraint, Size);
3503}
3504
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003505bool X86TargetInfo::validateInputSize(StringRef Constraint,
3506 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003507 return validateOperandSize(Constraint, Size);
3508}
3509
3510bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3511 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003512 switch (Constraint[0]) {
3513 default: break;
3514 case 'y':
3515 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003516 case 'f':
3517 case 't':
3518 case 'u':
3519 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003520 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003521 if (SSELevel >= AVX512F)
3522 // 512-bit zmm registers can be used if target supports AVX512F.
3523 return Size <= 512U;
3524 else if (SSELevel >= AVX)
3525 // 256-bit ymm registers can be used if target supports AVX.
3526 return Size <= 256U;
3527 return Size <= 128U;
3528 case 'Y':
3529 // 'Y' is the first character for several 2-character constraints.
3530 switch (Constraint[1]) {
3531 default: break;
3532 case 'm':
3533 // 'Ym' is synonymous with 'y'.
3534 return Size <= 64;
3535 case 'i':
3536 case 't':
3537 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3538 if (SSELevel >= AVX512F)
3539 return Size <= 512U;
3540 else if (SSELevel >= AVX)
3541 return Size <= 256U;
3542 return SSELevel >= SSE2 && Size <= 128U;
3543 }
3544
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003545 }
3546
3547 return true;
3548}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003549
Eli Friedman3fd920a2008-08-20 02:34:37 +00003550std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003551X86TargetInfo::convertConstraint(const char *&Constraint) const {
3552 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003553 case 'a': return std::string("{ax}");
3554 case 'b': return std::string("{bx}");
3555 case 'c': return std::string("{cx}");
3556 case 'd': return std::string("{dx}");
3557 case 'S': return std::string("{si}");
3558 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003559 case 'p': // address
3560 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003561 case 't': // top of floating point stack.
3562 return std::string("{st}");
3563 case 'u': // second from top of floating point stack.
3564 return std::string("{st(1)}"); // second from top of floating point stack.
3565 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003566 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003567 }
3568}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003569
Eli Friedman3fd920a2008-08-20 02:34:37 +00003570// X86-32 generic target
3571class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003572public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003573 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003574 DoubleAlign = LongLongAlign = 32;
3575 LongDoubleWidth = 96;
3576 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003577 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003578 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003579 SizeType = UnsignedInt;
3580 PtrDiffType = SignedInt;
3581 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003582 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003583
3584 // Use fpret for all types.
3585 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3586 (1 << TargetInfo::Double) |
3587 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003588
3589 // x86-32 has atomics up to 8 bytes
3590 // FIXME: Check that we actually have cmpxchg8b before setting
3591 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3592 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003593 }
Craig Topper3164f332014-03-11 03:39:26 +00003594 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003595 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003596 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003597
Craig Topper3164f332014-03-11 03:39:26 +00003598 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003599 if (RegNo == 0) return 0;
3600 if (RegNo == 1) return 2;
3601 return -1;
3602 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003603 bool validateOperandSize(StringRef Constraint,
3604 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003605 switch (Constraint[0]) {
3606 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003607 case 'R':
3608 case 'q':
3609 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003610 case 'a':
3611 case 'b':
3612 case 'c':
3613 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003614 case 'S':
3615 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003616 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003617 case 'A':
3618 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003619 }
3620
Akira Hatanaka974131e2014-09-18 18:17:18 +00003621 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003622 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003623};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003624
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003625class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3626public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003627 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3628 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003629
Craig Topper3164f332014-03-11 03:39:26 +00003630 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003631 unsigned Major, Minor, Micro;
3632 getTriple().getOSVersion(Major, Minor, Micro);
3633 // New NetBSD uses the default rounding mode.
3634 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3635 return X86_32TargetInfo::getFloatEvalMethod();
3636 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003637 return 1;
3638 }
3639};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003640
Eli Friedmane3aa4542009-07-05 18:47:56 +00003641class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3642public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003643 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3644 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003645 SizeType = UnsignedLong;
3646 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003647 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003648 }
3649};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003650
Eli Friedman9fa28852012-08-08 23:57:20 +00003651class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3652public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003653 BitrigI386TargetInfo(const llvm::Triple &Triple)
3654 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003655 SizeType = UnsignedLong;
3656 IntPtrType = SignedLong;
3657 PtrDiffType = SignedLong;
3658 }
3659};
Eli Friedman9fa28852012-08-08 23:57:20 +00003660
Torok Edwinb2b37c62009-06-30 17:10:35 +00003661class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003662public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003663 DarwinI386TargetInfo(const llvm::Triple &Triple)
3664 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003665 LongDoubleWidth = 128;
3666 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003667 SuitableAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003668 SizeType = UnsignedLong;
3669 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003670 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003671 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003672 }
3673
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003674 bool handleTargetFeatures(std::vector<std::string> &Features,
3675 DiagnosticsEngine &Diags) override {
3676 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3677 Diags))
3678 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003679 // We now know the features we have: we can decide how to align vectors.
3680 MaxVectorAlign =
3681 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003682 return true;
3683 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003684};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003685
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003686// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003687class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003688public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003689 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3690 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003691 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003692 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003693 bool IsWinCOFF =
3694 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003695 DataLayoutString = IsWinCOFF
3696 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3697 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003698 }
Craig Topper3164f332014-03-11 03:39:26 +00003699 void getTargetDefines(const LangOptions &Opts,
3700 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003701 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3702 }
3703};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003704
3705// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003706class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003707public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003708 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003709 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003710 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003711 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3712 }
Craig Topper3164f332014-03-11 03:39:26 +00003713 void getTargetDefines(const LangOptions &Opts,
3714 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003715 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3716 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3717 // The value of the following reflects processor type.
3718 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3719 // We lost the original triple, so we use the default.
3720 Builder.defineMacro("_M_IX86", "600");
3721 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003722};
3723} // end anonymous namespace
3724
David Majnemerae1ed0e2015-05-28 04:36:18 +00003725static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3726 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang supports
Reid Kleckner47606832014-04-21 20:58:00 +00003727 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3728 // macro anyway for pre-processor compatibility.
3729 if (Opts.MicrosoftExt)
3730 Builder.defineMacro("__declspec", "__declspec");
3731 else
3732 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3733
3734 if (!Opts.MicrosoftExt) {
3735 // Provide macros for all the calling convention keywords. Provide both
3736 // single and double underscore prefixed variants. These are available on
3737 // x64 as well as x86, even though they have no effect.
3738 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3739 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003740 std::string GCCSpelling = "__attribute__((__";
3741 GCCSpelling += CC;
3742 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003743 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3744 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3745 }
3746 }
3747}
3748
David Majnemerae1ed0e2015-05-28 04:36:18 +00003749static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3750 Builder.defineMacro("__MSVCRT__");
3751 Builder.defineMacro("__MINGW32__");
3752 addCygMingDefines(Opts, Builder);
3753}
3754
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003755namespace {
3756// x86-32 MinGW target
3757class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3758public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003759 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003760 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003761 void getTargetDefines(const LangOptions &Opts,
3762 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003763 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003764 DefineStd(Builder, "WIN32", Opts);
3765 DefineStd(Builder, "WINNT", Opts);
3766 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003767 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003768 }
3769};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003770
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003771// x86-32 Cygwin target
3772class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3773public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003774 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3775 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003776 TLSSupported = false;
3777 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003778 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003779 DataLayoutString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003780 }
Craig Topper3164f332014-03-11 03:39:26 +00003781 void getTargetDefines(const LangOptions &Opts,
3782 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003783 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003784 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003785 Builder.defineMacro("__CYGWIN__");
3786 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003787 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003788 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003789 if (Opts.CPlusPlus)
3790 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003791 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003792};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003793
Chris Lattnerb986aba2010-04-11 19:29:39 +00003794// x86-32 Haiku target
3795class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3796public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003797 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003798 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003799 IntPtrType = SignedLong;
3800 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003801 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003802 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003803 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003804 }
Craig Topper3164f332014-03-11 03:39:26 +00003805 void getTargetDefines(const LangOptions &Opts,
3806 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003807 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3808 Builder.defineMacro("__INTEL__");
3809 Builder.defineMacro("__HAIKU__");
3810 }
3811};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003812
Douglas Gregor9fabd852011-07-01 22:41:14 +00003813// RTEMS Target
3814template<typename Target>
3815class RTEMSTargetInfo : public OSTargetInfo<Target> {
3816protected:
Craig Topper3164f332014-03-11 03:39:26 +00003817 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3818 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003819 // RTEMS defines; list based off of gcc output
3820
Douglas Gregor9fabd852011-07-01 22:41:14 +00003821 Builder.defineMacro("__rtems__");
3822 Builder.defineMacro("__ELF__");
3823 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003824
Douglas Gregor9fabd852011-07-01 22:41:14 +00003825public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003826 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3827 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003828
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003829 switch (Triple.getArch()) {
3830 default:
3831 case llvm::Triple::x86:
3832 // this->MCountName = ".mcount";
3833 break;
3834 case llvm::Triple::mips:
3835 case llvm::Triple::mipsel:
3836 case llvm::Triple::ppc:
3837 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003838 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003839 // this->MCountName = "_mcount";
3840 break;
3841 case llvm::Triple::arm:
3842 // this->MCountName = "__mcount";
3843 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003844 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003845 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003846};
3847
Douglas Gregor9fabd852011-07-01 22:41:14 +00003848// x86-32 RTEMS target
3849class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3850public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003851 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003852 SizeType = UnsignedLong;
3853 IntPtrType = SignedLong;
3854 PtrDiffType = SignedLong;
3855 this->UserLabelPrefix = "";
3856 }
Craig Topper3164f332014-03-11 03:39:26 +00003857 void getTargetDefines(const LangOptions &Opts,
3858 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003859 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3860 Builder.defineMacro("__INTEL__");
3861 Builder.defineMacro("__rtems__");
3862 }
3863};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003864
Eli Friedman3fd920a2008-08-20 02:34:37 +00003865// x86-64 generic target
3866class X86_64TargetInfo : public X86TargetInfo {
3867public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003868 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003869 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003870 bool IsWinCOFF =
3871 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003872 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003873 LongDoubleWidth = 128;
3874 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003875 LargeArrayMinWidth = 128;
3876 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003877 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003878 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3879 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3880 IntPtrType = IsX32 ? SignedInt : SignedLong;
3881 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003882 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003883 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003884
Eric Christopher917e9522014-11-18 22:36:15 +00003885 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003886 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3887 : IsWinCOFF
3888 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3889 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003890
3891 // Use fpret only for long double.
3892 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003893
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003894 // Use fp2ret for _Complex long double.
3895 ComplexLongDoubleUsesFP2Ret = true;
3896
Charles Davisc7d5c942015-09-17 20:55:33 +00003897 // Make __builtin_ms_va_list available.
3898 HasBuiltinMSVaList = true;
3899
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003900 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003901 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003902 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003903 }
Craig Topper3164f332014-03-11 03:39:26 +00003904 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003905 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003906 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003907
Craig Topper3164f332014-03-11 03:39:26 +00003908 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003909 if (RegNo == 0) return 0;
3910 if (RegNo == 1) return 1;
3911 return -1;
3912 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003913
Craig Topper3164f332014-03-11 03:39:26 +00003914 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003915 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003916 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003917 CC == CC_IntelOclBicc ||
3918 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003919 }
3920
Craig Topper3164f332014-03-11 03:39:26 +00003921 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003922 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003923 }
3924
Pavel Chupinfd223e12014-08-04 12:39:43 +00003925 // for x32 we need it here explicitly
3926 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003927};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003928
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003929// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003930class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003931public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003932 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3933 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003934 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003935 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003936 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003937 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003938 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003939 SizeType = UnsignedLongLong;
3940 PtrDiffType = SignedLongLong;
3941 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003942 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003943 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003944
Craig Topper3164f332014-03-11 03:39:26 +00003945 void getTargetDefines(const LangOptions &Opts,
3946 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003947 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003948 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003949 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003950
Craig Topper3164f332014-03-11 03:39:26 +00003951 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003952 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003953 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003954
Craig Topper3164f332014-03-11 03:39:26 +00003955 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003956 switch (CC) {
3957 case CC_X86StdCall:
3958 case CC_X86ThisCall:
3959 case CC_X86FastCall:
3960 return CCCR_Ignore;
3961 case CC_C:
3962 case CC_X86VectorCall:
3963 case CC_IntelOclBicc:
3964 case CC_X86_64SysV:
3965 return CCCR_OK;
3966 default:
3967 return CCCR_Warning;
3968 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003969 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003970};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003971
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003972// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003973class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003974public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003975 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003976 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003977 LongDoubleWidth = LongDoubleAlign = 64;
3978 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003979 }
Craig Topper3164f332014-03-11 03:39:26 +00003980 void getTargetDefines(const LangOptions &Opts,
3981 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003982 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3983 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00003984 Builder.defineMacro("_M_X64", "100");
3985 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003986 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003987};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003988
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003989// x86-64 MinGW target
3990class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3991public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003992 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Yaron Keren480bc9f2015-08-20 21:51:46 +00003993 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003994 void getTargetDefines(const LangOptions &Opts,
3995 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003996 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003997 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003998 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003999 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004000
4001 // GCC defines this macro when it is using __gxx_personality_seh0.
4002 if (!Opts.SjLjExceptions)
4003 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004004 }
4005};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004006
Yaron Kerend030d112015-07-22 17:38:19 +00004007// x86-64 Cygwin target
4008class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4009public:
4010 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4011 : X86_64TargetInfo(Triple) {
4012 TLSSupported = false;
4013 WCharType = UnsignedShort;
4014 }
4015 void getTargetDefines(const LangOptions &Opts,
4016 MacroBuilder &Builder) const override {
4017 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4018 Builder.defineMacro("__x86_64__");
4019 Builder.defineMacro("__CYGWIN__");
4020 Builder.defineMacro("__CYGWIN64__");
4021 addCygMingDefines(Opts, Builder);
4022 DefineStd(Builder, "unix", Opts);
4023 if (Opts.CPlusPlus)
4024 Builder.defineMacro("_GNU_SOURCE");
4025
4026 // GCC defines this macro when it is using __gxx_personality_seh0.
4027 if (!Opts.SjLjExceptions)
4028 Builder.defineMacro("__SEH__");
4029 }
4030};
4031
Eli Friedman2857ccb2009-07-01 03:36:11 +00004032class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4033public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004034 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4035 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004036 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004037 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4038 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004039 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004040 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004041 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004042 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004043
4044 bool handleTargetFeatures(std::vector<std::string> &Features,
4045 DiagnosticsEngine &Diags) override {
4046 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4047 Diags))
4048 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004049 // We now know the features we have: we can decide how to align vectors.
4050 MaxVectorAlign =
4051 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004052 return true;
4053 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004054};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004055
Eli Friedman245f2292009-07-05 22:31:18 +00004056class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4057public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004058 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4059 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004060 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004061 Int64Type = SignedLongLong;
4062 }
4063};
Eli Friedman245f2292009-07-05 22:31:18 +00004064
Eli Friedman9fa28852012-08-08 23:57:20 +00004065class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4066public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004067 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4068 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4069 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004070 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004071 }
4072};
Tim Northover9bb857a2013-01-31 12:13:10 +00004073
Eli Friedmanf05b7722008-08-20 07:44:10 +00004074class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004075 // Possible FPU choices.
4076 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004077 VFP2FPU = (1 << 0),
4078 VFP3FPU = (1 << 1),
4079 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004080 NeonFPU = (1 << 3),
4081 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004082 };
4083
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004084 // Possible HWDiv features.
4085 enum HWDivMode {
4086 HWDivThumb = (1 << 0),
4087 HWDivARM = (1 << 1)
4088 };
4089
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004090 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004091 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004092 }
4093
4094 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4095 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004096
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004097 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004098
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004099 StringRef DefaultCPU;
4100 StringRef CPUProfile;
4101 StringRef CPUAttr;
4102
Rafael Espindolaeb265472013-08-21 21:59:03 +00004103 enum {
4104 FP_Default,
4105 FP_VFP,
4106 FP_Neon
4107 } FPMath;
4108
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004109 unsigned ArchISA;
4110 unsigned ArchKind;
4111 unsigned ArchProfile;
4112 unsigned ArchVersion;
4113
Bernard Ogdenda13af32013-10-24 18:32:51 +00004114 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004115
Logan Chien57086ce2012-10-10 06:56:20 +00004116 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004117 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004118
4119 // Initialized via features.
4120 unsigned SoftFloat : 1;
4121 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004122
Bernard Ogden18b57012013-10-29 09:47:51 +00004123 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004124 unsigned Crypto : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004125 unsigned Unaligned : 1;
4126
4127 enum {
4128 LDREX_B = (1 << 0), /// byte (8-bit)
4129 LDREX_H = (1 << 1), /// half (16-bit)
4130 LDREX_W = (1 << 2), /// word (32-bit)
4131 LDREX_D = (1 << 3), /// double (64-bit)
4132 };
4133
4134 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004135
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004136 // ACLE 6.5.1 Hardware floating point
4137 enum {
4138 HW_FP_HP = (1 << 1), /// half (16-bit)
4139 HW_FP_SP = (1 << 2), /// single (32-bit)
4140 HW_FP_DP = (1 << 3), /// double (64-bit)
4141 };
4142 uint32_t HW_FP;
4143
Chris Lattner5cc15e02010-03-03 19:03:45 +00004144 static const Builtin::Info BuiltinInfo[];
4145
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004146 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004147 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004148
4149 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004150 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004151
Renato Golin9ba39232015-02-27 16:35:48 +00004152 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4153 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4154 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004155 SizeType = UnsignedLong;
4156 else
4157 SizeType = UnsignedInt;
4158
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004159 switch (T.getOS()) {
4160 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004161 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004162 break;
4163 case llvm::Triple::Win32:
4164 WCharType = UnsignedShort;
4165 break;
4166 case llvm::Triple::Linux:
4167 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004168 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4169 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004170 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004171 }
4172
4173 UseBitFieldTypeAlignment = true;
4174
4175 ZeroLengthBitfieldBoundary = 0;
4176
Tim Northover147cd2f2014-10-14 22:12:21 +00004177 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4178 // so set preferred for small types to 32.
4179 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004180 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004181 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4182 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4183 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004184 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004185 DataLayoutString = "e"
4186 "-m:w"
4187 "-p:32:32"
4188 "-i64:64"
4189 "-v128:64:128"
4190 "-a:0:32"
4191 "-n32"
4192 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004193 } else if (T.isOSNaCl()) {
4194 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004195 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004196 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004197 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004198 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4199 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004200 }
4201
4202 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004203 }
4204
4205 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004206 const llvm::Triple &T = getTriple();
4207
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004208 IsAAPCS = false;
4209
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004210 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004211
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004212 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004213 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004214 SizeType = UnsignedInt;
4215 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004216 SizeType = UnsignedLong;
4217
4218 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4219 WCharType = SignedInt;
4220
4221 // Do not respect the alignment of bit-field types when laying out
4222 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4223 UseBitFieldTypeAlignment = false;
4224
4225 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4226 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4227 /// gcc.
4228 ZeroLengthBitfieldBoundary = 32;
4229
Tim Northover147cd2f2014-10-14 22:12:21 +00004230 if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004231 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004232 BigEndian
4233 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4234 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4235 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004236 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004237 BigEndian
4238 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4239 : "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 +00004240
4241 // FIXME: Override "preferred align" for double and long long.
4242 }
4243
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004244 void setArchInfo() {
4245 StringRef ArchName = getTriple().getArchName();
4246
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004247 ArchISA = llvm::ARM::parseArchISA(ArchName);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004248 DefaultCPU = getDefaultCPU(ArchName);
4249
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004250 unsigned ArchKind = llvm::ARM::parseArch(ArchName);
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004251 if (ArchKind == llvm::ARM::AK_INVALID)
4252 // set arch of the CPU, either provided explicitly or hardcoded default
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004253 ArchKind = llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004254 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004255 }
4256
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004257 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004258 StringRef SubArch;
4259
4260 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004261 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004262 SubArch = llvm::ARM::getSubArch(ArchKind);
4263 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4264 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004265
4266 // cache CPU related strings
4267 CPUAttr = getCPUAttr();
4268 CPUProfile = getCPUProfile();
4269 }
4270
4271 void setAtomic() {
4272 // when triple does not specify a sub arch,
4273 // then we are not using inline atomics
4274 bool ShouldUseInlineAtomic = DefaultCPU.empty() ?
4275 false :
4276 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4277 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
4278 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4279 if (ArchProfile == llvm::ARM::PK_M) {
4280 MaxAtomicPromoteWidth = 32;
4281 if (ShouldUseInlineAtomic)
4282 MaxAtomicInlineWidth = 32;
4283 }
4284 else {
4285 MaxAtomicPromoteWidth = 64;
4286 if (ShouldUseInlineAtomic)
4287 MaxAtomicInlineWidth = 64;
4288 }
4289 }
4290
4291 bool isThumb() const {
4292 return (ArchISA == llvm::ARM::IK_THUMB);
4293 }
4294
4295 bool supportsThumb() const {
4296 return CPUAttr.count('T') || ArchVersion >= 6;
4297 }
4298
4299 bool supportsThumb2() const {
4300 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4301 }
4302
4303 StringRef getDefaultCPU(StringRef ArchName) const {
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004304 return llvm::ARM::getDefaultCPU(ArchName);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004305 }
4306
4307 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004308 // For most sub-arches, the build attribute CPU name is enough.
4309 // For Cortex variants, it's slightly different.
4310 switch(ArchKind) {
4311 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004312 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004313 case llvm::ARM::AK_ARMV6M:
4314 case llvm::ARM::AK_ARMV6SM:
4315 case llvm::ARM::AK_ARMV6HL:
4316 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004317 case llvm::ARM::AK_ARMV7S:
4318 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004319 case llvm::ARM::AK_ARMV7:
4320 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004321 case llvm::ARM::AK_ARMV7L:
4322 case llvm::ARM::AK_ARMV7HL:
4323 return "7A";
4324 case llvm::ARM::AK_ARMV7R:
4325 return "7R";
4326 case llvm::ARM::AK_ARMV7M:
4327 return "7M";
4328 case llvm::ARM::AK_ARMV7EM:
4329 return "7EM";
4330 case llvm::ARM::AK_ARMV8A:
4331 return "8A";
4332 case llvm::ARM::AK_ARMV8_1A:
4333 return "8_1A";
4334 }
4335 }
4336
4337 StringRef getCPUProfile() const {
4338 switch(ArchProfile) {
4339 case llvm::ARM::PK_A:
4340 return "A";
4341 case llvm::ARM::PK_R:
4342 return "R";
4343 case llvm::ARM::PK_M:
4344 return "M";
4345 default:
4346 return "";
4347 }
4348 }
4349
Chris Lattner17df24e2008-04-21 18:56:49 +00004350public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004351 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004352 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004353 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004354 BigEndian = IsBigEndian;
4355
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004356 switch (getTriple().getOS()) {
4357 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004358 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004359 break;
4360 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004361 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004362 break;
4363 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004364
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004365 // cache arch related info
4366 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004367
Chris Lattner1a8f3942010-04-23 16:29:58 +00004368 // {} in inline assembly are neon specifiers, not assembly variant
4369 // specifiers.
4370 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004371
Eric Christopher0e261882014-12-05 01:06:59 +00004372 // FIXME: This duplicates code from the driver that sets the -target-abi
4373 // option - this code is used if -target-abi isn't passed and should
4374 // be unified in some way.
4375 if (Triple.isOSBinFormatMachO()) {
4376 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4377 // the frontend matches that.
4378 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4379 Triple.getOS() == llvm::Triple::UnknownOS ||
4380 StringRef(CPU).startswith("cortex-m")) {
4381 setABI("aapcs");
4382 } else {
4383 setABI("apcs-gnu");
4384 }
4385 } else if (Triple.isOSWindows()) {
4386 // FIXME: this is invalid for WindowsCE
4387 setABI("aapcs");
4388 } else {
4389 // Select the default based on the platform.
4390 switch (Triple.getEnvironment()) {
4391 case llvm::Triple::Android:
4392 case llvm::Triple::GNUEABI:
4393 case llvm::Triple::GNUEABIHF:
4394 setABI("aapcs-linux");
4395 break;
4396 case llvm::Triple::EABIHF:
4397 case llvm::Triple::EABI:
4398 setABI("aapcs");
4399 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004400 case llvm::Triple::GNU:
4401 setABI("apcs-gnu");
4402 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004403 default:
4404 if (Triple.getOS() == llvm::Triple::NetBSD)
4405 setABI("apcs-gnu");
4406 else
4407 setABI("aapcs");
4408 break;
4409 }
4410 }
John McCall86353412010-08-21 22:46:04 +00004411
4412 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004413 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004414
Renato Golin15b86152015-07-03 16:41:13 +00004415 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004416 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004417
James Molloya7139222012-03-12 09:14:10 +00004418 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004419 // the alignment of the zero-length bitfield is greater than the member
4420 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004421 // zero length bitfield.
4422 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004423 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004424
Alp Toker4925ba72014-06-07 23:30:42 +00004425 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004426
Craig Topper3164f332014-03-11 03:39:26 +00004427 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004428 ABI = Name;
4429
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004430 // The defaults (above) are for AAPCS, check if we need to change them.
4431 //
4432 // FIXME: We need support for -meabi... we could just mangle it into the
4433 // name.
4434 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004435 setABIAPCS();
4436 return true;
4437 }
4438 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4439 setABIAAPCS();
4440 return true;
4441 }
4442 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004443 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004444
Renato Golinf5c4dec2015-05-27 13:33:00 +00004445 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopheref1e2952015-08-28 02:13:58 +00004446 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4447 StringRef CPU,
Eric Christopher007b0a02015-08-28 22:32:01 +00004448 std::vector<std::string> &FeaturesVec) const override {
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004449
4450 std::vector<const char*> TargetFeatures;
4451
4452 // get default FPU features
4453 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU);
4454 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4455
4456 // get default Extension features
4457 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU);
4458 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4459
4460 for (const char *Feature : TargetFeatures)
4461 if (Feature[0] == '+')
4462 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004463
4464 if (ArchVersion < 6 ||
4465 (ArchVersion == 6 && ArchProfile == llvm::ARM::PK_M))
4466 Features["strict-align"] = true;
4467
Eric Christopher007b0a02015-08-28 22:32:01 +00004468 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004469 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004470
Craig Topper3164f332014-03-11 03:39:26 +00004471 bool handleTargetFeatures(std::vector<std::string> &Features,
4472 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004473 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004474 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004475 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004476 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004477 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004478 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004479
Ranjeet Singhac08e532015-06-24 23:39:25 +00004480 // This does not diagnose illegal cases like having both
4481 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4482 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004483 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004484 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004485 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004486 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004487 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004488 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004489 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004490 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004491 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004492 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004493 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004494 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004495 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004496 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004497 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004498 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004499 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004500 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004501 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004502 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004503 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004504 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004505 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004506 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004507 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004508 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004509 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004510 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004511 } else if (Feature == "+fp-only-sp") {
Ranjeet Singhac08e532015-06-24 23:39:25 +00004512 HW_FP_remove |= HW_FP_DP | HW_FP_HP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004513 } else if (Feature == "+strict-align") {
4514 Unaligned = 0;
4515 } else if (Feature == "+fp16") {
4516 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004517 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004518 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004519 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004520
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004521 switch (ArchVersion) {
4522 case 6:
4523 if (ArchProfile == llvm::ARM::PK_M)
4524 LDREX = 0;
4525 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4526 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4527 else
4528 LDREX = LDREX_W;
4529 break;
4530 case 7:
4531 if (ArchProfile == llvm::ARM::PK_M)
4532 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4533 else
4534 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4535 break;
4536 case 8:
4537 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4538 }
4539
Rafael Espindolaeb265472013-08-21 21:59:03 +00004540 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4541 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4542 return false;
4543 }
4544
4545 if (FPMath == FP_Neon)
4546 Features.push_back("+neonfp");
4547 else if (FPMath == FP_VFP)
4548 Features.push_back("-neonfp");
4549
Daniel Dunbar893d4752009-12-19 04:15:38 +00004550 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004551 auto Feature =
4552 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4553 if (Feature != Features.end())
4554 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004555
Rafael Espindolaeb265472013-08-21 21:59:03 +00004556 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004557 }
4558
Craig Topper3164f332014-03-11 03:39:26 +00004559 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004560 return llvm::StringSwitch<bool>(Feature)
4561 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004562 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004563 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004564 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004565 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004566 .Case("hwdiv", HWDiv & HWDivThumb)
4567 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004568 .Default(false);
4569 }
Renato Golin15b86152015-07-03 16:41:13 +00004570
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004571 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004572 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004573 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004574
Renato Golin15b86152015-07-03 16:41:13 +00004575 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004576 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004577 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004578 CPU = Name;
4579 return true;
4580 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004581
Craig Topper3164f332014-03-11 03:39:26 +00004582 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004583
Craig Topper3164f332014-03-11 03:39:26 +00004584 void getTargetDefines(const LangOptions &Opts,
4585 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004586 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004587 Builder.defineMacro("__arm");
4588 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004589
Chris Lattnerecd49032009-03-02 22:27:17 +00004590 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004591 Builder.defineMacro("__REGISTER_PREFIX__", "");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004592 if (!CPUAttr.empty())
4593 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004594
4595 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004596 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004597 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004598
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004599 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004600 // ACLE 6.5.7 Crypto Extension
4601 if (Crypto)
4602 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4603 // ACLE 6.5.8 CRC32 Extension
4604 if (CRC)
4605 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4606 // ACLE 6.5.10 Numeric Maximum and Minimum
4607 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4608 // ACLE 6.5.9 Directed Rounding
4609 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004610 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004611
4612 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4613 // is not defined for the M-profile.
4614 // NOTE that the deffault profile is assumed to be 'A'
4615 if (CPUProfile.empty() || CPUProfile != "M")
4616 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4617
4618 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4619 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4620 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004621 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004622 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004623 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004624 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4625
4626 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4627 // instruction set such as ARM or Thumb.
4628 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4629
4630 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4631
4632 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004633 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004634 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004635
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004636 // ACLE 6.4.3 Unaligned access supported in hardware
4637 if (Unaligned)
4638 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
4639
4640 // ACLE 6.4.4 LDREX/STREX
4641 if (LDREX)
4642 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4643
4644 // ACLE 6.4.5 CLZ
4645 if (ArchVersion == 5 ||
4646 (ArchVersion == 6 && CPUProfile != "M") ||
4647 ArchVersion > 6)
4648 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4649
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004650 // ACLE 6.5.1 Hardware Floating Point
4651 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004652 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004653
Yi Konga44c4d72014-06-27 21:25:42 +00004654 // ACLE predefines.
4655 Builder.defineMacro("__ARM_ACLE", "200");
4656
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004657 // FP16 support (we currently only support IEEE format).
4658 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4659 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4660
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004661 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4662 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4663 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4664
Mike Stump9d54bd72009-04-08 02:07:04 +00004665 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004666
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004667 // FIXME: It's more complicated than this and we don't really support
4668 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004669 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004670 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004671 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004672
David Tweed8f676532012-10-25 13:33:01 +00004673 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004674 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004675 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4676 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004677 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004678 Builder.defineMacro("__ARM_PCS", "1");
4679
David Tweed8f676532012-10-25 13:33:01 +00004680 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004681 Builder.defineMacro("__ARM_PCS_VFP", "1");
4682 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004683
Daniel Dunbar893d4752009-12-19 04:15:38 +00004684 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004685 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004686
4687 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004688 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004689
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004690 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004691 Builder.defineMacro("__THUMBEL__");
4692 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004693 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004694 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004695 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004696
4697 // ACLE 6.4.9 32-bit SIMD instructions
4698 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4699 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4700
4701 // ACLE 6.4.10 Hardware Integer Divide
4702 if (((HWDiv & HWDivThumb) && isThumb()) || ((HWDiv & HWDivARM) && !isThumb())) {
4703 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004704 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004705 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004706
4707 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004708 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004709
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004710 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004711 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004712 if (FPU & VFP2FPU)
4713 Builder.defineMacro("__ARM_VFPV2__");
4714 if (FPU & VFP3FPU)
4715 Builder.defineMacro("__ARM_VFPV3__");
4716 if (FPU & VFP4FPU)
4717 Builder.defineMacro("__ARM_VFPV4__");
4718 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004719
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004720 // This only gets set when Neon instructions are actually available, unlike
4721 // the VFP define, hence the soft float and arch check. This is subtly
4722 // different from gcc, we follow the intent which was that it should be set
4723 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004724 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004725 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004726 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004727 // current AArch32 NEON implementations do not support double-precision
4728 // floating-point even when it is present in VFP.
4729 Builder.defineMacro("__ARM_NEON_FP", "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004730 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004731
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004732 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4733 Opts.ShortWChar ? "2" : "4");
4734
4735 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4736 Opts.ShortEnums ? "1" : "4");
4737
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004738 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004739 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4740 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4741 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4742 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4743 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004744
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004745 // ACLE 6.4.7 DSP instructions
4746 bool hasDSP = false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004747 bool is5EOrAbove = (ArchVersion >= 6 ||
4748 (ArchVersion == 5 && CPUAttr.count('E')));
4749 // FIXME: We are not getting all 32-bit ARM architectures
4750 bool is32Bit = (!isThumb() || supportsThumb2());
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004751 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUAttr == "7EM")) {
4752 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
4753 hasDSP = true;
4754 }
4755
4756 // ACLE 6.4.8 Saturation instructions
4757 bool hasSAT = false;
4758 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4759 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
4760 hasSAT = true;
4761 }
4762
4763 // ACLE 6.4.6 Q (saturation) flag
4764 if (hasDSP || hasSAT)
4765 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004766 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004767
Craig Topper3164f332014-03-11 03:39:26 +00004768 void getTargetBuiltins(const Builtin::Info *&Records,
4769 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004770 Records = BuiltinInfo;
4771 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004772 }
Craig Topper3164f332014-03-11 03:39:26 +00004773 bool isCLZForZeroUndef() const override { return false; }
4774 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004775 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004776 }
Craig Topper3164f332014-03-11 03:39:26 +00004777 void getGCCRegNames(const char * const *&Names,
4778 unsigned &NumNames) const override;
4779 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4780 unsigned &NumAliases) const override;
4781 bool validateAsmConstraint(const char *&Name,
4782 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004783 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004784 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004785 case 'l': // r0-r7
4786 case 'h': // r8-r15
4787 case 'w': // VFP Floating point register single precision
4788 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004789 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004790 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004791 case 'I':
4792 case 'J':
4793 case 'K':
4794 case 'L':
4795 case 'M':
4796 // FIXME
4797 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004798 case 'Q': // A memory address that is a single base register.
4799 Info.setAllowsMemory();
4800 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004801 case 'U': // a memory reference...
4802 switch (Name[1]) {
4803 case 'q': // ...ARMV4 ldrsb
4804 case 'v': // ...VFP load/store (reg+constant offset)
4805 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004806 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004807 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004808 case 'n': // valid address for Neon doubleword vector load/store
4809 case 'm': // valid address for Neon element and structure load/store
4810 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004811 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004812 Info.setAllowsMemory();
4813 Name++;
4814 return true;
4815 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004816 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004817 return false;
4818 }
Craig Topper3164f332014-03-11 03:39:26 +00004819 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004820 std::string R;
4821 switch (*Constraint) {
4822 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004823 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004824 Constraint++;
4825 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004826 case 'p': // 'p' should be translated to 'r' by default.
4827 R = std::string("r");
4828 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004829 default:
4830 return std::string(1, *Constraint);
4831 }
4832 return R;
4833 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004834 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004835 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004836 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004837 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004838 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004839
Bill Wendling9d1ee112012-10-25 23:28:48 +00004840 // Strip off constraint modifiers.
4841 while (Constraint[0] == '=' ||
4842 Constraint[0] == '+' ||
4843 Constraint[0] == '&')
4844 Constraint = Constraint.substr(1);
4845
4846 switch (Constraint[0]) {
4847 default: break;
4848 case 'r': {
4849 switch (Modifier) {
4850 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004851 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004852 case 'q':
4853 // A register of size 32 cannot fit a vector type.
4854 return false;
4855 }
4856 }
4857 }
4858
4859 return true;
4860 }
Craig Topper3164f332014-03-11 03:39:26 +00004861 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004862 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004863 return "";
4864 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004865
Craig Topper3164f332014-03-11 03:39:26 +00004866 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004867 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4868 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004869
Craig Topper3164f332014-03-11 03:39:26 +00004870 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004871 if (RegNo == 0) return 0;
4872 if (RegNo == 1) return 1;
4873 return -1;
4874 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004875
4876 bool hasSjLjLowering() const override {
4877 return true;
4878 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004879};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004880
Rafael Espindolaeb265472013-08-21 21:59:03 +00004881bool ARMTargetInfo::setFPMath(StringRef Name) {
4882 if (Name == "neon") {
4883 FPMath = FP_Neon;
4884 return true;
4885 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4886 Name == "vfp4") {
4887 FPMath = FP_VFP;
4888 return true;
4889 }
4890 return false;
4891}
4892
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004893const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004894 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004895 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004896 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4897
4898 // Float registers
4899 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4900 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4901 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004902 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004903
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004904 // Double registers
4905 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4906 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004907 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4908 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004909
4910 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004911 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4912 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004913};
4914
4915void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004916 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004917 Names = GCCRegNames;
4918 NumNames = llvm::array_lengthof(GCCRegNames);
4919}
4920
4921const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004922 { { "a1" }, "r0" },
4923 { { "a2" }, "r1" },
4924 { { "a3" }, "r2" },
4925 { { "a4" }, "r3" },
4926 { { "v1" }, "r4" },
4927 { { "v2" }, "r5" },
4928 { { "v3" }, "r6" },
4929 { { "v4" }, "r7" },
4930 { { "v5" }, "r8" },
4931 { { "v6", "rfp" }, "r9" },
4932 { { "sl" }, "r10" },
4933 { { "fp" }, "r11" },
4934 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004935 { { "r13" }, "sp" },
4936 { { "r14" }, "lr" },
4937 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004938 // The S, D and Q registers overlap, but aren't really aliases; we
4939 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004940};
4941
4942void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4943 unsigned &NumAliases) const {
4944 Aliases = GCCRegAliases;
4945 NumAliases = llvm::array_lengthof(GCCRegAliases);
4946}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004947
4948const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00004949#define BUILTIN(ID, TYPE, ATTRS) \
4950 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
4951#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4952 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00004953#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004954
Craig Topper07d3b622015-08-07 05:14:44 +00004955#define BUILTIN(ID, TYPE, ATTRS) \
4956 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
4957#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
4958 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr},
4959#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4960 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004961#include "clang/Basic/BuiltinsARM.def"
4962};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004963
4964class ARMleTargetInfo : public ARMTargetInfo {
4965public:
4966 ARMleTargetInfo(const llvm::Triple &Triple)
4967 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004968 void getTargetDefines(const LangOptions &Opts,
4969 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004970 Builder.defineMacro("__ARMEL__");
4971 ARMTargetInfo::getTargetDefines(Opts, Builder);
4972 }
4973};
4974
4975class ARMbeTargetInfo : public ARMTargetInfo {
4976public:
4977 ARMbeTargetInfo(const llvm::Triple &Triple)
4978 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004979 void getTargetDefines(const LangOptions &Opts,
4980 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004981 Builder.defineMacro("__ARMEB__");
4982 Builder.defineMacro("__ARM_BIG_ENDIAN");
4983 ARMTargetInfo::getTargetDefines(Opts, Builder);
4984 }
4985};
Chris Lattner17df24e2008-04-21 18:56:49 +00004986
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004987class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4988 const llvm::Triple Triple;
4989public:
4990 WindowsARMTargetInfo(const llvm::Triple &Triple)
4991 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4992 TLSSupported = false;
4993 WCharType = UnsignedShort;
4994 SizeType = UnsignedInt;
4995 UserLabelPrefix = "";
4996 }
4997 void getVisualStudioDefines(const LangOptions &Opts,
4998 MacroBuilder &Builder) const {
4999 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5000
5001 // FIXME: this is invalid for WindowsCE
5002 Builder.defineMacro("_M_ARM_NT", "1");
5003 Builder.defineMacro("_M_ARMT", "_M_ARM");
5004 Builder.defineMacro("_M_THUMB", "_M_ARM");
5005
5006 assert((Triple.getArch() == llvm::Triple::arm ||
5007 Triple.getArch() == llvm::Triple::thumb) &&
5008 "invalid architecture for Windows ARM target info");
5009 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5010 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5011
5012 // TODO map the complete set of values
5013 // 31: VFPv3 40: VFPv4
5014 Builder.defineMacro("_M_ARM_FP", "31");
5015 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005016 BuiltinVaListKind getBuiltinVaListKind() const override {
5017 return TargetInfo::CharPtrBuiltinVaList;
5018 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005019 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5020 switch (CC) {
5021 case CC_X86StdCall:
5022 case CC_X86ThisCall:
5023 case CC_X86FastCall:
5024 case CC_X86VectorCall:
5025 return CCCR_Ignore;
5026 case CC_C:
5027 return CCCR_OK;
5028 default:
5029 return CCCR_Warning;
5030 }
5031 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005032};
5033
5034// Windows ARM + Itanium C++ ABI Target
5035class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5036public:
5037 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5038 : WindowsARMTargetInfo(Triple) {
5039 TheCXXABI.set(TargetCXXABI::GenericARM);
5040 }
5041
5042 void getTargetDefines(const LangOptions &Opts,
5043 MacroBuilder &Builder) const override {
5044 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5045
5046 if (Opts.MSVCCompat)
5047 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5048 }
5049};
5050
5051// Windows ARM, MS (C++) ABI
5052class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5053public:
5054 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5055 : WindowsARMTargetInfo(Triple) {
5056 TheCXXABI.set(TargetCXXABI::Microsoft);
5057 }
5058
5059 void getTargetDefines(const LangOptions &Opts,
5060 MacroBuilder &Builder) const override {
5061 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5062 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5063 }
5064};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005065
Yaron Keren321249c2015-07-15 13:32:23 +00005066// ARM MinGW target
5067class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5068public:
5069 MinGWARMTargetInfo(const llvm::Triple &Triple)
5070 : WindowsARMTargetInfo(Triple) {
5071 TheCXXABI.set(TargetCXXABI::GenericARM);
5072 }
5073
5074 void getTargetDefines(const LangOptions &Opts,
5075 MacroBuilder &Builder) const override {
5076 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5077 DefineStd(Builder, "WIN32", Opts);
5078 DefineStd(Builder, "WINNT", Opts);
5079 Builder.defineMacro("_ARM_");
5080 addMinGWDefines(Opts, Builder);
5081 }
5082};
5083
5084// ARM Cygwin target
5085class CygwinARMTargetInfo : public ARMleTargetInfo {
5086public:
5087 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5088 TLSSupported = false;
5089 WCharType = UnsignedShort;
5090 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005091 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005092 }
5093 void getTargetDefines(const LangOptions &Opts,
5094 MacroBuilder &Builder) const override {
5095 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5096 Builder.defineMacro("_ARM_");
5097 Builder.defineMacro("__CYGWIN__");
5098 Builder.defineMacro("__CYGWIN32__");
5099 DefineStd(Builder, "unix", Opts);
5100 if (Opts.CPlusPlus)
5101 Builder.defineMacro("_GNU_SOURCE");
5102 }
5103};
5104
Mike Stump11289f42009-09-09 15:08:12 +00005105class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005106 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005107protected:
Craig Topper3164f332014-03-11 03:39:26 +00005108 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5109 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005110 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005111 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005112
Torok Edwinb2b37c62009-06-30 17:10:35 +00005113public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005114 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005115 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005116 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005117 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005118 // FIXME: This should be based off of the target features in
5119 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005120 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005121
5122 // Darwin on iOS uses a variant of the ARM C++ ABI.
5123 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005124 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005125};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005126
Tim Northover573cbee2014-05-24 12:52:07 +00005127class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005128 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005129 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5130 static const char *const GCCRegNames[];
5131
James Molloy75f5f9e2014-04-16 15:33:48 +00005132 enum FPUModeEnum {
5133 FPUMode,
5134 NeonMode
5135 };
5136
5137 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005138 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005139 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005140 unsigned Unaligned;
James Molloy75f5f9e2014-04-16 15:33:48 +00005141
Tim Northovera2ee4332014-03-29 15:09:45 +00005142 static const Builtin::Info BuiltinInfo[];
5143
5144 std::string ABI;
5145
5146public:
Tim Northover573cbee2014-05-24 12:52:07 +00005147 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005148 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005149
5150 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5151 WCharType = SignedInt;
5152
5153 // NetBSD apparently prefers consistency across ARM targets to consistency
5154 // across 64-bit targets.
5155 Int64Type = SignedLongLong;
5156 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005157 } else {
5158 WCharType = UnsignedInt;
5159 Int64Type = SignedLong;
5160 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005161 }
5162
Tim Northovera2ee4332014-03-29 15:09:45 +00005163 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005164 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005165 MaxAtomicInlineWidth = 128;
5166 MaxAtomicPromoteWidth = 128;
5167
Tim Northovera6a19f12015-02-06 01:25:07 +00005168 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005169 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5170
Tim Northovera2ee4332014-03-29 15:09:45 +00005171 // {} in inline assembly are neon specifiers, not assembly variant
5172 // specifiers.
5173 NoAsmVariants = true;
5174
Tim Northover7ad87af2015-01-16 18:44:04 +00005175 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5176 // contributes to the alignment of the containing aggregate in the same way
5177 // a plain (non bit-field) member of that type would, without exception for
5178 // zero-sized or anonymous bit-fields."
5179 UseBitFieldTypeAlignment = true;
5180 UseZeroLengthBitfieldAlignment = true;
5181
Tim Northover573cbee2014-05-24 12:52:07 +00005182 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005183 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5184 }
5185
Alp Toker4925ba72014-06-07 23:30:42 +00005186 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005187 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005188 if (Name != "aapcs" && Name != "darwinpcs")
5189 return false;
5190
5191 ABI = Name;
5192 return true;
5193 }
5194
David Blaikie1cbb9712014-11-14 19:09:44 +00005195 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005196 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005197 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005198 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005199 .Case("cyclone", true)
5200 .Default(false);
5201 return CPUKnown;
5202 }
5203
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005204 void getTargetDefines(const LangOptions &Opts,
5205 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005206 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005207 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005208
5209 // Target properties.
5210 Builder.defineMacro("_LP64");
5211 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005212
5213 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5214 Builder.defineMacro("__ARM_ACLE", "200");
5215 Builder.defineMacro("__ARM_ARCH", "8");
5216 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5217
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005218 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005219 Builder.defineMacro("__ARM_PCS_AAPCS64");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005220 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005221
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005222 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5223 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5224 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5225 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005226 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005227 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5228 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005229
5230 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5231
5232 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005233 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005234
5235 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5236 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005237 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5238 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005239
5240 if (Opts.FastMath || Opts.FiniteMathOnly)
5241 Builder.defineMacro("__ARM_FP_FAST");
5242
Richard Smithab506ad2014-10-20 23:26:58 +00005243 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00005244 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
5245
5246 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5247
5248 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5249 Opts.ShortEnums ? "1" : "4");
5250
James Molloy75f5f9e2014-04-16 15:33:48 +00005251 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005252 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005253 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005254 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005255 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005256
Bradley Smith418c5932014-05-02 15:17:51 +00005257 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005258 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005259
James Molloy75f5f9e2014-04-16 15:33:48 +00005260 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005261 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5262
5263 if (Unaligned)
5264 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005265
5266 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5267 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5268 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5269 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5270 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005271 }
5272
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005273 void getTargetBuiltins(const Builtin::Info *&Records,
5274 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005275 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00005276 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00005277 }
5278
David Blaikie1cbb9712014-11-14 19:09:44 +00005279 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005280 return Feature == "aarch64" ||
5281 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005282 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005283 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005284 }
5285
James Molloy5e73df52014-04-16 15:06:20 +00005286 bool handleTargetFeatures(std::vector<std::string> &Features,
5287 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005288 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005289 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005290 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005291 Unaligned = 1;
5292
Eric Christopher610fe112015-08-26 08:21:55 +00005293 for (const auto &Feature : Features) {
5294 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005295 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005296 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005297 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005298 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005299 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005300 if (Feature == "+strict-align")
5301 Unaligned = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005302 }
5303
Eric Christopher964a5f32015-08-05 23:48:05 +00005304 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005305
5306 return true;
5307 }
5308
David Blaikie1cbb9712014-11-14 19:09:44 +00005309 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005310
David Blaikie1cbb9712014-11-14 19:09:44 +00005311 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005312 return TargetInfo::AArch64ABIBuiltinVaList;
5313 }
5314
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005315 void getGCCRegNames(const char *const *&Names,
5316 unsigned &NumNames) const override;
5317 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5318 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005319
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005320 bool validateAsmConstraint(const char *&Name,
5321 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005322 switch (*Name) {
5323 default:
5324 return false;
5325 case 'w': // Floating point and SIMD registers (V0-V31)
5326 Info.setAllowsRegister();
5327 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005328 case 'I': // Constant that can be used with an ADD instruction
5329 case 'J': // Constant that can be used with a SUB instruction
5330 case 'K': // Constant that can be used with a 32-bit logical instruction
5331 case 'L': // Constant that can be used with a 64-bit logical instruction
5332 case 'M': // Constant that can be used as a 32-bit MOV immediate
5333 case 'N': // Constant that can be used as a 64-bit MOV immediate
5334 case 'Y': // Floating point constant zero
5335 case 'Z': // Integer constant zero
5336 return true;
5337 case 'Q': // A memory reference with base register and no offset
5338 Info.setAllowsMemory();
5339 return true;
5340 case 'S': // A symbolic address
5341 Info.setAllowsRegister();
5342 return true;
5343 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005344 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5345 // Utf: A memory address suitable for ldp/stp in TF mode.
5346 // Usa: An absolute symbolic address.
5347 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5348 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005349 case 'z': // Zero register, wzr or xzr
5350 Info.setAllowsRegister();
5351 return true;
5352 case 'x': // Floating point and SIMD registers (V0-V15)
5353 Info.setAllowsRegister();
5354 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005355 }
5356 return false;
5357 }
5358
Akira Hatanaka987f1862014-08-22 06:05:21 +00005359 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005360 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005361 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005362 // Strip off constraint modifiers.
5363 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5364 Constraint = Constraint.substr(1);
5365
5366 switch (Constraint[0]) {
5367 default:
5368 return true;
5369 case 'z':
5370 case 'r': {
5371 switch (Modifier) {
5372 case 'x':
5373 case 'w':
5374 // For now assume that the person knows what they're
5375 // doing with the modifier.
5376 return true;
5377 default:
5378 // By default an 'r' constraint will be in the 'x'
5379 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005380 if (Size == 64)
5381 return true;
5382
5383 SuggestedModifier = "w";
5384 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005385 }
5386 }
5387 }
5388 }
5389
David Blaikie1cbb9712014-11-14 19:09:44 +00005390 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005391
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005392 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005393 if (RegNo == 0)
5394 return 0;
5395 if (RegNo == 1)
5396 return 1;
5397 return -1;
5398 }
5399};
5400
Tim Northover573cbee2014-05-24 12:52:07 +00005401const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005402 // 32-bit Integer registers
5403 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5404 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5405 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5406
5407 // 64-bit Integer registers
5408 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5409 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5410 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5411
5412 // 32-bit floating point regsisters
5413 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5414 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5415 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5416
5417 // 64-bit floating point regsisters
5418 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5419 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5420 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5421
5422 // Vector registers
5423 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5424 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5425 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5426};
5427
Tim Northover573cbee2014-05-24 12:52:07 +00005428void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005429 unsigned &NumNames) const {
5430 Names = GCCRegNames;
5431 NumNames = llvm::array_lengthof(GCCRegNames);
5432}
5433
Tim Northover573cbee2014-05-24 12:52:07 +00005434const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005435 { { "w31" }, "wsp" },
5436 { { "x29" }, "fp" },
5437 { { "x30" }, "lr" },
5438 { { "x31" }, "sp" },
5439 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5440 // don't want to substitute one of these for a different-sized one.
5441};
5442
Tim Northover573cbee2014-05-24 12:52:07 +00005443void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005444 unsigned &NumAliases) const {
5445 Aliases = GCCRegAliases;
5446 NumAliases = llvm::array_lengthof(GCCRegAliases);
5447}
5448
Tim Northover573cbee2014-05-24 12:52:07 +00005449const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005450#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005451 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005452#include "clang/Basic/BuiltinsNEON.def"
5453
5454#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005455 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005456#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005457};
James Molloy5e73df52014-04-16 15:06:20 +00005458
Tim Northover573cbee2014-05-24 12:52:07 +00005459class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005460 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005461 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005462 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005463 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005464 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005465 }
5466
5467public:
Tim Northover573cbee2014-05-24 12:52:07 +00005468 AArch64leTargetInfo(const llvm::Triple &Triple)
5469 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005470 BigEndian = false;
5471 }
5472 void getTargetDefines(const LangOptions &Opts,
5473 MacroBuilder &Builder) const override {
5474 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005475 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005476 }
5477};
5478
Tim Northover573cbee2014-05-24 12:52:07 +00005479class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005480 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005481 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005482 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005483 }
5484
5485public:
Tim Northover573cbee2014-05-24 12:52:07 +00005486 AArch64beTargetInfo(const llvm::Triple &Triple)
5487 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005488 void getTargetDefines(const LangOptions &Opts,
5489 MacroBuilder &Builder) const override {
5490 Builder.defineMacro("__AARCH64EB__");
5491 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5492 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005493 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005494 }
5495};
Tim Northovera2ee4332014-03-29 15:09:45 +00005496
Tim Northover573cbee2014-05-24 12:52:07 +00005497class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005498protected:
5499 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5500 MacroBuilder &Builder) const override {
5501 Builder.defineMacro("__AARCH64_SIMD__");
5502 Builder.defineMacro("__ARM64_ARCH_8__");
5503 Builder.defineMacro("__ARM_NEON__");
5504 Builder.defineMacro("__LITTLE_ENDIAN__");
5505 Builder.defineMacro("__REGISTER_PREFIX__", "");
5506 Builder.defineMacro("__arm64", "1");
5507 Builder.defineMacro("__arm64__", "1");
5508
5509 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5510 }
5511
Tim Northovera2ee4332014-03-29 15:09:45 +00005512public:
Tim Northover573cbee2014-05-24 12:52:07 +00005513 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5514 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005515 Int64Type = SignedLongLong;
5516 WCharType = SignedInt;
5517 UseSignedCharForObjCBool = false;
5518
Tim Northovera6a19f12015-02-06 01:25:07 +00005519 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005520 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5521
5522 TheCXXABI.set(TargetCXXABI::iOS64);
5523 }
5524
David Blaikie1cbb9712014-11-14 19:09:44 +00005525 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005526 return TargetInfo::CharPtrBuiltinVaList;
5527 }
5528};
Tim Northovera2ee4332014-03-29 15:09:45 +00005529
Tony Linthicum76329bf2011-12-12 21:14:55 +00005530// Hexagon abstract base class
5531class HexagonTargetInfo : public TargetInfo {
5532 static const Builtin::Info BuiltinInfo[];
5533 static const char * const GCCRegNames[];
5534 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5535 std::string CPU;
5536public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005537 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005538 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00005539 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005540
5541 // {} in inline assembly are packet specifiers, not assembly variant
5542 // specifiers.
5543 NoAsmVariants = true;
5544 }
5545
Craig Topper3164f332014-03-11 03:39:26 +00005546 void getTargetBuiltins(const Builtin::Info *&Records,
5547 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005548 Records = BuiltinInfo;
5549 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5550 }
5551
Craig Topper3164f332014-03-11 03:39:26 +00005552 bool validateAsmConstraint(const char *&Name,
5553 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005554 return true;
5555 }
5556
Craig Topper3164f332014-03-11 03:39:26 +00005557 void getTargetDefines(const LangOptions &Opts,
5558 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005559
Craig Topper3164f332014-03-11 03:39:26 +00005560 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005561 return Feature == "hexagon";
5562 }
Craig Topper3164f332014-03-11 03:39:26 +00005563
5564 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005565 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005566 }
Craig Topper3164f332014-03-11 03:39:26 +00005567 void getGCCRegNames(const char * const *&Names,
5568 unsigned &NumNames) const override;
5569 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5570 unsigned &NumAliases) const override;
5571 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005572 return "";
5573 }
Sebastian Pop86500282012-01-13 20:37:10 +00005574
5575 static const char *getHexagonCPUSuffix(StringRef Name) {
5576 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005577 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005578 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005579 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005580 }
5581
Craig Topper3164f332014-03-11 03:39:26 +00005582 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005583 if (!getHexagonCPUSuffix(Name))
5584 return false;
5585
Tony Linthicum76329bf2011-12-12 21:14:55 +00005586 CPU = Name;
5587 return true;
5588 }
5589};
5590
5591void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5592 MacroBuilder &Builder) const {
5593 Builder.defineMacro("qdsp6");
5594 Builder.defineMacro("__qdsp6", "1");
5595 Builder.defineMacro("__qdsp6__", "1");
5596
5597 Builder.defineMacro("hexagon");
5598 Builder.defineMacro("__hexagon", "1");
5599 Builder.defineMacro("__hexagon__", "1");
5600
5601 if(CPU == "hexagonv1") {
5602 Builder.defineMacro("__HEXAGON_V1__");
5603 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5604 if(Opts.HexagonQdsp6Compat) {
5605 Builder.defineMacro("__QDSP6_V1__");
5606 Builder.defineMacro("__QDSP6_ARCH__", "1");
5607 }
5608 }
5609 else if(CPU == "hexagonv2") {
5610 Builder.defineMacro("__HEXAGON_V2__");
5611 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5612 if(Opts.HexagonQdsp6Compat) {
5613 Builder.defineMacro("__QDSP6_V2__");
5614 Builder.defineMacro("__QDSP6_ARCH__", "2");
5615 }
5616 }
5617 else if(CPU == "hexagonv3") {
5618 Builder.defineMacro("__HEXAGON_V3__");
5619 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5620 if(Opts.HexagonQdsp6Compat) {
5621 Builder.defineMacro("__QDSP6_V3__");
5622 Builder.defineMacro("__QDSP6_ARCH__", "3");
5623 }
5624 }
5625 else if(CPU == "hexagonv4") {
5626 Builder.defineMacro("__HEXAGON_V4__");
5627 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5628 if(Opts.HexagonQdsp6Compat) {
5629 Builder.defineMacro("__QDSP6_V4__");
5630 Builder.defineMacro("__QDSP6_ARCH__", "4");
5631 }
5632 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005633 else if(CPU == "hexagonv5") {
5634 Builder.defineMacro("__HEXAGON_V5__");
5635 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5636 if(Opts.HexagonQdsp6Compat) {
5637 Builder.defineMacro("__QDSP6_V5__");
5638 Builder.defineMacro("__QDSP6_ARCH__", "5");
5639 }
5640 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005641}
5642
5643const char * const HexagonTargetInfo::GCCRegNames[] = {
5644 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5645 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5646 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5647 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5648 "p0", "p1", "p2", "p3",
5649 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5650};
5651
5652void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5653 unsigned &NumNames) const {
5654 Names = GCCRegNames;
5655 NumNames = llvm::array_lengthof(GCCRegNames);
5656}
5657
5658
5659const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5660 { { "sp" }, "r29" },
5661 { { "fp" }, "r30" },
5662 { { "lr" }, "r31" },
5663 };
5664
5665void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5666 unsigned &NumAliases) const {
5667 Aliases = GCCRegAliases;
5668 NumAliases = llvm::array_lengthof(GCCRegAliases);
5669}
5670
5671
5672const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005673#define BUILTIN(ID, TYPE, ATTRS) \
5674 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5675#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5676 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005677#include "clang/Basic/BuiltinsHexagon.def"
5678};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005679
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005680// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5681class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005682 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5683 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005684 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005685public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005686 SparcTargetInfo(const llvm::Triple &Triple)
5687 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005688
Craig Topper3164f332014-03-11 03:39:26 +00005689 bool handleTargetFeatures(std::vector<std::string> &Features,
5690 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005691 // The backend doesn't actually handle soft float yet, but in case someone
5692 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005693 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5694 if (Feature != Features.end()) {
5695 SoftFloat = true;
5696 Features.erase(Feature);
5697 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005698 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005699 }
Craig Topper3164f332014-03-11 03:39:26 +00005700 void getTargetDefines(const LangOptions &Opts,
5701 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005702 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005703 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005704
5705 if (SoftFloat)
5706 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005707 }
Craig Topper3164f332014-03-11 03:39:26 +00005708
5709 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005710 return llvm::StringSwitch<bool>(Feature)
5711 .Case("softfloat", SoftFloat)
5712 .Case("sparc", true)
5713 .Default(false);
5714 }
Craig Topper3164f332014-03-11 03:39:26 +00005715
5716 void getTargetBuiltins(const Builtin::Info *&Records,
5717 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005718 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005719 }
Craig Topper3164f332014-03-11 03:39:26 +00005720 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005721 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005722 }
Craig Topper3164f332014-03-11 03:39:26 +00005723 void getGCCRegNames(const char * const *&Names,
5724 unsigned &NumNames) const override;
5725 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5726 unsigned &NumAliases) const override;
5727 bool validateAsmConstraint(const char *&Name,
5728 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005729 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005730 switch (*Name) {
5731 case 'I': // Signed 13-bit constant
5732 case 'J': // Zero
5733 case 'K': // 32-bit constant with the low 12 bits clear
5734 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5735 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5736 case 'N': // Same as 'K' but zext (required for SIMode)
5737 case 'O': // The constant 4096
5738 return true;
5739 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005740 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005741 }
Craig Topper3164f332014-03-11 03:39:26 +00005742 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005743 // FIXME: Implement!
5744 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005745 }
5746};
5747
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005748const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005749 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5750 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5751 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5752 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5753};
5754
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005755void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5756 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005757 Names = GCCRegNames;
5758 NumNames = llvm::array_lengthof(GCCRegNames);
5759}
5760
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005761const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005762 { { "g0" }, "r0" },
5763 { { "g1" }, "r1" },
5764 { { "g2" }, "r2" },
5765 { { "g3" }, "r3" },
5766 { { "g4" }, "r4" },
5767 { { "g5" }, "r5" },
5768 { { "g6" }, "r6" },
5769 { { "g7" }, "r7" },
5770 { { "o0" }, "r8" },
5771 { { "o1" }, "r9" },
5772 { { "o2" }, "r10" },
5773 { { "o3" }, "r11" },
5774 { { "o4" }, "r12" },
5775 { { "o5" }, "r13" },
5776 { { "o6", "sp" }, "r14" },
5777 { { "o7" }, "r15" },
5778 { { "l0" }, "r16" },
5779 { { "l1" }, "r17" },
5780 { { "l2" }, "r18" },
5781 { { "l3" }, "r19" },
5782 { { "l4" }, "r20" },
5783 { { "l5" }, "r21" },
5784 { { "l6" }, "r22" },
5785 { { "l7" }, "r23" },
5786 { { "i0" }, "r24" },
5787 { { "i1" }, "r25" },
5788 { { "i2" }, "r26" },
5789 { { "i3" }, "r27" },
5790 { { "i4" }, "r28" },
5791 { { "i5" }, "r29" },
5792 { { "i6", "fp" }, "r30" },
5793 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005794};
5795
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005796void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5797 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005798 Aliases = GCCRegAliases;
5799 NumAliases = llvm::array_lengthof(GCCRegAliases);
5800}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005801
5802// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5803class SparcV8TargetInfo : public SparcTargetInfo {
5804public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005805 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005806 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00005807 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
5808 switch (getTriple().getOS()) {
5809 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00005810 SizeType = UnsignedInt;
5811 IntPtrType = SignedInt;
5812 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00005813 break;
5814 case llvm::Triple::NetBSD:
5815 case llvm::Triple::OpenBSD:
5816 SizeType = UnsignedLong;
5817 IntPtrType = SignedLong;
5818 PtrDiffType = SignedLong;
5819 break;
Brad Smith56495d52015-08-13 22:00:53 +00005820 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005821 }
5822
Craig Topper3164f332014-03-11 03:39:26 +00005823 void getTargetDefines(const LangOptions &Opts,
5824 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005825 SparcTargetInfo::getTargetDefines(Opts, Builder);
5826 Builder.defineMacro("__sparcv8");
5827 }
5828};
5829
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005830// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5831class SparcV8elTargetInfo : public SparcV8TargetInfo {
5832 public:
5833 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005834 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005835 BigEndian = false;
5836 }
5837};
5838
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005839// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5840class SparcV9TargetInfo : public SparcTargetInfo {
5841public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005842 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005843 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00005844 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005845 // This is an LP64 platform.
5846 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005847
5848 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005849 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005850 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005851 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005852 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005853 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005854
5855 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5856 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5857 LongDoubleWidth = 128;
5858 LongDoubleAlign = 128;
5859 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005860 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005861 }
5862
Craig Topper3164f332014-03-11 03:39:26 +00005863 void getTargetDefines(const LangOptions &Opts,
5864 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005865 SparcTargetInfo::getTargetDefines(Opts, Builder);
5866 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005867 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005868 // Solaris doesn't need these variants, but the BSDs do.
5869 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005870 Builder.defineMacro("__sparc64__");
5871 Builder.defineMacro("__sparc_v9__");
5872 Builder.defineMacro("__sparcv9__");
5873 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005874 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005875
Craig Topper3164f332014-03-11 03:39:26 +00005876 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005877 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5878 .Case("v9", true)
5879 .Case("ultrasparc", true)
5880 .Case("ultrasparc3", true)
5881 .Case("niagara", true)
5882 .Case("niagara2", true)
5883 .Case("niagara3", true)
5884 .Case("niagara4", true)
5885 .Default(false);
5886
5887 // No need to store the CPU yet. There aren't any CPU-specific
5888 // macros to define.
5889 return CPUKnown;
5890 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005891};
5892
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005893class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005894 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005895 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005896 std::string CPU;
5897 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005898 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005899
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005900public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005901 SystemZTargetInfo(const llvm::Triple &Triple)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005902 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005903 IntMaxType = SignedLong;
5904 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005905 TLSSupported = true;
5906 IntWidth = IntAlign = 32;
5907 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5908 PointerWidth = PointerAlign = 64;
5909 LongDoubleWidth = 128;
5910 LongDoubleAlign = 64;
5911 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005912 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005913 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00005914 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005915 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5916 }
5917 void getTargetDefines(const LangOptions &Opts,
5918 MacroBuilder &Builder) const override {
5919 Builder.defineMacro("__s390__");
5920 Builder.defineMacro("__s390x__");
5921 Builder.defineMacro("__zarch__");
5922 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005923 if (HasTransactionalExecution)
5924 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005925 if (Opts.ZVector)
5926 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005927 }
5928 void getTargetBuiltins(const Builtin::Info *&Records,
5929 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005930 Records = BuiltinInfo;
5931 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005932 }
5933
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005934 void getGCCRegNames(const char *const *&Names,
5935 unsigned &NumNames) const override;
5936 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5937 unsigned &NumAliases) const override {
5938 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005939 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005940 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005941 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005942 bool validateAsmConstraint(const char *&Name,
5943 TargetInfo::ConstraintInfo &info) const override;
5944 const char *getClobbers() const override {
5945 // FIXME: Is this really right?
5946 return "";
5947 }
5948 BuiltinVaListKind getBuiltinVaListKind() const override {
5949 return TargetInfo::SystemZBuiltinVaList;
5950 }
5951 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005952 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005953 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5954 .Case("z10", true)
5955 .Case("z196", true)
5956 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005957 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005958 .Default(false);
5959
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005960 return CPUKnown;
5961 }
Eric Christopheref1e2952015-08-28 02:13:58 +00005962 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
Eric Christophera8a14c32015-08-31 18:39:16 +00005963 StringRef CPU,
5964 std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005965 if (CPU == "zEC12")
5966 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005967 if (CPU == "z13") {
5968 Features["transactional-execution"] = true;
5969 Features["vector"] = true;
5970 }
Eric Christopher007b0a02015-08-28 22:32:01 +00005971 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005972 }
5973
5974 bool handleTargetFeatures(std::vector<std::string> &Features,
5975 DiagnosticsEngine &Diags) override {
5976 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00005977 for (const auto &Feature : Features) {
5978 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005979 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00005980 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005981 HasVector = true;
5982 }
5983 // If we use the vector ABI, vector types are 64-bit aligned.
5984 if (HasVector) {
5985 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005986 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5987 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005988 }
5989 return true;
5990 }
5991
5992 bool hasFeature(StringRef Feature) const override {
5993 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005994 .Case("systemz", true)
5995 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005996 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005997 .Default(false);
5998 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005999
6000 StringRef getABI() const override {
6001 if (HasVector)
6002 return "vector";
6003 return "";
6004 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006005
6006 bool useFloat128ManglingForLongDouble() const override {
6007 return true;
6008 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006009};
6010
6011const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6012#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006013 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006014#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006015};
6016
6017const char *const SystemZTargetInfo::GCCRegNames[] = {
6018 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6019 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6020 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6021 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6022};
6023
6024void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
6025 unsigned &NumNames) const {
6026 Names = GCCRegNames;
6027 NumNames = llvm::array_lengthof(GCCRegNames);
6028}
6029
6030bool SystemZTargetInfo::
6031validateAsmConstraint(const char *&Name,
6032 TargetInfo::ConstraintInfo &Info) const {
6033 switch (*Name) {
6034 default:
6035 return false;
6036
6037 case 'a': // Address register
6038 case 'd': // Data register (equivalent to 'r')
6039 case 'f': // Floating-point register
6040 Info.setAllowsRegister();
6041 return true;
6042
6043 case 'I': // Unsigned 8-bit constant
6044 case 'J': // Unsigned 12-bit constant
6045 case 'K': // Signed 16-bit constant
6046 case 'L': // Signed 20-bit displacement (on all targets we support)
6047 case 'M': // 0x7fffffff
6048 return true;
6049
6050 case 'Q': // Memory with base and unsigned 12-bit displacement
6051 case 'R': // Likewise, plus an index
6052 case 'S': // Memory with base and signed 20-bit displacement
6053 case 'T': // Likewise, plus an index
6054 Info.setAllowsMemory();
6055 return true;
6056 }
6057}
Ulrich Weigand47445072013-05-06 16:26:41 +00006058
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006059 class MSP430TargetInfo : public TargetInfo {
6060 static const char * const GCCRegNames[];
6061 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006062 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006063 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006064 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00006065 IntWidth = 16; IntAlign = 16;
6066 LongWidth = 32; LongLongWidth = 64;
6067 LongAlign = LongLongAlign = 16;
6068 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006069 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006070 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00006071 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00006072 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006073 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00006074 SigAtomicType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00006075 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00006076 }
6077 void getTargetDefines(const LangOptions &Opts,
6078 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006079 Builder.defineMacro("MSP430");
6080 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006081 // FIXME: defines for different 'flavours' of MCU
6082 }
Craig Topper3164f332014-03-11 03:39:26 +00006083 void getTargetBuiltins(const Builtin::Info *&Records,
6084 unsigned &NumRecords) const override {
6085 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00006086 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006087 NumRecords = 0;
6088 }
Craig Topper3164f332014-03-11 03:39:26 +00006089 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006090 return Feature == "msp430";
6091 }
Craig Topper3164f332014-03-11 03:39:26 +00006092 void getGCCRegNames(const char * const *&Names,
6093 unsigned &NumNames) const override;
6094 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6095 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006096 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00006097 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006098 NumAliases = 0;
6099 }
Eric Christopher917e9522014-11-18 22:36:15 +00006100 bool
6101 validateAsmConstraint(const char *&Name,
6102 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006103 // FIXME: implement
6104 switch (*Name) {
6105 case 'K': // the constant 1
6106 case 'L': // constant -1^20 .. 1^19
6107 case 'M': // constant 1-4:
6108 return true;
6109 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00006110 // No target constraints for now.
6111 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006112 }
Craig Topper3164f332014-03-11 03:39:26 +00006113 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006114 // FIXME: Is this really right?
6115 return "";
6116 }
Craig Topper3164f332014-03-11 03:39:26 +00006117 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006118 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00006119 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006120 }
6121 };
6122
6123 const char * const MSP430TargetInfo::GCCRegNames[] = {
6124 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6125 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
6126 };
6127
6128 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
6129 unsigned &NumNames) const {
6130 Names = GCCRegNames;
6131 NumNames = llvm::array_lengthof(GCCRegNames);
6132 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00006133
Mike Stump11289f42009-09-09 15:08:12 +00006134 // LLVM and Clang cannot be used directly to output native binaries for
6135 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00006136 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00006137 //
6138 // TCE uses the llvm bitcode as input and uses it for generating customized
6139 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00006140 // publicly available in http://tce.cs.tut.fi
6141
Eli Friedman1f191002011-10-07 19:51:42 +00006142 static const unsigned TCEOpenCLAddrSpaceMap[] = {
6143 3, // opencl_global
6144 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00006145 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006146 // FIXME: generic has to be added to the target
6147 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00006148 0, // cuda_device
6149 0, // cuda_constant
6150 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00006151 };
6152
Eli Friedmana9c3d712009-08-19 20:47:07 +00006153 class TCETargetInfo : public TargetInfo{
6154 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006155 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00006156 TLSSupported = false;
6157 IntWidth = 32;
6158 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006159 PointerWidth = 32;
6160 IntAlign = 32;
6161 LongAlign = LongLongAlign = 32;
6162 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006163 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006164 SizeType = UnsignedInt;
6165 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006166 IntPtrType = SignedInt;
6167 PtrDiffType = SignedInt;
6168 FloatWidth = 32;
6169 FloatAlign = 32;
6170 DoubleWidth = 32;
6171 DoubleAlign = 32;
6172 LongDoubleWidth = 32;
6173 LongDoubleAlign = 32;
6174 FloatFormat = &llvm::APFloat::IEEEsingle;
6175 DoubleFormat = &llvm::APFloat::IEEEsingle;
6176 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Eric Christopher964a5f32015-08-05 23:48:05 +00006177 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6178 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00006179 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006180 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006181 }
6182
Craig Topper3164f332014-03-11 03:39:26 +00006183 void getTargetDefines(const LangOptions &Opts,
6184 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006185 DefineStd(Builder, "tce", Opts);
6186 Builder.defineMacro("__TCE__");
6187 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00006188 }
Craig Topper3164f332014-03-11 03:39:26 +00006189 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006190 return Feature == "tce";
6191 }
Craig Topper3164f332014-03-11 03:39:26 +00006192
6193 void getTargetBuiltins(const Builtin::Info *&Records,
6194 unsigned &NumRecords) const override {}
6195 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00006196 return "";
6197 }
Craig Topper3164f332014-03-11 03:39:26 +00006198 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006199 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006200 }
Craig Topper3164f332014-03-11 03:39:26 +00006201 void getGCCRegNames(const char * const *&Names,
6202 unsigned &NumNames) const override {}
6203 bool validateAsmConstraint(const char *&Name,
6204 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00006205 return true;
6206 }
Craig Topper3164f332014-03-11 03:39:26 +00006207 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6208 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00006209 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00006210
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006211class BPFTargetInfo : public TargetInfo {
6212public:
6213 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6214 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6215 SizeType = UnsignedLong;
6216 PtrDiffType = SignedLong;
6217 IntPtrType = SignedLong;
6218 IntMaxType = SignedLong;
6219 Int64Type = SignedLong;
6220 RegParmMax = 5;
6221 if (Triple.getArch() == llvm::Triple::bpfeb) {
6222 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006223 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006224 } else {
6225 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006226 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006227 }
6228 MaxAtomicPromoteWidth = 64;
6229 MaxAtomicInlineWidth = 64;
6230 TLSSupported = false;
6231 }
6232 void getTargetDefines(const LangOptions &Opts,
6233 MacroBuilder &Builder) const override {
6234 DefineStd(Builder, "bpf", Opts);
6235 Builder.defineMacro("__BPF__");
6236 }
6237 bool hasFeature(StringRef Feature) const override {
6238 return Feature == "bpf";
6239 }
6240
6241 void getTargetBuiltins(const Builtin::Info *&Records,
6242 unsigned &NumRecords) const override {}
6243 const char *getClobbers() const override {
6244 return "";
6245 }
6246 BuiltinVaListKind getBuiltinVaListKind() const override {
6247 return TargetInfo::VoidPtrBuiltinVaList;
6248 }
6249 void getGCCRegNames(const char * const *&Names,
6250 unsigned &NumNames) const override {
6251 Names = nullptr;
6252 NumNames = 0;
6253 }
6254 bool validateAsmConstraint(const char *&Name,
6255 TargetInfo::ConstraintInfo &info) const override {
6256 return true;
6257 }
6258 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6259 unsigned &NumAliases) const override {
6260 Aliases = nullptr;
6261 NumAliases = 0;
6262 }
6263};
6264
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006265class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006266 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006267
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006268 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006269 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006270 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006271 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006272 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006273 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006274 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006275 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006276 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006277 enum DspRevEnum {
6278 NoDSP, DSP1, DSP2
6279 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006280 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006281
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006282protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006283 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006284 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006285
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006286public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006287 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6288 const std::string &CPUStr)
6289 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006290 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006291 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6292 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6293 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006294
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006295 bool isNaN2008Default() const {
6296 return CPU == "mips32r6" || CPU == "mips64r6";
6297 }
6298
6299 bool isFP64Default() const {
6300 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6301 }
6302
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006303 bool isNan2008() const override {
6304 return IsNan2008;
6305 }
6306
Alp Toker4925ba72014-06-07 23:30:42 +00006307 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006308 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006309 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6310 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006311 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006312 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006313 .Case("mips1", IsMips32)
6314 .Case("mips2", IsMips32)
6315 .Case("mips3", true)
6316 .Case("mips4", true)
6317 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006318 .Case("mips32", IsMips32)
6319 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006320 .Case("mips32r3", IsMips32)
6321 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006322 .Case("mips32r6", IsMips32)
6323 .Case("mips64", true)
6324 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006325 .Case("mips64r3", true)
6326 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006327 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006328 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006329 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006330 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006331 const std::string& getCPU() const { return CPU; }
Eric Christopheref1e2952015-08-28 02:13:58 +00006332 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
Eric Christophera8a14c32015-08-31 18:39:16 +00006333 StringRef CPU,
6334 std::vector<std::string> &FeaturesVec) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006335 if (CPU == "octeon")
6336 Features["mips64r2"] = Features["cnmips"] = true;
6337 else
6338 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006339 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006340 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006341
Craig Topper3164f332014-03-11 03:39:26 +00006342 void getTargetDefines(const LangOptions &Opts,
6343 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006344 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006345 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006346 if (Opts.GNUMode)
6347 Builder.defineMacro("mips");
6348
Simon Atanasyan683535b2012-08-29 19:14:58 +00006349 Builder.defineMacro("__REGISTER_PREFIX__", "");
6350
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006351 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006352 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006353 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006354 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006355 case SoftFloat:
6356 Builder.defineMacro("__mips_soft_float", Twine(1));
6357 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006358 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006359
Simon Atanasyan16071912013-04-14 14:07:30 +00006360 if (IsSingleFloat)
6361 Builder.defineMacro("__mips_single_float", Twine(1));
6362
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006363 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6364 Builder.defineMacro("_MIPS_FPSET",
6365 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6366
Simon Atanasyan72244b62012-07-05 16:06:06 +00006367 if (IsMips16)
6368 Builder.defineMacro("__mips16", Twine(1));
6369
Simon Atanasyan60777612013-04-14 14:07:51 +00006370 if (IsMicromips)
6371 Builder.defineMacro("__mips_micromips", Twine(1));
6372
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006373 if (IsNan2008)
6374 Builder.defineMacro("__mips_nan2008", Twine(1));
6375
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006376 switch (DspRev) {
6377 default:
6378 break;
6379 case DSP1:
6380 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6381 Builder.defineMacro("__mips_dsp", Twine(1));
6382 break;
6383 case DSP2:
6384 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6385 Builder.defineMacro("__mips_dspr2", Twine(1));
6386 Builder.defineMacro("__mips_dsp", Twine(1));
6387 break;
6388 }
6389
Jack Carter44ff1e52013-08-12 17:20:29 +00006390 if (HasMSA)
6391 Builder.defineMacro("__mips_msa", Twine(1));
6392
Simon Atanasyan26f19672012-04-05 19:28:31 +00006393 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6394 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6395 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006396
6397 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6398 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006399 }
6400
Craig Topper3164f332014-03-11 03:39:26 +00006401 void getTargetBuiltins(const Builtin::Info *&Records,
6402 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006403 Records = BuiltinInfo;
6404 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006405 }
Craig Topper3164f332014-03-11 03:39:26 +00006406 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006407 return llvm::StringSwitch<bool>(Feature)
6408 .Case("mips", true)
6409 .Case("fp64", HasFP64)
6410 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006411 }
Craig Topper3164f332014-03-11 03:39:26 +00006412 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006413 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006414 }
Craig Topper3164f332014-03-11 03:39:26 +00006415 void getGCCRegNames(const char * const *&Names,
6416 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006417 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006418 // CPU register names
6419 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006420 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6421 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6422 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006423 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6424 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006425 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6426 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6427 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6428 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006429 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006430 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006431 "$fcc5","$fcc6","$fcc7",
6432 // MSA register names
6433 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6434 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6435 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6436 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6437 // MSA control register names
6438 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6439 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006440 };
6441 Names = GCCRegNames;
6442 NumNames = llvm::array_lengthof(GCCRegNames);
6443 }
Craig Topper3164f332014-03-11 03:39:26 +00006444 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6445 unsigned &NumAliases) const override = 0;
6446 bool validateAsmConstraint(const char *&Name,
6447 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006448 switch (*Name) {
6449 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006450 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006451 case 'r': // CPU registers.
6452 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006453 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006454 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006455 case 'c': // $25 for indirect jumps
6456 case 'l': // lo register
6457 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006458 Info.setAllowsRegister();
6459 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006460 case 'I': // Signed 16-bit constant
6461 case 'J': // Integer 0
6462 case 'K': // Unsigned 16-bit constant
6463 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6464 case 'M': // Constants not loadable via lui, addiu, or ori
6465 case 'N': // Constant -1 to -65535
6466 case 'O': // A signed 15-bit constant
6467 case 'P': // A constant between 1 go 65535
6468 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006469 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006470 Info.setAllowsMemory();
6471 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006472 case 'Z':
6473 if (Name[1] == 'C') { // An address usable by ll, and sc.
6474 Info.setAllowsMemory();
6475 Name++; // Skip over 'Z'.
6476 return true;
6477 }
6478 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006479 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006480 }
6481
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006482 std::string convertConstraint(const char *&Constraint) const override {
6483 std::string R;
6484 switch (*Constraint) {
6485 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6486 if (Constraint[1] == 'C') {
6487 R = std::string("^") + std::string(Constraint, 2);
6488 Constraint++;
6489 return R;
6490 }
6491 break;
6492 }
6493 return TargetInfo::convertConstraint(Constraint);
6494 }
6495
Craig Topper3164f332014-03-11 03:39:26 +00006496 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006497 // In GCC, $1 is not widely used in generated code (it's used only in a few
6498 // specific situations), so there is no real need for users to add it to
6499 // the clobbers list if they want to use it in their inline assembly code.
6500 //
6501 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6502 // code generation, so using it in inline assembly without adding it to the
6503 // clobbers list can cause conflicts between the inline assembly code and
6504 // the surrounding generated code.
6505 //
6506 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6507 // operands, which will conflict with the ".set at" assembler option (which
6508 // we use only for inline assembly, in order to maintain compatibility with
6509 // GCC) and will also conflict with the user's usage of $1.
6510 //
6511 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6512 // register for generated code is to automatically clobber $1 for all inline
6513 // assembly code.
6514 //
6515 // FIXME: We should automatically clobber $1 only for inline assembly code
6516 // which actually uses it. This would allow LLVM to use $1 for inline
6517 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006518 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006519 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006520
Craig Topper3164f332014-03-11 03:39:26 +00006521 bool handleTargetFeatures(std::vector<std::string> &Features,
6522 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006523 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006524 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006525 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006526 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006527 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006528 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006529 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006530
Eric Christopher610fe112015-08-26 08:21:55 +00006531 for (const auto &Feature : Features) {
6532 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006533 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006534 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006535 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006536 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006537 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006538 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006539 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006540 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006541 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006542 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006543 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006544 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006545 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006546 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006547 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006548 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006549 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006550 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006551 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006552 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006553 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006554 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006555
Eric Christopher964a5f32015-08-05 23:48:05 +00006556 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006557
Rafael Espindolaeb265472013-08-21 21:59:03 +00006558 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006559 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006560
Craig Topper3164f332014-03-11 03:39:26 +00006561 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006562 if (RegNo == 0) return 4;
6563 if (RegNo == 1) return 5;
6564 return -1;
6565 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006566
6567 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006568};
6569
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006570const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006571#define BUILTIN(ID, TYPE, ATTRS) \
6572 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6573#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6574 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006575#include "clang/Basic/BuiltinsMips.def"
6576};
6577
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006578class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006579public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006580 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006581 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006582 SizeType = UnsignedInt;
6583 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006584 Int64Type = SignedLongLong;
6585 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006586 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006587 }
Craig Topper3164f332014-03-11 03:39:26 +00006588 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006589 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006590 ABI = Name;
6591 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006592 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006593 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006594 }
Craig Topper3164f332014-03-11 03:39:26 +00006595 void getTargetDefines(const LangOptions &Opts,
6596 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006597 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006598
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006599 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006600 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6601
6602 const std::string& CPUStr = getCPU();
6603 if (CPUStr == "mips32")
6604 Builder.defineMacro("__mips_isa_rev", "1");
6605 else if (CPUStr == "mips32r2")
6606 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006607 else if (CPUStr == "mips32r3")
6608 Builder.defineMacro("__mips_isa_rev", "3");
6609 else if (CPUStr == "mips32r5")
6610 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006611 else if (CPUStr == "mips32r6")
6612 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006613
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006614 if (ABI == "o32") {
6615 Builder.defineMacro("__mips_o32");
6616 Builder.defineMacro("_ABIO32", "1");
6617 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6618 }
6619 else if (ABI == "eabi")
6620 Builder.defineMacro("__mips_eabi");
6621 else
David Blaikie83d382b2011-09-23 05:06:16 +00006622 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006623 }
Craig Topper3164f332014-03-11 03:39:26 +00006624 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6625 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006626 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6627 { { "at" }, "$1" },
6628 { { "v0" }, "$2" },
6629 { { "v1" }, "$3" },
6630 { { "a0" }, "$4" },
6631 { { "a1" }, "$5" },
6632 { { "a2" }, "$6" },
6633 { { "a3" }, "$7" },
6634 { { "t0" }, "$8" },
6635 { { "t1" }, "$9" },
6636 { { "t2" }, "$10" },
6637 { { "t3" }, "$11" },
6638 { { "t4" }, "$12" },
6639 { { "t5" }, "$13" },
6640 { { "t6" }, "$14" },
6641 { { "t7" }, "$15" },
6642 { { "s0" }, "$16" },
6643 { { "s1" }, "$17" },
6644 { { "s2" }, "$18" },
6645 { { "s3" }, "$19" },
6646 { { "s4" }, "$20" },
6647 { { "s5" }, "$21" },
6648 { { "s6" }, "$22" },
6649 { { "s7" }, "$23" },
6650 { { "t8" }, "$24" },
6651 { { "t9" }, "$25" },
6652 { { "k0" }, "$26" },
6653 { { "k1" }, "$27" },
6654 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006655 { { "sp","$sp" }, "$29" },
6656 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006657 { { "ra" }, "$31" }
6658 };
6659 Aliases = GCCRegAliases;
6660 NumAliases = llvm::array_lengthof(GCCRegAliases);
6661 }
6662};
6663
6664class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006665 void setDataLayoutString() override {
6666 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006667 }
6668
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006669public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006670 Mips32EBTargetInfo(const llvm::Triple &Triple)
6671 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006672 }
Craig Topper3164f332014-03-11 03:39:26 +00006673 void getTargetDefines(const LangOptions &Opts,
6674 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006675 DefineStd(Builder, "MIPSEB", Opts);
6676 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006677 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006678 }
6679};
6680
6681class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006682 void setDataLayoutString() override {
6683 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006684 }
6685
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006686public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006687 Mips32ELTargetInfo(const llvm::Triple &Triple)
6688 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006689 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006690 }
Craig Topper3164f332014-03-11 03:39:26 +00006691 void getTargetDefines(const LangOptions &Opts,
6692 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006693 DefineStd(Builder, "MIPSEL", Opts);
6694 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006695 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006696 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006697};
Akira Hatanakabef17452011-09-20 19:21:49 +00006698
6699class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006700public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006701 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006702 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006703 LongDoubleWidth = LongDoubleAlign = 128;
6704 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006705 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6706 LongDoubleWidth = LongDoubleAlign = 64;
6707 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6708 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006709 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006710 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006711 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006712 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006713
6714 void setN64ABITypes() {
6715 LongWidth = LongAlign = 64;
6716 PointerWidth = PointerAlign = 64;
6717 SizeType = UnsignedLong;
6718 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006719 Int64Type = SignedLong;
6720 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006721 }
6722
6723 void setN32ABITypes() {
6724 LongWidth = LongAlign = 32;
6725 PointerWidth = PointerAlign = 32;
6726 SizeType = UnsignedInt;
6727 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006728 Int64Type = SignedLongLong;
6729 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006730 }
6731
Craig Topper3164f332014-03-11 03:39:26 +00006732 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006733 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006734 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006735 ABI = Name;
6736 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006737 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006738 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006739 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006740 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006741 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006742 }
6743 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006744 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006745
Craig Topper3164f332014-03-11 03:39:26 +00006746 void getTargetDefines(const LangOptions &Opts,
6747 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006748 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006749
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006750 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006751 Builder.defineMacro("__mips64");
6752 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006753 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6754
6755 const std::string& CPUStr = getCPU();
6756 if (CPUStr == "mips64")
6757 Builder.defineMacro("__mips_isa_rev", "1");
6758 else if (CPUStr == "mips64r2")
6759 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006760 else if (CPUStr == "mips64r3")
6761 Builder.defineMacro("__mips_isa_rev", "3");
6762 else if (CPUStr == "mips64r5")
6763 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006764 else if (CPUStr == "mips64r6")
6765 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006766
Akira Hatanakabef17452011-09-20 19:21:49 +00006767 if (ABI == "n32") {
6768 Builder.defineMacro("__mips_n32");
6769 Builder.defineMacro("_ABIN32", "2");
6770 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6771 }
6772 else if (ABI == "n64") {
6773 Builder.defineMacro("__mips_n64");
6774 Builder.defineMacro("_ABI64", "3");
6775 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6776 }
6777 else
David Blaikie83d382b2011-09-23 05:06:16 +00006778 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006779 }
Craig Topper3164f332014-03-11 03:39:26 +00006780 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6781 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006782 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6783 { { "at" }, "$1" },
6784 { { "v0" }, "$2" },
6785 { { "v1" }, "$3" },
6786 { { "a0" }, "$4" },
6787 { { "a1" }, "$5" },
6788 { { "a2" }, "$6" },
6789 { { "a3" }, "$7" },
6790 { { "a4" }, "$8" },
6791 { { "a5" }, "$9" },
6792 { { "a6" }, "$10" },
6793 { { "a7" }, "$11" },
6794 { { "t0" }, "$12" },
6795 { { "t1" }, "$13" },
6796 { { "t2" }, "$14" },
6797 { { "t3" }, "$15" },
6798 { { "s0" }, "$16" },
6799 { { "s1" }, "$17" },
6800 { { "s2" }, "$18" },
6801 { { "s3" }, "$19" },
6802 { { "s4" }, "$20" },
6803 { { "s5" }, "$21" },
6804 { { "s6" }, "$22" },
6805 { { "s7" }, "$23" },
6806 { { "t8" }, "$24" },
6807 { { "t9" }, "$25" },
6808 { { "k0" }, "$26" },
6809 { { "k1" }, "$27" },
6810 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006811 { { "sp","$sp" }, "$29" },
6812 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006813 { { "ra" }, "$31" }
6814 };
6815 Aliases = GCCRegAliases;
6816 NumAliases = llvm::array_lengthof(GCCRegAliases);
6817 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006818
6819 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006820};
6821
6822class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006823 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006824 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006825 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006826 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006827 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006828
Akira Hatanakabef17452011-09-20 19:21:49 +00006829 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006830
Akira Hatanakabef17452011-09-20 19:21:49 +00006831public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006832 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006833 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006834 void getTargetDefines(const LangOptions &Opts,
6835 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006836 DefineStd(Builder, "MIPSEB", Opts);
6837 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006838 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006839 }
6840};
6841
6842class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006843 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006844 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006845 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006846 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006847 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006848 }
6849public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006850 Mips64ELTargetInfo(const llvm::Triple &Triple)
6851 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006852 // Default ABI is n64.
6853 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006854 }
Craig Topper3164f332014-03-11 03:39:26 +00006855 void getTargetDefines(const LangOptions &Opts,
6856 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006857 DefineStd(Builder, "MIPSEL", Opts);
6858 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006859 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006860 }
6861};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006862
Ivan Krasindd7403e2011-08-24 20:22:22 +00006863class PNaClTargetInfo : public TargetInfo {
6864public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006865 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006866 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006867 this->UserLabelPrefix = "";
6868 this->LongAlign = 32;
6869 this->LongWidth = 32;
6870 this->PointerAlign = 32;
6871 this->PointerWidth = 32;
6872 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006873 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006874 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006875 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006876 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006877 this->SizeType = TargetInfo::UnsignedInt;
6878 this->PtrDiffType = TargetInfo::SignedInt;
6879 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006880 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006881 }
6882
Craig Toppere6f17d02014-03-11 04:07:52 +00006883 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006884 Builder.defineMacro("__le32__");
6885 Builder.defineMacro("__pnacl__");
6886 }
Craig Topper3164f332014-03-11 03:39:26 +00006887 void getTargetDefines(const LangOptions &Opts,
6888 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006889 getArchDefines(Opts, Builder);
6890 }
Craig Topper3164f332014-03-11 03:39:26 +00006891 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006892 return Feature == "pnacl";
6893 }
Craig Topper3164f332014-03-11 03:39:26 +00006894 void getTargetBuiltins(const Builtin::Info *&Records,
6895 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006896 }
Craig Topper3164f332014-03-11 03:39:26 +00006897 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006898 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006899 }
Craig Topper3164f332014-03-11 03:39:26 +00006900 void getGCCRegNames(const char * const *&Names,
6901 unsigned &NumNames) const override;
6902 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6903 unsigned &NumAliases) const override;
6904 bool validateAsmConstraint(const char *&Name,
6905 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006906 return false;
6907 }
6908
Craig Topper3164f332014-03-11 03:39:26 +00006909 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006910 return "";
6911 }
6912};
6913
6914void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6915 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006916 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006917 NumNames = 0;
6918}
6919
6920void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6921 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006922 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006923 NumAliases = 0;
6924}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006925
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006926// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6927class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6928public:
6929 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00006930 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006931 }
6932
6933 BuiltinVaListKind getBuiltinVaListKind() const override {
6934 return TargetInfo::PNaClABIBuiltinVaList;
6935 }
6936};
6937
JF Bastien643817d2014-09-12 17:52:47 +00006938class Le64TargetInfo : public TargetInfo {
6939 static const Builtin::Info BuiltinInfo[];
6940
6941public:
6942 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6943 BigEndian = false;
6944 NoAsmVariants = true;
6945 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6946 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006947 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006948 }
6949
6950 void getTargetDefines(const LangOptions &Opts,
6951 MacroBuilder &Builder) const override {
6952 DefineStd(Builder, "unix", Opts);
6953 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6954 Builder.defineMacro("__ELF__");
6955 }
6956 void getTargetBuiltins(const Builtin::Info *&Records,
6957 unsigned &NumRecords) const override {
6958 Records = BuiltinInfo;
6959 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6960 }
6961 BuiltinVaListKind getBuiltinVaListKind() const override {
6962 return TargetInfo::PNaClABIBuiltinVaList;
6963 }
6964 const char *getClobbers() const override { return ""; }
6965 void getGCCRegNames(const char *const *&Names,
6966 unsigned &NumNames) const override {
6967 Names = nullptr;
6968 NumNames = 0;
6969 }
6970 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6971 unsigned &NumAliases) const override {
6972 Aliases = nullptr;
6973 NumAliases = 0;
6974 }
6975 bool validateAsmConstraint(const char *&Name,
6976 TargetInfo::ConstraintInfo &Info) const override {
6977 return false;
6978 }
6979
6980 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006981};
Dan Gohmanc2853072015-09-03 22:51:53 +00006982
6983class WebAssemblyTargetInfo : public TargetInfo {
6984 static const Builtin::Info BuiltinInfo[];
6985
6986 enum SIMDEnum {
6987 NoSIMD,
6988 SIMD128,
6989 } SIMDLevel;
6990
6991public:
6992 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
6993 : TargetInfo(T), SIMDLevel(NoSIMD) {
6994 BigEndian = false;
6995 NoAsmVariants = true;
6996 SuitableAlign = 128;
6997 LargeArrayMinWidth = 128;
6998 LargeArrayAlign = 128;
6999 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007000 SigAtomicType = SignedLong;
Dan Gohmanc2853072015-09-03 22:51:53 +00007001 }
7002
7003protected:
7004 void getTargetDefines(const LangOptions &Opts,
7005 MacroBuilder &Builder) const override {
7006 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7007 if (SIMDLevel >= SIMD128)
7008 Builder.defineMacro("__wasm_simd128__");
7009 }
7010
7011private:
7012 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7013 StringRef CPU,
7014 std::vector<std::string> &FeaturesVec) const override {
7015 if (CPU == "bleeding-edge")
7016 Features["simd128"] = true;
7017 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7018 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007019 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007020 return llvm::StringSwitch<bool>(Feature)
7021 .Case("simd128", SIMDLevel >= SIMD128)
7022 .Default(false);
7023 }
7024 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007025 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007026 for (const auto &Feature : Features) {
7027 if (Feature == "+simd128") {
7028 SIMDLevel = std::max(SIMDLevel, SIMD128);
7029 continue;
7030 }
7031 if (Feature == "-simd128") {
7032 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7033 continue;
7034 }
7035
7036 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7037 << "-target-feature";
7038 return false;
7039 }
7040 return true;
7041 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007042 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007043 return llvm::StringSwitch<bool>(Name)
7044 .Case("mvp", true)
7045 .Case("bleeding-edge", true)
7046 .Case("generic", true)
7047 .Default(false);
7048 }
7049 void getTargetBuiltins(const Builtin::Info *&Records,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007050 unsigned &NumRecords) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007051 Records = BuiltinInfo;
7052 NumRecords = clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin;
7053 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007054 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007055 // TODO: Implement va_list properly.
7056 return VoidPtrBuiltinVaList;
7057 }
7058 void getGCCRegNames(const char *const *&Names,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007059 unsigned &NumNames) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007060 Names = nullptr;
7061 NumNames = 0;
7062 }
7063 void getGCCRegAliases(const GCCRegAlias *&Aliases,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007064 unsigned &NumAliases) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007065 Aliases = nullptr;
7066 NumAliases = 0;
7067 }
7068 bool
7069 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007070 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007071 return false;
7072 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007073 const char *getClobbers() const final { return ""; }
7074 bool isCLZForZeroUndef() const final { return false; }
7075 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007076 IntType getIntTypeByWidth(unsigned BitWidth,
7077 bool IsSigned) const final {
7078 // WebAssembly prefers long long for explicitly 64-bit integers.
7079 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7080 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7081 }
7082 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7083 bool IsSigned) const final {
7084 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7085 return BitWidth == 64
7086 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7087 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7088 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007089};
7090
7091const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7092#define BUILTIN(ID, TYPE, ATTRS) \
7093 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7094#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7095 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7096#include "clang/Basic/BuiltinsWebAssembly.def"
7097};
7098
7099class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7100public:
7101 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7102 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007103 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohmanc2853072015-09-03 22:51:53 +00007104 DataLayoutString = "e-p:32:32-i64:64-n32:64-S128";
7105 }
7106
7107protected:
7108 void getTargetDefines(const LangOptions &Opts,
7109 MacroBuilder &Builder) const override {
7110 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7111 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7112 }
7113};
7114
7115class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7116public:
7117 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7118 : WebAssemblyTargetInfo(T) {
7119 LongAlign = LongWidth = 64;
7120 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007121 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohmanc2853072015-09-03 22:51:53 +00007122 DataLayoutString = "e-p:64:64-i64:64-n32:64-S128";
7123 }
7124
7125protected:
7126 void getTargetDefines(const LangOptions &Opts,
7127 MacroBuilder &Builder) const override {
7128 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7129 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7130 }
7131};
7132
JF Bastien643817d2014-09-12 17:52:47 +00007133} // end anonymous namespace.
7134
7135const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7136#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007137 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007138#include "clang/Basic/BuiltinsLe64.def"
7139};
7140
7141namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00007142 static const unsigned SPIRAddrSpaceMap[] = {
7143 1, // opencl_global
7144 3, // opencl_local
7145 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00007146 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00007147 0, // cuda_device
7148 0, // cuda_constant
7149 0 // cuda_shared
7150 };
7151 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00007152 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007153 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00007154 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7155 "SPIR target must use unknown OS");
7156 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7157 "SPIR target must use unknown environment type");
7158 BigEndian = false;
7159 TLSSupported = false;
7160 LongWidth = LongAlign = 64;
7161 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00007162 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00007163 // Define available target features
7164 // These must be defined in sorted order!
7165 NoAsmVariants = true;
7166 }
Craig Topper3164f332014-03-11 03:39:26 +00007167 void getTargetDefines(const LangOptions &Opts,
7168 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00007169 DefineStd(Builder, "SPIR", Opts);
7170 }
Craig Topper3164f332014-03-11 03:39:26 +00007171 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00007172 return Feature == "spir";
7173 }
Craig Topper3164f332014-03-11 03:39:26 +00007174
7175 void getTargetBuiltins(const Builtin::Info *&Records,
7176 unsigned &NumRecords) const override {}
7177 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00007178 return "";
7179 }
Craig Topper3164f332014-03-11 03:39:26 +00007180 void getGCCRegNames(const char * const *&Names,
7181 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00007182 bool
7183 validateAsmConstraint(const char *&Name,
7184 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00007185 return true;
7186 }
Craig Topper3164f332014-03-11 03:39:26 +00007187 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7188 unsigned &NumAliases) const override {}
7189 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00007190 return TargetInfo::VoidPtrBuiltinVaList;
7191 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007192
7193 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7194 return (CC == CC_SpirFunction ||
7195 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
7196 }
7197
7198 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7199 return CC_SpirFunction;
7200 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007201 };
7202
7203
7204 class SPIR32TargetInfo : public SPIRTargetInfo {
7205 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007206 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00007207 PointerWidth = PointerAlign = 32;
7208 SizeType = TargetInfo::UnsignedInt;
7209 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +00007210 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7211 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00007212 }
Craig Topper3164f332014-03-11 03:39:26 +00007213 void getTargetDefines(const LangOptions &Opts,
7214 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00007215 DefineStd(Builder, "SPIR32", Opts);
7216 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007217 };
7218
7219 class SPIR64TargetInfo : public SPIRTargetInfo {
7220 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007221 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00007222 PointerWidth = PointerAlign = 64;
7223 SizeType = TargetInfo::UnsignedLong;
7224 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00007225 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7226 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00007227 }
Craig Topper3164f332014-03-11 03:39:26 +00007228 void getTargetDefines(const LangOptions &Opts,
7229 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00007230 DefineStd(Builder, "SPIR64", Opts);
7231 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007232 };
Guy Benyeib798fc92012-12-11 21:38:14 +00007233
Robert Lytton0e076492013-08-13 09:43:10 +00007234class XCoreTargetInfo : public TargetInfo {
7235 static const Builtin::Info BuiltinInfo[];
7236public:
7237 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7238 BigEndian = false;
7239 NoAsmVariants = true;
7240 LongLongAlign = 32;
7241 SuitableAlign = 32;
7242 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007243 SizeType = UnsignedInt;
7244 PtrDiffType = SignedInt;
7245 IntPtrType = SignedInt;
7246 WCharType = UnsignedChar;
7247 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007248 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007249 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7250 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007251 }
Craig Topper3164f332014-03-11 03:39:26 +00007252 void getTargetDefines(const LangOptions &Opts,
7253 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007254 Builder.defineMacro("__XS1B__");
7255 }
Craig Topper3164f332014-03-11 03:39:26 +00007256 void getTargetBuiltins(const Builtin::Info *&Records,
7257 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007258 Records = BuiltinInfo;
7259 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
7260 }
Craig Topper3164f332014-03-11 03:39:26 +00007261 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007262 return TargetInfo::VoidPtrBuiltinVaList;
7263 }
Craig Topper3164f332014-03-11 03:39:26 +00007264 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007265 return "";
7266 }
Craig Topper3164f332014-03-11 03:39:26 +00007267 void getGCCRegNames(const char * const *&Names,
7268 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007269 static const char * const GCCRegNames[] = {
7270 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7271 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7272 };
7273 Names = GCCRegNames;
7274 NumNames = llvm::array_lengthof(GCCRegNames);
7275 }
Craig Topper3164f332014-03-11 03:39:26 +00007276 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7277 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00007278 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00007279 NumAliases = 0;
7280 }
Craig Topper3164f332014-03-11 03:39:26 +00007281 bool validateAsmConstraint(const char *&Name,
7282 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007283 return false;
7284 }
Craig Topper3164f332014-03-11 03:39:26 +00007285 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007286 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7287 return (RegNo < 2)? RegNo : -1;
7288 }
Robert Lytton0e076492013-08-13 09:43:10 +00007289};
7290
7291const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007292#define BUILTIN(ID, TYPE, ATTRS) \
7293 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7294#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7295 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007296#include "clang/Basic/BuiltinsXCore.def"
7297};
7298} // end anonymous namespace.
7299
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007300namespace {
7301// x86_32 Android target
7302class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7303public:
7304 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7305 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7306 SuitableAlign = 32;
7307 LongDoubleWidth = 64;
7308 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7309 }
7310};
7311} // end anonymous namespace
7312
7313namespace {
7314// x86_64 Android target
7315class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7316public:
7317 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7318 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7319 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7320 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007321
7322 bool useFloat128ManglingForLongDouble() const override {
7323 return true;
7324 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007325};
7326} // end anonymous namespace
7327
Ivan Krasindd7403e2011-08-24 20:22:22 +00007328
Chris Lattner5ba61f02006-10-14 07:39:34 +00007329//===----------------------------------------------------------------------===//
7330// Driver code
7331//===----------------------------------------------------------------------===//
7332
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007333static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007334 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007335
Daniel Dunbar52322032009-08-18 05:47:58 +00007336 switch (Triple.getArch()) {
7337 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007338 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007339
Tim Northover2a0783d2014-05-30 14:14:07 +00007340 case llvm::Triple::xcore:
7341 return new XCoreTargetInfo(Triple);
7342
7343 case llvm::Triple::hexagon:
7344 return new HexagonTargetInfo(Triple);
7345
7346 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007347 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007348 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007349
7350 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007351 case llvm::Triple::FreeBSD:
7352 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007353 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007354 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007355 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007356 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007357 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007358 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007359 }
7360
Christian Pirker9b019ae2014-02-25 13:51:00 +00007361 case llvm::Triple::aarch64_be:
7362 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007363 case llvm::Triple::FreeBSD:
7364 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007365 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007366 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007367 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007368 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007369 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007370 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007371 }
7372
Daniel Dunbar52322032009-08-18 05:47:58 +00007373 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007374 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007375 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007376 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007377
Daniel Dunbar52322032009-08-18 05:47:58 +00007378 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007379 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007380 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007381 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007382 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007383 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007384 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007385 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007386 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007387 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007388 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007389 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007390 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007391 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007392 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007393 case llvm::Triple::Win32:
7394 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007395 case llvm::Triple::Cygnus:
7396 return new CygwinARMTargetInfo(Triple);
7397 case llvm::Triple::GNU:
7398 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007399 case llvm::Triple::Itanium:
7400 return new ItaniumWindowsARMleTargetInfo(Triple);
7401 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007402 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007403 return new MicrosoftARMleTargetInfo(Triple);
7404 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007405 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007406 return new ARMleTargetInfo(Triple);
7407 }
7408
7409 case llvm::Triple::armeb:
7410 case llvm::Triple::thumbeb:
7411 if (Triple.isOSDarwin())
7412 return new DarwinARMTargetInfo(Triple);
7413
7414 switch (os) {
7415 case llvm::Triple::Linux:
7416 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7417 case llvm::Triple::FreeBSD:
7418 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7419 case llvm::Triple::NetBSD:
7420 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7421 case llvm::Triple::OpenBSD:
7422 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7423 case llvm::Triple::Bitrig:
7424 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7425 case llvm::Triple::RTEMS:
7426 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7427 case llvm::Triple::NaCl:
7428 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7429 default:
7430 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007431 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007432
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007433 case llvm::Triple::bpfeb:
7434 case llvm::Triple::bpfel:
7435 return new BPFTargetInfo(Triple);
7436
Daniel Dunbar52322032009-08-18 05:47:58 +00007437 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007438 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007439
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007440 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007441 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007442 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007443 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007444 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007445 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007446 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007447 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007448 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007449 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007450 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007451 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007452 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007453
7454 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007455 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007456 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007457 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007458 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007459 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007460 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007461 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007462 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007463 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007464 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007465 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007466 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007467 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007468 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007469
Akira Hatanakabef17452011-09-20 19:21:49 +00007470 case llvm::Triple::mips64:
7471 switch (os) {
7472 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007473 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007474 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007475 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007476 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007477 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007478 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007479 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007480 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007481 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007482 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007483 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007484 }
7485
7486 case llvm::Triple::mips64el:
7487 switch (os) {
7488 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007489 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007490 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007491 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007492 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007493 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007494 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007495 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007496 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007497 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007498 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007499 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007500 }
7501
Ivan Krasindd7403e2011-08-24 20:22:22 +00007502 case llvm::Triple::le32:
7503 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007504 case llvm::Triple::NaCl:
7505 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7506 default:
7507 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007508 }
7509
JF Bastien643817d2014-09-12 17:52:47 +00007510 case llvm::Triple::le64:
7511 return new Le64TargetInfo(Triple);
7512
Daniel Dunbar52322032009-08-18 05:47:58 +00007513 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007514 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007515 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007516 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007517 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007518 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007519 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007520 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007521 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007522 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007523 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007524 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007525 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007526 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007527 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007528 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007529 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007530
7531 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007532 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007533 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007534 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007535 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007536 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007537 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007538 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007539 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007540 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007541 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007542 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007543 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007544 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007545 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007546
Bill Schmidt778d3872013-07-26 01:36:11 +00007547 case llvm::Triple::ppc64le:
7548 switch (os) {
7549 case llvm::Triple::Linux:
7550 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007551 case llvm::Triple::NetBSD:
7552 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007553 default:
7554 return new PPC64TargetInfo(Triple);
7555 }
7556
Peter Collingbournec947aae2012-05-20 23:28:41 +00007557 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007558 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007559 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007560 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007561
Tom Stellardd8e38a32015-01-06 20:34:47 +00007562 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007563 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007564 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007565
Daniel Dunbar52322032009-08-18 05:47:58 +00007566 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007567 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007568 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007569 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007570 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007571 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007572 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007573 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007574 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007575 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007576 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007577 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007578 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007579 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007580 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007581
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007582 // The 'sparcel' architecture copies all the above cases except for Solaris.
7583 case llvm::Triple::sparcel:
7584 switch (os) {
7585 case llvm::Triple::Linux:
7586 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7587 case llvm::Triple::NetBSD:
7588 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7589 case llvm::Triple::OpenBSD:
7590 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7591 case llvm::Triple::RTEMS:
7592 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7593 default:
7594 return new SparcV8elTargetInfo(Triple);
7595 }
7596
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007597 case llvm::Triple::sparcv9:
7598 switch (os) {
7599 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007600 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007601 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007602 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007603 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007604 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007605 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007606 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007607 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007608 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007609 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007610 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007611 }
7612
Ulrich Weigand47445072013-05-06 16:26:41 +00007613 case llvm::Triple::systemz:
7614 switch (os) {
7615 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007616 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007617 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007618 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007619 }
7620
Eli Friedmana9c3d712009-08-19 20:47:07 +00007621 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007622 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007623
Daniel Dunbar52322032009-08-18 05:47:58 +00007624 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007625 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007626 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007627
Daniel Dunbar52322032009-08-18 05:47:58 +00007628 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007629 case llvm::Triple::CloudABI:
7630 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007631 case llvm::Triple::Linux: {
7632 switch (Triple.getEnvironment()) {
7633 default:
7634 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7635 case llvm::Triple::Android:
7636 return new AndroidX86_32TargetInfo(Triple);
7637 }
7638 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007639 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007640 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007641 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007642 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007643 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007644 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007645 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007646 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007647 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007648 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007649 case llvm::Triple::KFreeBSD:
7650 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007651 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007652 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007653 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007654 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007655 case llvm::Triple::Win32: {
7656 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007657 case llvm::Triple::Cygnus:
7658 return new CygwinX86_32TargetInfo(Triple);
7659 case llvm::Triple::GNU:
7660 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007661 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007662 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007663 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007664 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007665 }
7666 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007667 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007668 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007669 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007670 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007671 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007672 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007673 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007674 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007675 }
7676
7677 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007678 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007679 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007680
Daniel Dunbar52322032009-08-18 05:47:58 +00007681 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007682 case llvm::Triple::CloudABI:
7683 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007684 case llvm::Triple::Linux: {
7685 switch (Triple.getEnvironment()) {
7686 default:
7687 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7688 case llvm::Triple::Android:
7689 return new AndroidX86_64TargetInfo(Triple);
7690 }
7691 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007692 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007693 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007694 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007695 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007696 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007697 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007698 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007699 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007700 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007701 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007702 case llvm::Triple::KFreeBSD:
7703 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007704 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007705 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007706 case llvm::Triple::Win32: {
7707 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007708 case llvm::Triple::Cygnus:
7709 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007710 case llvm::Triple::GNU:
7711 return new MinGWX86_64TargetInfo(Triple);
7712 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007713 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007714 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007715 }
7716 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007717 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007718 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007719 case llvm::Triple::PS4:
7720 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007721 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007722 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007723 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007724
Douglas Katzman78d7c542015-05-12 21:18:10 +00007725 case llvm::Triple::spir: {
7726 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7727 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7728 return nullptr;
7729 return new SPIR32TargetInfo(Triple);
7730 }
7731 case llvm::Triple::spir64: {
7732 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7733 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7734 return nullptr;
7735 return new SPIR64TargetInfo(Triple);
7736 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007737 case llvm::Triple::wasm32:
7738 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7739 return nullptr;
7740 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7741 case llvm::Triple::wasm64:
7742 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7743 return nullptr;
7744 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007745 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007746}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007747
7748/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007749/// options.
Alp Toker80758082014-07-06 05:26:44 +00007750TargetInfo *
7751TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7752 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007753 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007754
7755 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007756 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007757 if (!Target) {
7758 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007759 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007760 }
Alp Toker80758082014-07-06 05:26:44 +00007761 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007762
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007763 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007764 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7765 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007766 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007767 }
7768
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007769 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007770 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7771 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007772 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007773 }
7774
Rafael Espindolaeb265472013-08-21 21:59:03 +00007775 // Set the fp math unit.
7776 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7777 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007778 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007779 }
7780
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007781 // Compute the default target features, we need the target to handle this
7782 // because features may have dependencies on one another.
7783 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00007784 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
7785 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00007786 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007787
7788 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007789 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007790 for (const auto &F : Features)
7791 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7792
Eric Christopher3ff21b32013-10-16 21:26:26 +00007793 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007794 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007795
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007796 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007797}