blob: e3d8602b695d57e096a0e570f06a34df95b1063c [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 Lattner30ba6742009-08-10 19:03:04 +000086
Eric Christopher7d0c7252015-09-24 21:17:04 +000087// CloudABI Target
88template <typename Target>
89class CloudABITargetInfo : public OSTargetInfo<Target> {
90protected:
91 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
92 MacroBuilder &Builder) const override {
93 Builder.defineMacro("__CloudABI__");
94 Builder.defineMacro("__ELF__");
95
96 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
97 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
98 Builder.defineMacro("__STDC_UTF_16__");
99 Builder.defineMacro("__STDC_UTF_32__");
100 }
101
102public:
103 CloudABITargetInfo(const llvm::Triple &Triple)
104 : OSTargetInfo<Target>(Triple) {
105 this->UserLabelPrefix = "";
106 }
107};
108
Daniel Dunbard86666f2010-01-26 01:44:04 +0000109static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000110 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000111 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000112 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000113 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000114 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000115 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000116 // AddressSanitizer doesn't play well with source fortification, which is on
117 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000118 if (Opts.Sanitize.has(SanitizerKind::Address))
119 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000120
John McCall460ce582015-10-22 18:38:17 +0000121 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
122 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000123 // __weak is always defined, for use in blocks and with objc pointers.
124 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000125 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000126 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000127 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000128
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000129 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000130 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000131 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000132 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000133
134 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000136
Daniel Dunbarecf13562011-04-19 21:40:34 +0000137 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000138 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000139 if (Triple.isMacOSX()) {
140 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000141 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000143 Triple.getOSVersion(Maj, Min, Rev);
144 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000145 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000146
Sebastian Pop422377c2012-01-20 22:01:23 +0000147 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000148 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000149 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
150 if (PlatformName == "win32") {
151 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
152 return;
153 }
154
Evan Cheng31dd9a62014-01-26 23:12:43 +0000155 // Set the appropriate OS version define.
156 if (Triple.isiOS()) {
157 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
158 char Str[6];
159 Str[0] = '0' + Maj;
160 Str[1] = '0' + (Min / 10);
161 Str[2] = '0' + (Min % 10);
162 Str[3] = '0' + (Rev / 10);
163 Str[4] = '0' + (Rev % 10);
164 Str[5] = '\0';
Eric Christopher7d0c7252015-09-24 21:17:04 +0000165 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000166 } else if (Triple.isMacOSX()) {
167 // Note that the Driver allows versions which aren't representable in the
168 // define (because we only get a single digit for the minor and micro
169 // revision numbers). So, we limit them to the maximum representable
170 // version.
171 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000172 char Str[7];
173 if (Maj < 10 || (Maj == 10 && Min < 10)) {
174 Str[0] = '0' + (Maj / 10);
175 Str[1] = '0' + (Maj % 10);
176 Str[2] = '0' + std::min(Min, 9U);
177 Str[3] = '0' + std::min(Rev, 9U);
178 Str[4] = '\0';
179 } else {
180 // Handle versions > 10.9.
181 Str[0] = '0' + (Maj / 10);
182 Str[1] = '0' + (Maj % 10);
183 Str[2] = '0' + (Min / 10);
184 Str[3] = '0' + (Min % 10);
185 Str[4] = '0' + (Rev / 10);
186 Str[5] = '0' + (Rev % 10);
187 Str[6] = '\0';
188 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000189 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000190 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000191
Tim Northover157d9112014-01-16 08:48:16 +0000192 // Tell users about the kernel if there is one.
193 if (Triple.isOSDarwin())
194 Builder.defineMacro("__MACH__");
195
Daniel Dunbarecf13562011-04-19 21:40:34 +0000196 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000197}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000198
Torok Edwinb2b37c62009-06-30 17:10:35 +0000199template<typename Target>
200class DarwinTargetInfo : public OSTargetInfo<Target> {
201protected:
Craig Topper3164f332014-03-11 03:39:26 +0000202 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
203 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000204 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000205 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000206 }
Mike Stump11289f42009-09-09 15:08:12 +0000207
Torok Edwinb2b37c62009-06-30 17:10:35 +0000208public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000209 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
210 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
211 this->MCountName = "\01mcount";
212 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000213
Craig Topper3164f332014-03-11 03:39:26 +0000214 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000215 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000216 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000217 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000218 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000219 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000220 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000221 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000222
Craig Topper3164f332014-03-11 03:39:26 +0000223 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000224 // FIXME: We should return 0 when building kexts.
225 return "__TEXT,__StaticInit,regular,pure_instructions";
226 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000227
John McCalleed64c72012-01-29 01:20:30 +0000228 /// Darwin does not support protected visibility. Darwin's "default"
229 /// is very similar to ELF's "protected"; Darwin requires a "weak"
230 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000231 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000232 return false;
233 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234};
235
Chris Lattner30ba6742009-08-10 19:03:04 +0000236
Torok Edwinb2b37c62009-06-30 17:10:35 +0000237// DragonFlyBSD Target
238template<typename Target>
239class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
240protected:
Craig Topper3164f332014-03-11 03:39:26 +0000241 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
242 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000244 Builder.defineMacro("__DragonFly__");
245 Builder.defineMacro("__DragonFly_cc_version", "100001");
246 Builder.defineMacro("__ELF__");
247 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
248 Builder.defineMacro("__tune_i386__");
249 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000250 }
251public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000252 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
253 : OSTargetInfo<Target>(Triple) {
254 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000255
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000256 switch (Triple.getArch()) {
257 default:
258 case llvm::Triple::x86:
259 case llvm::Triple::x86_64:
260 this->MCountName = ".mcount";
261 break;
262 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000263 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000264};
265
266// FreeBSD Target
267template<typename Target>
268class FreeBSDTargetInfo : public OSTargetInfo<Target> {
269protected:
Craig Topper3164f332014-03-11 03:39:26 +0000270 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
271 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000272 // FreeBSD defines; list based off of gcc output
273
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000274 unsigned Release = Triple.getOSMajorVersion();
275 if (Release == 0U)
276 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000277
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000278 Builder.defineMacro("__FreeBSD__", Twine(Release));
279 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000280 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
281 DefineStd(Builder, "unix", Opts);
282 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000283
284 // On FreeBSD, wchar_t contains the number of the code point as
285 // used by the character set of the locale. These character sets are
286 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000287 //
288 // FIXME: This is wrong; the macro refers to the numerical values
289 // of wchar_t *literals*, which are not locale-dependent. However,
290 // FreeBSD systems apparently depend on us getting this wrong, and
291 // setting this to 1 is conforming even if all the basic source
292 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000293 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294 }
295public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000296 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
297 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000298
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000299 switch (Triple.getArch()) {
300 default:
301 case llvm::Triple::x86:
302 case llvm::Triple::x86_64:
303 this->MCountName = ".mcount";
304 break;
305 case llvm::Triple::mips:
306 case llvm::Triple::mipsel:
307 case llvm::Triple::ppc:
308 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000309 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000310 this->MCountName = "_mcount";
311 break;
312 case llvm::Triple::arm:
313 this->MCountName = "__mcount";
314 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000315 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000316 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000317};
318
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000319// GNU/kFreeBSD Target
320template<typename Target>
321class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
322protected:
Craig Topper3164f332014-03-11 03:39:26 +0000323 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
324 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000325 // GNU/kFreeBSD defines; list based off of gcc output
326
327 DefineStd(Builder, "unix", Opts);
328 Builder.defineMacro("__FreeBSD_kernel__");
329 Builder.defineMacro("__GLIBC__");
330 Builder.defineMacro("__ELF__");
331 if (Opts.POSIXThreads)
332 Builder.defineMacro("_REENTRANT");
333 if (Opts.CPlusPlus)
334 Builder.defineMacro("_GNU_SOURCE");
335 }
336public:
Eric Christopher917e9522014-11-18 22:36:15 +0000337 KFreeBSDTargetInfo(const llvm::Triple &Triple)
338 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000339 this->UserLabelPrefix = "";
340 }
341};
342
Chris Lattner3e2ee142010-07-07 16:01:42 +0000343// Minix Target
344template<typename Target>
345class MinixTargetInfo : public OSTargetInfo<Target> {
346protected:
Craig Topper3164f332014-03-11 03:39:26 +0000347 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
348 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000349 // Minix defines
350
351 Builder.defineMacro("__minix", "3");
352 Builder.defineMacro("_EM_WSIZE", "4");
353 Builder.defineMacro("_EM_PSIZE", "4");
354 Builder.defineMacro("_EM_SSIZE", "2");
355 Builder.defineMacro("_EM_LSIZE", "4");
356 Builder.defineMacro("_EM_FSIZE", "4");
357 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000358 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000359 DefineStd(Builder, "unix", Opts);
360 }
361public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000362 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
363 this->UserLabelPrefix = "";
364 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000365};
366
Torok Edwinb2b37c62009-06-30 17:10:35 +0000367// Linux target
368template<typename Target>
369class LinuxTargetInfo : public OSTargetInfo<Target> {
370protected:
Craig Topper3164f332014-03-11 03:39:26 +0000371 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
372 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000373 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000374 DefineStd(Builder, "unix", Opts);
375 DefineStd(Builder, "linux", Opts);
376 Builder.defineMacro("__gnu_linux__");
377 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000378 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000379 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000380 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000381 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000382 this->PlatformName = "android";
383 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
384 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000385 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000386 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000387 if (Opts.CPlusPlus)
388 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000389 }
390public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000391 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000392 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000393 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000394
395 switch (Triple.getArch()) {
396 default:
397 break;
398 case llvm::Triple::ppc:
399 case llvm::Triple::ppc64:
400 case llvm::Triple::ppc64le:
401 this->MCountName = "_mcount";
402 break;
403 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000404 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000405
Craig Topper3164f332014-03-11 03:39:26 +0000406 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000407 return ".text.startup";
408 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000409};
410
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000411// NetBSD Target
412template<typename Target>
413class NetBSDTargetInfo : public OSTargetInfo<Target> {
414protected:
Craig Topper3164f332014-03-11 03:39:26 +0000415 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
416 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000417 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000418 Builder.defineMacro("__NetBSD__");
419 Builder.defineMacro("__unix__");
420 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000421 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000422 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000423
424 switch (Triple.getArch()) {
425 default:
426 break;
427 case llvm::Triple::arm:
428 case llvm::Triple::armeb:
429 case llvm::Triple::thumb:
430 case llvm::Triple::thumbeb:
431 Builder.defineMacro("__ARM_DWARF_EH__");
432 break;
433 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000434 }
435public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000436 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
437 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000438 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000439 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000440};
441
Torok Edwinb2b37c62009-06-30 17:10:35 +0000442// OpenBSD Target
443template<typename Target>
444class OpenBSDTargetInfo : public OSTargetInfo<Target> {
445protected:
Craig Topper3164f332014-03-11 03:39:26 +0000446 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
447 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000448 // OpenBSD defines; list based off of gcc output
449
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000450 Builder.defineMacro("__OpenBSD__");
451 DefineStd(Builder, "unix", Opts);
452 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000453 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000454 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000455 }
456public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000457 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
458 this->UserLabelPrefix = "";
459 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000460
Eli Friedman3715d1f2011-12-15 02:15:56 +0000461 switch (Triple.getArch()) {
462 default:
463 case llvm::Triple::x86:
464 case llvm::Triple::x86_64:
465 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000466 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000467 this->MCountName = "__mcount";
468 break;
469 case llvm::Triple::mips64:
470 case llvm::Triple::mips64el:
471 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000472 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000473 this->MCountName = "_mcount";
474 break;
475 }
476 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000477};
478
Eli Friedman9fa28852012-08-08 23:57:20 +0000479// Bitrig Target
480template<typename Target>
481class BitrigTargetInfo : public OSTargetInfo<Target> {
482protected:
Craig Topper3164f332014-03-11 03:39:26 +0000483 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
484 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000485 // Bitrig defines; list based off of gcc output
486
487 Builder.defineMacro("__Bitrig__");
488 DefineStd(Builder, "unix", Opts);
489 Builder.defineMacro("__ELF__");
490 if (Opts.POSIXThreads)
491 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000492
493 switch (Triple.getArch()) {
494 default:
495 break;
496 case llvm::Triple::arm:
497 case llvm::Triple::armeb:
498 case llvm::Triple::thumb:
499 case llvm::Triple::thumbeb:
500 Builder.defineMacro("__ARM_DWARF_EH__");
501 break;
502 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000503 }
504public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000505 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
506 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000507 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000508 }
509};
510
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000511// PSP Target
512template<typename Target>
513class PSPTargetInfo : public OSTargetInfo<Target> {
514protected:
Craig Topper3164f332014-03-11 03:39:26 +0000515 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
516 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000517 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000518 Builder.defineMacro("PSP");
519 Builder.defineMacro("_PSP");
520 Builder.defineMacro("__psp__");
521 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000522 }
523public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000524 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000525 this->UserLabelPrefix = "";
526 }
527};
528
John Thompsone467e192009-11-19 17:18:50 +0000529// PS3 PPU Target
530template<typename Target>
531class PS3PPUTargetInfo : public OSTargetInfo<Target> {
532protected:
Craig Topper3164f332014-03-11 03:39:26 +0000533 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
534 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000535 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000536 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000537 Builder.defineMacro("__PPU__");
538 Builder.defineMacro("__CELLOS_LV2__");
539 Builder.defineMacro("__ELF__");
540 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000541 Builder.defineMacro("_ARCH_PPC64");
542 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000543 }
544public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000545 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000546 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000547 this->LongWidth = this->LongAlign = 32;
548 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000549 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000550 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000551 this->SizeType = TargetInfo::UnsignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +0000552 this->DataLayoutString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000553 }
554};
555
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000556template <typename Target>
557class PS4OSTargetInfo : public OSTargetInfo<Target> {
558protected:
559 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
560 MacroBuilder &Builder) const override {
561 Builder.defineMacro("__FreeBSD__", "9");
562 Builder.defineMacro("__FreeBSD_cc_version", "900001");
563 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
564 DefineStd(Builder, "unix", Opts);
565 Builder.defineMacro("__ELF__");
566 Builder.defineMacro("__PS4__");
567 }
568public:
569 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
570 this->WCharType = this->UnsignedShort;
571
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000572 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
573 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000574 this->UserLabelPrefix = "";
575
576 switch (Triple.getArch()) {
577 default:
578 case llvm::Triple::x86_64:
579 this->MCountName = ".mcount";
580 break;
581 }
582 }
583};
584
Torok Edwinb2b37c62009-06-30 17:10:35 +0000585// Solaris target
586template<typename Target>
587class SolarisTargetInfo : public OSTargetInfo<Target> {
588protected:
Craig Topper3164f332014-03-11 03:39:26 +0000589 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
590 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000591 DefineStd(Builder, "sun", Opts);
592 DefineStd(Builder, "unix", Opts);
593 Builder.defineMacro("__ELF__");
594 Builder.defineMacro("__svr4__");
595 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000596 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
597 // newer, but to 500 for everything else. feature_test.h has a check to
598 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000599 // with a new version.
600 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000601 Builder.defineMacro("_XOPEN_SOURCE", "600");
602 else
603 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000604 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000605 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000606 Builder.defineMacro("_LARGEFILE_SOURCE");
607 Builder.defineMacro("_LARGEFILE64_SOURCE");
608 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000609 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000610 }
611public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000612 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000613 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000614 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000615 // FIXME: WIntType should be SignedLong
616 }
617};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000618
619// Windows target
620template<typename Target>
621class WindowsTargetInfo : public OSTargetInfo<Target> {
622protected:
Craig Topper3164f332014-03-11 03:39:26 +0000623 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
624 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000625 Builder.defineMacro("_WIN32");
626 }
627 void getVisualStudioDefines(const LangOptions &Opts,
628 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000629 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000630 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000631 Builder.defineMacro("_CPPRTTI");
632
Reid Kleckner16514352015-01-30 21:42:55 +0000633 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000634 Builder.defineMacro("_CPPUNWIND");
635 }
636
David Majnemer6a658902015-07-22 22:36:26 +0000637 if (Opts.Bool)
638 Builder.defineMacro("__BOOL_DEFINED");
639
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000640 if (!Opts.CharIsSigned)
641 Builder.defineMacro("_CHAR_UNSIGNED");
642
643 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
644 // but it works for now.
645 if (Opts.POSIXThreads)
646 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000647
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000648 if (Opts.MSCompatibilityVersion) {
649 Builder.defineMacro("_MSC_VER",
650 Twine(Opts.MSCompatibilityVersion / 100000));
651 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000652 // FIXME We cannot encode the revision information into 32-bits
653 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000654
David Majnemerb710a932015-05-11 03:57:49 +0000655 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000656 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000657 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000658
659 if (Opts.MicrosoftExt) {
660 Builder.defineMacro("_MSC_EXTENSIONS");
661
662 if (Opts.CPlusPlus11) {
663 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
664 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
665 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
666 }
667 }
668
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000669 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000670 }
671
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000672public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000673 WindowsTargetInfo(const llvm::Triple &Triple)
674 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000675};
676
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000677template <typename Target>
678class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000679protected:
Craig Topper3164f332014-03-11 03:39:26 +0000680 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
681 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000682 if (Opts.POSIXThreads)
683 Builder.defineMacro("_REENTRANT");
684 if (Opts.CPlusPlus)
685 Builder.defineMacro("_GNU_SOURCE");
686
687 DefineStd(Builder, "unix", Opts);
688 Builder.defineMacro("__ELF__");
689 Builder.defineMacro("__native_client__");
690 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000691
692public:
693 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000694 this->UserLabelPrefix = "";
695 this->LongAlign = 32;
696 this->LongWidth = 32;
697 this->PointerAlign = 32;
698 this->PointerWidth = 32;
699 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000700 this->Int64Type = TargetInfo::SignedLongLong;
701 this->DoubleAlign = 64;
702 this->LongDoubleWidth = 64;
703 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000704 this->LongLongWidth = 64;
705 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000706 this->SizeType = TargetInfo::UnsignedInt;
707 this->PtrDiffType = TargetInfo::SignedInt;
708 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000709 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000710 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000711 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000712 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000713 } else if (Triple.getArch() == llvm::Triple::x86) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000714 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000715 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000716 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000717 } else if (Triple.getArch() == llvm::Triple::mipsel) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000718 // Handled on mips' setDataLayoutString.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000719 } else {
720 assert(Triple.getArch() == llvm::Triple::le32);
Eric Christopher964a5f32015-08-05 23:48:05 +0000721 this->DataLayoutString = "e-p:32:32-i64:64";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000722 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000723 }
724};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000725
Dan Gohmanc2853072015-09-03 22:51:53 +0000726// WebAssembly target
727template <typename Target>
728class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
729 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000730 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000731 // A common platform macro.
732 if (Opts.POSIXThreads)
733 Builder.defineMacro("_REENTRANT");
734 // Follow g++ convention and predefine _GNU_SOURCE for C++.
735 if (Opts.CPlusPlus)
736 Builder.defineMacro("_GNU_SOURCE");
737 }
738
739 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000740 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000741 return ".text.__startup";
742 }
743
744public:
745 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
746 : OSTargetInfo<Target>(Triple) {
747 this->MCountName = "__mcount";
748 this->UserLabelPrefix = "";
749 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
750 }
751};
Dan Gohmanc2853072015-09-03 22:51:53 +0000752
Chris Lattner09d98f52008-10-05 21:50:58 +0000753//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000754// Specific target implementations.
755//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000756
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000757// PPC abstract base class
758class PPCTargetInfo : public TargetInfo {
759 static const Builtin::Info BuiltinInfo[];
760 static const char * const GCCRegNames[];
761 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000762 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000763
764 // Target cpu features.
765 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000766 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000767 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000768 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000769 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000770 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000771 bool HasBPERMD;
772 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000773
Ulrich Weigand8afad612014-07-28 13:17:52 +0000774protected:
775 std::string ABI;
776
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000777public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000778 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000779 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000780 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000781 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000782 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000783 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000784 LongDoubleWidth = LongDoubleAlign = 128;
785 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
786 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000787
Hal Finkel6b984f02012-07-03 16:51:04 +0000788 /// \brief Flags for architecture specific defines.
789 typedef enum {
790 ArchDefineNone = 0,
791 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
792 ArchDefinePpcgr = 1 << 1,
793 ArchDefinePpcsq = 1 << 2,
794 ArchDefine440 = 1 << 3,
795 ArchDefine603 = 1 << 4,
796 ArchDefine604 = 1 << 5,
797 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000798 ArchDefinePwr5 = 1 << 7,
799 ArchDefinePwr5x = 1 << 8,
800 ArchDefinePwr6 = 1 << 9,
801 ArchDefinePwr6x = 1 << 10,
802 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000803 ArchDefinePwr8 = 1 << 12,
804 ArchDefineA2 = 1 << 13,
805 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000806 } ArchDefineTypes;
807
Bill Schmidt38378a02013-02-01 20:23:10 +0000808 // Note: GCC recognizes the following additional cpus:
809 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
810 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
811 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000812 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000813 bool CPUKnown = llvm::StringSwitch<bool>(Name)
814 .Case("generic", true)
815 .Case("440", true)
816 .Case("450", true)
817 .Case("601", true)
818 .Case("602", true)
819 .Case("603", true)
820 .Case("603e", true)
821 .Case("603ev", true)
822 .Case("604", true)
823 .Case("604e", true)
824 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000825 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000826 .Case("g3", true)
827 .Case("7400", true)
828 .Case("g4", true)
829 .Case("7450", true)
830 .Case("g4+", true)
831 .Case("750", true)
832 .Case("970", true)
833 .Case("g5", true)
834 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000835 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000836 .Case("e500mc", true)
837 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000838 .Case("power3", true)
839 .Case("pwr3", true)
840 .Case("power4", true)
841 .Case("pwr4", true)
842 .Case("power5", true)
843 .Case("pwr5", true)
844 .Case("power5x", true)
845 .Case("pwr5x", true)
846 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000847 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000848 .Case("power6x", true)
849 .Case("pwr6x", true)
850 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000851 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000852 .Case("power8", true)
853 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000854 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000855 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000856 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000857 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000858 .Case("powerpc64le", true)
859 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000860 .Default(false);
861
862 if (CPUKnown)
863 CPU = Name;
864
865 return CPUKnown;
866 }
867
Ulrich Weigand8afad612014-07-28 13:17:52 +0000868
869 StringRef getABI() const override { return ABI; }
870
Craig Topper6c03a542015-10-19 04:51:35 +0000871 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
872 return llvm::makeArrayRef(BuiltinInfo,
873 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000874 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000875
Craig Topper3164f332014-03-11 03:39:26 +0000876 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000877
Craig Topper3164f332014-03-11 03:39:26 +0000878 void getTargetDefines(const LangOptions &Opts,
879 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000880
Eric Christopher8c47b422015-10-09 18:39:55 +0000881 bool
882 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
883 StringRef CPU,
884 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000885
Craig Topper3164f332014-03-11 03:39:26 +0000886 bool handleTargetFeatures(std::vector<std::string> &Features,
887 DiagnosticsEngine &Diags) override;
888 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000889 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
890 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000891
Craig Topperf054e3a2015-10-19 03:52:27 +0000892 ArrayRef<const char *> getGCCRegNames() const override;
893 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000894 bool validateAsmConstraint(const char *&Name,
895 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000896 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000897 default: return false;
898 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000899 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000900 case 'b': // Base register
901 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000902 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000903 break;
904 // FIXME: The following are added to allow parsing.
905 // I just took a guess at what the actions should be.
906 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000907 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000908 case 'v': // Altivec vector register
909 Info.setAllowsRegister();
910 break;
911 case 'w':
912 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000913 case 'd':// VSX vector register to hold vector double data
914 case 'f':// VSX vector register to hold vector float data
915 case 's':// VSX vector register to hold scalar float data
916 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000917 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000918 break;
919 default:
920 return false;
921 }
922 Info.setAllowsRegister();
923 Name++; // Skip over 'w'.
924 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000925 case 'h': // `MQ', `CTR', or `LINK' register
926 case 'q': // `MQ' register
927 case 'c': // `CTR' register
928 case 'l': // `LINK' register
929 case 'x': // `CR' register (condition register) number 0
930 case 'y': // `CR' register (condition register)
931 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000932 Info.setAllowsRegister();
933 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000934 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000935 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000936 // (use `L' instead for SImode constants)
937 case 'K': // Unsigned 16-bit constant
938 case 'L': // Signed 16-bit constant shifted left 16 bits
939 case 'M': // Constant larger than 31
940 case 'N': // Exact power of 2
941 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000942 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000943 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000944 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000945 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000946 break;
947 case 'm': // Memory operand. Note that on PowerPC targets, m can
948 // include addresses that update the base register. It
949 // is therefore only safe to use `m' in an asm statement
950 // if that asm statement accesses the operand exactly once.
951 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000952 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000953 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000954 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000955 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000956 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
957 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000958 // register to be updated.
959 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000960 if (Name[1] != 's')
961 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000962 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000963 // include any automodification of the base register. Unlike
964 // `m', this constraint can be used in asm statements that
965 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000966 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000967 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000968 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000969 break;
970 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000971 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000972 case 'Z': // Memory operand that is an indexed or indirect from a
973 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000974 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000975 Info.setAllowsMemory();
976 Info.setAllowsRegister();
977 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000978 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000979 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000980 // register (`p' is preferable for asm statements)
981 case 'S': // Constant suitable as a 64-bit mask operand
982 case 'T': // Constant suitable as a 32-bit mask operand
983 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000984 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000985 // instructions
986 case 'W': // Vector constant that does not require memory
987 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000988 break;
989 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000990 }
John Thompson07a61a42010-06-24 22:44:13 +0000991 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000992 }
Craig Topper3164f332014-03-11 03:39:26 +0000993 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000994 std::string R;
995 switch (*Constraint) {
996 case 'e':
997 case 'w':
998 // Two-character constraint; add "^" hint for later parsing.
999 R = std::string("^") + std::string(Constraint, 2);
1000 Constraint++;
1001 break;
1002 default:
1003 return TargetInfo::convertConstraint(Constraint);
1004 }
1005 return R;
1006 }
Craig Topper3164f332014-03-11 03:39:26 +00001007 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001008 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001009 }
Craig Topper3164f332014-03-11 03:39:26 +00001010 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001011 if (RegNo == 0) return 3;
1012 if (RegNo == 1) return 4;
1013 return -1;
1014 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001015
1016 bool hasSjLjLowering() const override {
1017 return true;
1018 }
David Majnemer2617ea62015-06-09 18:05:33 +00001019
1020 bool useFloat128ManglingForLongDouble() const override {
1021 return LongDoubleWidth == 128 &&
1022 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1023 getTriple().isOSBinFormatELF();
1024 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001025};
Anders Carlssonf511f642007-11-27 04:11:28 +00001026
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001027const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001028#define BUILTIN(ID, TYPE, ATTRS) \
1029 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1030#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1031 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001032#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001033};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001034
Eric Christopher917e9522014-11-18 22:36:15 +00001035/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001036/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001037bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001038 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001039 for (const auto &Feature : Features) {
1040 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001041 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001042 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001043 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001044 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001045 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001046 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001047 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001048 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001049 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001050 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001051 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001052 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001053 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001054 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001055 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001056 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001057 // TODO: Finish this list and add an assert that we've handled them
1058 // all.
1059 }
Eric Christopher02c33352015-08-25 00:59:11 +00001060
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001061 return true;
1062}
1063
Chris Lattnerecd49032009-03-02 22:27:17 +00001064/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1065/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001066void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001067 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001068 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001069 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001070 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001071 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001072 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001073 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001074 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001075 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001076 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001077 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001078 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001079 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001080
Chris Lattnerecd49032009-03-02 22:27:17 +00001081 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001082 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1083 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001084 } else {
1085 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1086 getTriple().getOS() != llvm::Triple::OpenBSD)
1087 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001088 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001089
Ulrich Weigand8afad612014-07-28 13:17:52 +00001090 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001091 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001092 Builder.defineMacro("_CALL_ELF", "1");
1093 if (ABI == "elfv2")
1094 Builder.defineMacro("_CALL_ELF", "2");
1095
Chris Lattnerecd49032009-03-02 22:27:17 +00001096 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001097 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1098 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001099
Chris Lattnerecd49032009-03-02 22:27:17 +00001100 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001101 if (LongDoubleWidth == 128)
1102 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001103
John Thompsone467e192009-11-19 17:18:50 +00001104 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001105 Builder.defineMacro("__VEC__", "10206");
1106 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001107 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001108
1109 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001110 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1111 .Case("440", ArchDefineName)
1112 .Case("450", ArchDefineName | ArchDefine440)
1113 .Case("601", ArchDefineName)
1114 .Case("602", ArchDefineName | ArchDefinePpcgr)
1115 .Case("603", ArchDefineName | ArchDefinePpcgr)
1116 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1117 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1118 .Case("604", ArchDefineName | ArchDefinePpcgr)
1119 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1120 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001121 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001122 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1123 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1124 .Case("750", ArchDefineName | ArchDefinePpcgr)
1125 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1126 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001127 .Case("a2", ArchDefineA2)
1128 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001129 .Case("pwr3", ArchDefinePpcgr)
1130 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1131 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1132 | ArchDefinePpcsq)
1133 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1134 | ArchDefinePpcgr | ArchDefinePpcsq)
1135 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1136 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1137 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1138 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1139 | ArchDefinePpcsq)
1140 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1141 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001142 | ArchDefinePpcgr | ArchDefinePpcsq)
1143 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1144 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1145 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001146 .Case("power3", ArchDefinePpcgr)
1147 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1148 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1149 | ArchDefinePpcsq)
1150 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1151 | ArchDefinePpcgr | ArchDefinePpcsq)
1152 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1153 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1154 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1155 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1156 | ArchDefinePpcsq)
1157 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1158 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001159 | ArchDefinePpcgr | ArchDefinePpcsq)
1160 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1161 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1162 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001163 .Default(ArchDefineNone);
1164
1165 if (defs & ArchDefineName)
1166 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1167 if (defs & ArchDefinePpcgr)
1168 Builder.defineMacro("_ARCH_PPCGR");
1169 if (defs & ArchDefinePpcsq)
1170 Builder.defineMacro("_ARCH_PPCSQ");
1171 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001172 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001173 if (defs & ArchDefine603)
1174 Builder.defineMacro("_ARCH_603");
1175 if (defs & ArchDefine604)
1176 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001177 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001178 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001179 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001180 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001181 if (defs & ArchDefinePwr5x)
1182 Builder.defineMacro("_ARCH_PWR5X");
1183 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001184 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001185 if (defs & ArchDefinePwr6x)
1186 Builder.defineMacro("_ARCH_PWR6X");
1187 if (defs & ArchDefinePwr7)
1188 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001189 if (defs & ArchDefinePwr8)
1190 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001191 if (defs & ArchDefineA2)
1192 Builder.defineMacro("_ARCH_A2");
1193 if (defs & ArchDefineA2q) {
1194 Builder.defineMacro("_ARCH_A2Q");
1195 Builder.defineMacro("_ARCH_QP");
1196 }
1197
1198 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1199 Builder.defineMacro("__bg__");
1200 Builder.defineMacro("__THW_BLUEGENE__");
1201 Builder.defineMacro("__bgq__");
1202 Builder.defineMacro("__TOS_BGQ__");
1203 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001204
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001205 if (HasVSX)
1206 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001207 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001208 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001209 if (HasP8Crypto)
1210 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001211 if (HasHTM)
1212 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001213
1214 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1215 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1216 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1217 if (PointerWidth == 64)
1218 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001219
Bill Schmidt38378a02013-02-01 20:23:10 +00001220 // FIXME: The following are not yet generated here by Clang, but are
1221 // generated by GCC:
1222 //
1223 // _SOFT_FLOAT_
1224 // __RECIP_PRECISION__
1225 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001226 // __RECIP__
1227 // __RECIPF__
1228 // __RSQRTE__
1229 // __RSQRTEF__
1230 // _SOFT_DOUBLE_
1231 // __NO_LWSYNC__
1232 // __HAVE_BSWAP__
1233 // __LONGDOUBLE128
1234 // __CMODEL_MEDIUM__
1235 // __CMODEL_LARGE__
1236 // _CALL_SYSV
1237 // _CALL_DARWIN
1238 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001239}
1240
Eric Christophera8a14c32015-08-31 18:39:16 +00001241// Handle explicit options being passed to the compiler here: if we've
1242// explicitly turned off vsx and turned on power8-vector or direct-move then
1243// go ahead and error since the customer has expressed a somewhat incompatible
1244// set of options.
1245static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001246 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001247
1248 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1249 FeaturesVec.end()) {
1250 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1251 FeaturesVec.end()) {
1252 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1253 << "-mno-vsx";
1254 return false;
1255 }
1256
1257 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1258 FeaturesVec.end()) {
1259 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1260 << "-mno-vsx";
1261 return false;
1262 }
1263 }
1264
1265 return true;
1266}
1267
Eric Christopher8c47b422015-10-09 18:39:55 +00001268bool PPCTargetInfo::initFeatureMap(
1269 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1270 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001271 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1272 .Case("7400", true)
1273 .Case("g4", true)
1274 .Case("7450", true)
1275 .Case("g4+", true)
1276 .Case("970", true)
1277 .Case("g5", true)
1278 .Case("pwr6", true)
1279 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001280 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001281 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001282 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001283 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001284
1285 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001286 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1287 .Case("ppc64le", true)
1288 .Case("pwr8", true)
1289 .Default(false);
1290 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1291 .Case("ppc64le", true)
1292 .Case("pwr8", true)
1293 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001294 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1295 .Case("ppc64le", true)
1296 .Case("pwr8", true)
1297 .Case("pwr7", true)
1298 .Default(false);
1299 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1300 .Case("ppc64le", true)
1301 .Case("pwr8", true)
1302 .Case("pwr7", true)
1303 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001304 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1305 .Case("ppc64le", true)
1306 .Case("pwr8", true)
1307 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001308 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1309 .Case("ppc64le", true)
1310 .Case("pwr8", true)
1311 .Case("pwr7", true)
1312 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001313
Eric Christophera8a14c32015-08-31 18:39:16 +00001314 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1315 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001316
Eric Christopher007b0a02015-08-28 22:32:01 +00001317 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001318}
1319
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001320bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001321 return llvm::StringSwitch<bool>(Feature)
1322 .Case("powerpc", true)
1323 .Case("vsx", HasVSX)
1324 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001325 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001326 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001327 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001328 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001329 .Case("bpermd", HasBPERMD)
1330 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001331 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001332}
Chris Lattner17df24e2008-04-21 18:56:49 +00001333
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001334void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1335 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001336 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1337 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1338 // incompatible options.
1339 if (Enabled) {
1340 if (Name == "vsx") {
1341 Features[Name] = true;
1342 } else if (Name == "direct-move") {
1343 Features[Name] = Features["vsx"] = true;
1344 } else if (Name == "power8-vector") {
1345 Features[Name] = Features["vsx"] = true;
1346 } else {
1347 Features[Name] = true;
1348 }
1349 } else {
1350 if (Name == "vsx") {
1351 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1352 false;
1353 } else {
1354 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001355 }
1356 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001357}
1358
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001359const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001360 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1361 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1362 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1363 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1364 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1365 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1366 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1367 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001368 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001369 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001370 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001371 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1372 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1373 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1374 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001375 "vrsave", "vscr",
1376 "spe_acc", "spefscr",
1377 "sfp"
1378};
Chris Lattner10a5b382007-01-29 05:24:35 +00001379
Craig Topperf054e3a2015-10-19 03:52:27 +00001380ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1381 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001382}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001383
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001384const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1385 // While some of these aliases do map to different registers
1386 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001387 { { "0" }, "r0" },
1388 { { "1"}, "r1" },
1389 { { "2" }, "r2" },
1390 { { "3" }, "r3" },
1391 { { "4" }, "r4" },
1392 { { "5" }, "r5" },
1393 { { "6" }, "r6" },
1394 { { "7" }, "r7" },
1395 { { "8" }, "r8" },
1396 { { "9" }, "r9" },
1397 { { "10" }, "r10" },
1398 { { "11" }, "r11" },
1399 { { "12" }, "r12" },
1400 { { "13" }, "r13" },
1401 { { "14" }, "r14" },
1402 { { "15" }, "r15" },
1403 { { "16" }, "r16" },
1404 { { "17" }, "r17" },
1405 { { "18" }, "r18" },
1406 { { "19" }, "r19" },
1407 { { "20" }, "r20" },
1408 { { "21" }, "r21" },
1409 { { "22" }, "r22" },
1410 { { "23" }, "r23" },
1411 { { "24" }, "r24" },
1412 { { "25" }, "r25" },
1413 { { "26" }, "r26" },
1414 { { "27" }, "r27" },
1415 { { "28" }, "r28" },
1416 { { "29" }, "r29" },
1417 { { "30" }, "r30" },
1418 { { "31" }, "r31" },
1419 { { "fr0" }, "f0" },
1420 { { "fr1" }, "f1" },
1421 { { "fr2" }, "f2" },
1422 { { "fr3" }, "f3" },
1423 { { "fr4" }, "f4" },
1424 { { "fr5" }, "f5" },
1425 { { "fr6" }, "f6" },
1426 { { "fr7" }, "f7" },
1427 { { "fr8" }, "f8" },
1428 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001429 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001430 { { "fr11" }, "f11" },
1431 { { "fr12" }, "f12" },
1432 { { "fr13" }, "f13" },
1433 { { "fr14" }, "f14" },
1434 { { "fr15" }, "f15" },
1435 { { "fr16" }, "f16" },
1436 { { "fr17" }, "f17" },
1437 { { "fr18" }, "f18" },
1438 { { "fr19" }, "f19" },
1439 { { "fr20" }, "f20" },
1440 { { "fr21" }, "f21" },
1441 { { "fr22" }, "f22" },
1442 { { "fr23" }, "f23" },
1443 { { "fr24" }, "f24" },
1444 { { "fr25" }, "f25" },
1445 { { "fr26" }, "f26" },
1446 { { "fr27" }, "f27" },
1447 { { "fr28" }, "f28" },
1448 { { "fr29" }, "f29" },
1449 { { "fr30" }, "f30" },
1450 { { "fr31" }, "f31" },
1451 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001452};
1453
Craig Topperf054e3a2015-10-19 03:52:27 +00001454ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1455 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001456}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001457
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001458class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001459public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001460 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001461 DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001462
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001463 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001464 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001465 case llvm::Triple::FreeBSD:
1466 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001467 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001468 PtrDiffType = SignedInt;
1469 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001470 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001471 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001472 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001473 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001474
Roman Divacky3ffe7462012-03-13 19:20:17 +00001475 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1476 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001477 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001478 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001479
1480 // PPC32 supports atomics up to 4 bytes.
1481 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001482 }
1483
Craig Topper3164f332014-03-11 03:39:26 +00001484 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001485 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001486 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001487 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001488};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001489
Bill Schmidt778d3872013-07-26 01:36:11 +00001490// Note: ABI differences may eventually require us to have a separate
1491// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001492class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001493public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001494 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001495 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001496 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001497 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001498
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001499 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001500 DataLayoutString = "e-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001501 ABI = "elfv2";
1502 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001503 DataLayoutString = "E-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001504 ABI = "elfv1";
1505 }
1506
1507 switch (getTriple().getOS()) {
1508 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001509 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001510 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001511 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001512 case llvm::Triple::NetBSD:
1513 IntMaxType = SignedLongLong;
1514 Int64Type = SignedLongLong;
1515 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001516 default:
1517 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001518 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001519
1520 // PPC64 supports atomics up to 8 bytes.
1521 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001522 }
Craig Topper3164f332014-03-11 03:39:26 +00001523 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001524 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001525 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001526 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001527 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001528 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001529 ABI = Name;
1530 return true;
1531 }
1532 return false;
1533 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001534};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001535
Roman Divacky965b0b72011-01-06 08:27:10 +00001536class DarwinPPC32TargetInfo :
1537 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001538public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001539 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1540 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001541 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001542 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001543 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001544 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001545 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001546 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001547 }
Craig Topper3164f332014-03-11 03:39:26 +00001548 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001549 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001550 }
1551};
1552
1553class DarwinPPC64TargetInfo :
1554 public DarwinTargetInfo<PPC64TargetInfo> {
1555public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001556 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1557 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001558 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001559 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001560 DataLayoutString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001561 }
1562};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001563
Eric Christopherc48497a2015-09-18 21:26:24 +00001564static const unsigned NVPTXAddrSpaceMap[] = {
1565 1, // opencl_global
1566 3, // opencl_local
1567 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001568 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001569 0, // opencl_generic
1570 1, // cuda_device
1571 4, // cuda_constant
1572 3, // cuda_shared
1573};
1574
1575class NVPTXTargetInfo : public TargetInfo {
1576 static const char *const GCCRegNames[];
1577 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001578
1579 // The GPU profiles supported by the NVPTX backend
1580 enum GPUKind {
1581 GK_NONE,
1582 GK_SM20,
1583 GK_SM21,
1584 GK_SM30,
1585 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001586 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001587 } GPU;
1588
Eric Christopherc48497a2015-09-18 21:26:24 +00001589public:
1590 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1591 BigEndian = false;
1592 TLSSupported = false;
1593 LongWidth = LongAlign = 64;
1594 AddrSpaceMap = &NVPTXAddrSpaceMap;
1595 UseAddrSpaceMapMangling = true;
1596 // Define available target features
1597 // These must be defined in sorted order!
1598 NoAsmVariants = true;
1599 // Set the default GPU to sm20
1600 GPU = GK_SM20;
1601 }
1602 void getTargetDefines(const LangOptions &Opts,
1603 MacroBuilder &Builder) const override {
1604 Builder.defineMacro("__PTX__");
1605 Builder.defineMacro("__NVPTX__");
1606 if (Opts.CUDAIsDevice) {
1607 // Set __CUDA_ARCH__ for the GPU specified.
1608 std::string CUDAArchCode;
1609 switch (GPU) {
1610 case GK_SM20:
1611 CUDAArchCode = "200";
1612 break;
1613 case GK_SM21:
1614 CUDAArchCode = "210";
1615 break;
1616 case GK_SM30:
1617 CUDAArchCode = "300";
1618 break;
1619 case GK_SM35:
1620 CUDAArchCode = "350";
1621 break;
1622 case GK_SM37:
1623 CUDAArchCode = "370";
1624 break;
1625 default:
1626 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001627 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001628 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001629 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001630 }
Craig Topper6c03a542015-10-19 04:51:35 +00001631 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1632 return llvm::makeArrayRef(BuiltinInfo,
1633 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001634 }
1635 bool hasFeature(StringRef Feature) const override {
1636 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001637 }
1638
Craig Topperf054e3a2015-10-19 03:52:27 +00001639 ArrayRef<const char *> getGCCRegNames() const override;
1640 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001641 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001642 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001643 }
1644 bool validateAsmConstraint(const char *&Name,
1645 TargetInfo::ConstraintInfo &Info) const override {
1646 switch (*Name) {
1647 default:
1648 return false;
1649 case 'c':
1650 case 'h':
1651 case 'r':
1652 case 'l':
1653 case 'f':
1654 case 'd':
1655 Info.setAllowsRegister();
1656 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001657 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001658 }
1659 const char *getClobbers() const override {
1660 // FIXME: Is this really right?
1661 return "";
1662 }
1663 BuiltinVaListKind getBuiltinVaListKind() const override {
1664 // FIXME: implement
1665 return TargetInfo::CharPtrBuiltinVaList;
1666 }
1667 bool setCPU(const std::string &Name) override {
1668 GPU = llvm::StringSwitch<GPUKind>(Name)
1669 .Case("sm_20", GK_SM20)
1670 .Case("sm_21", GK_SM21)
1671 .Case("sm_30", GK_SM30)
1672 .Case("sm_35", GK_SM35)
1673 .Case("sm_37", GK_SM37)
1674 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001675
Eric Christopherc48497a2015-09-18 21:26:24 +00001676 return GPU != GK_NONE;
1677 }
1678};
1679
1680const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1681#define BUILTIN(ID, TYPE, ATTRS) \
1682 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1683#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1684 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1685#include "clang/Basic/BuiltinsNVPTX.def"
1686};
1687
1688const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1689
Craig Topperf054e3a2015-10-19 03:52:27 +00001690ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1691 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001692}
1693
1694class NVPTX32TargetInfo : public NVPTXTargetInfo {
1695public:
1696 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001697 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001698 PointerWidth = PointerAlign = 32;
1699 SizeType = TargetInfo::UnsignedInt;
1700 PtrDiffType = TargetInfo::SignedInt;
1701 IntPtrType = TargetInfo::SignedInt;
1702 DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
1703 }
1704};
1705
1706class NVPTX64TargetInfo : public NVPTXTargetInfo {
1707public:
1708 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1709 PointerWidth = PointerAlign = 64;
1710 SizeType = TargetInfo::UnsignedLong;
1711 PtrDiffType = TargetInfo::SignedLong;
1712 IntPtrType = TargetInfo::SignedLong;
1713 DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64";
1714 }
1715};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001716
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001717static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001718 1, // opencl_global
1719 3, // opencl_local
1720 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001721 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001722 1, // cuda_device
1723 2, // cuda_constant
1724 3 // cuda_shared
1725};
1726
Tom Stellarda96344b2014-08-21 13:58:40 +00001727// If you edit the description strings, make sure you update
1728// getPointerWidthV().
1729
Craig Topper273dbc62015-10-18 05:29:26 +00001730static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001731 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1732 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001733
Craig Topper273dbc62015-10-18 05:29:26 +00001734static const char *const DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001735 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1736 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001737
Craig Topper273dbc62015-10-18 05:29:26 +00001738static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001739 "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 +00001740 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1741 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001742
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001743class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001744 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001745 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001746
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001747 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001748 enum GPUKind {
1749 GK_NONE,
1750 GK_R600,
1751 GK_R600_DOUBLE_OPS,
1752 GK_R700,
1753 GK_R700_DOUBLE_OPS,
1754 GK_EVERGREEN,
1755 GK_EVERGREEN_DOUBLE_OPS,
1756 GK_NORTHERN_ISLANDS,
1757 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001758 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001759 GK_SEA_ISLANDS,
1760 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001761 } GPU;
1762
Jan Veselyeebeaea2015-05-04 19:53:36 +00001763 bool hasFP64:1;
1764 bool hasFMAF:1;
1765 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001766
Eli Friedmand13b41e2012-10-12 23:32:00 +00001767public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001768 AMDGPUTargetInfo(const llvm::Triple &Triple)
1769 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001770
1771 if (Triple.getArch() == llvm::Triple::amdgcn) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001772 DataLayoutString = DataLayoutStringSI;
Tom Stellardd99fb952015-01-28 15:38:44 +00001773 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001774 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001775 hasFMAF = true;
1776 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001777 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001778 DataLayoutString = DataLayoutStringR600;
Tom Stellardd99fb952015-01-28 15:38:44 +00001779 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001780 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001781 hasFMAF = false;
1782 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001783 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001784 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001785 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001786 }
1787
Tom Stellarda96344b2014-08-21 13:58:40 +00001788 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1789 if (GPU <= GK_CAYMAN)
1790 return 32;
1791
1792 switch(AddrSpace) {
1793 default:
1794 return 64;
1795 case 0:
1796 case 3:
1797 case 5:
1798 return 32;
1799 }
1800 }
1801
Craig Topper3164f332014-03-11 03:39:26 +00001802 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001803 return "";
1804 }
1805
Craig Topperf054e3a2015-10-19 03:52:27 +00001806 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001807
Craig Topperf054e3a2015-10-19 03:52:27 +00001808 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1809 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001810 }
1811
Craig Topper3164f332014-03-11 03:39:26 +00001812 bool validateAsmConstraint(const char *&Name,
1813 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001814 return true;
1815 }
1816
Craig Topper6c03a542015-10-19 04:51:35 +00001817 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1818 return llvm::makeArrayRef(BuiltinInfo,
1819 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001820 }
1821
Craig Topper3164f332014-03-11 03:39:26 +00001822 void getTargetDefines(const LangOptions &Opts,
1823 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001824 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001825 if (hasFMAF)
1826 Builder.defineMacro("__HAS_FMAF__");
1827 if (hasLDEXPF)
1828 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001829 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001830 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001831 if (Opts.OpenCL) {
1832 if (GPU >= GK_NORTHERN_ISLANDS) {
1833 Builder.defineMacro("cl_khr_byte_addressable_store");
1834 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1835 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1836 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1837 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1838 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001839 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001840 }
1841
Craig Topper3164f332014-03-11 03:39:26 +00001842 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001843 return TargetInfo::CharPtrBuiltinVaList;
1844 }
1845
Craig Topper3164f332014-03-11 03:39:26 +00001846 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001847 GPU = llvm::StringSwitch<GPUKind>(Name)
1848 .Case("r600" , GK_R600)
1849 .Case("rv610", GK_R600)
1850 .Case("rv620", GK_R600)
1851 .Case("rv630", GK_R600)
1852 .Case("rv635", GK_R600)
1853 .Case("rs780", GK_R600)
1854 .Case("rs880", GK_R600)
1855 .Case("rv670", GK_R600_DOUBLE_OPS)
1856 .Case("rv710", GK_R700)
1857 .Case("rv730", GK_R700)
1858 .Case("rv740", GK_R700_DOUBLE_OPS)
1859 .Case("rv770", GK_R700_DOUBLE_OPS)
1860 .Case("palm", GK_EVERGREEN)
1861 .Case("cedar", GK_EVERGREEN)
1862 .Case("sumo", GK_EVERGREEN)
1863 .Case("sumo2", GK_EVERGREEN)
1864 .Case("redwood", GK_EVERGREEN)
1865 .Case("juniper", GK_EVERGREEN)
1866 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1867 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1868 .Case("barts", GK_NORTHERN_ISLANDS)
1869 .Case("turks", GK_NORTHERN_ISLANDS)
1870 .Case("caicos", GK_NORTHERN_ISLANDS)
1871 .Case("cayman", GK_CAYMAN)
1872 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001873 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001874 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1875 .Case("verde", GK_SOUTHERN_ISLANDS)
1876 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001877 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001878 .Case("bonaire", GK_SEA_ISLANDS)
1879 .Case("kabini", GK_SEA_ISLANDS)
1880 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001881 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001882 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001883 .Case("tonga", GK_VOLCANIC_ISLANDS)
1884 .Case("iceland", GK_VOLCANIC_ISLANDS)
1885 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001886 .Default(GK_NONE);
1887
1888 if (GPU == GK_NONE) {
1889 return false;
1890 }
1891
1892 // Set the correct data layout
1893 switch (GPU) {
1894 case GK_NONE:
1895 case GK_R600:
1896 case GK_R700:
1897 case GK_EVERGREEN:
1898 case GK_NORTHERN_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001899 DataLayoutString = DataLayoutStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001900 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001901 hasFMAF = false;
1902 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001903 break;
1904 case GK_R600_DOUBLE_OPS:
1905 case GK_R700_DOUBLE_OPS:
1906 case GK_EVERGREEN_DOUBLE_OPS:
1907 case GK_CAYMAN:
Eric Christopher964a5f32015-08-05 23:48:05 +00001908 DataLayoutString = DataLayoutStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001909 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001910 hasFMAF = true;
1911 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001912 break;
1913 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001914 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001915 case GK_VOLCANIC_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001916 DataLayoutString = DataLayoutStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001917 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001918 hasFMAF = true;
1919 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001920 break;
1921 }
1922
1923 return true;
1924 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001925};
1926
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001927const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001928#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001929 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001930#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001931};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001932const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001933 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1934 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1935 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1936 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1937 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1938 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1939 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1940 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1941 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1942 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1943 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1944 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1945 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1946 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1947 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1948 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1949 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1950 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1951 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1952 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1953 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1954 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1955 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1956 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1957 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1958 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1959 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1960 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1961 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1962 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1963 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1964 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1965 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1966 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1967 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1968 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1969 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1970 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1971 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1972 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1973 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1974 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
1975 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
1976 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
1977 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
1978 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
1979 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
1980 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
1981 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
1982 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
1983};
1984
Craig Topperf054e3a2015-10-19 03:52:27 +00001985ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
1986 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00001987}
Matt Arsenault56f008d2014-06-24 20:45:01 +00001988
Eli Friedman3fd920a2008-08-20 02:34:37 +00001989// Namespace for x86 abstract base class
1990const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001991#define BUILTIN(ID, TYPE, ATTRS) \
1992 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00001993#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00001994 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00001995#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00001996 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00001997#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001998};
Eli Friedmanb5366062008-05-20 14:21:01 +00001999
Nuno Lopescfca1f02009-12-23 17:49:57 +00002000static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002001 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2002 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002003 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002004 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2005 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2006 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002007 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002008 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2009 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002010};
2011
Eric Christophercdd36352011-06-21 00:05:20 +00002012const TargetInfo::AddlRegName AddlRegNames[] = {
2013 { { "al", "ah", "eax", "rax" }, 0 },
2014 { { "bl", "bh", "ebx", "rbx" }, 3 },
2015 { { "cl", "ch", "ecx", "rcx" }, 2 },
2016 { { "dl", "dh", "edx", "rdx" }, 1 },
2017 { { "esi", "rsi" }, 4 },
2018 { { "edi", "rdi" }, 5 },
2019 { { "esp", "rsp" }, 7 },
2020 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002021 { { "r8d", "r8w", "r8b" }, 38 },
2022 { { "r9d", "r9w", "r9b" }, 39 },
2023 { { "r10d", "r10w", "r10b" }, 40 },
2024 { { "r11d", "r11w", "r11b" }, 41 },
2025 { { "r12d", "r12w", "r12b" }, 42 },
2026 { { "r13d", "r13w", "r13b" }, 43 },
2027 { { "r14d", "r14w", "r14b" }, 44 },
2028 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002029};
2030
2031// X86 target abstract base class; x86-32 and x86-64 are very close, so
2032// most of the implementation can be shared.
2033class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002034 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002035 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002036 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002037 enum MMX3DNowEnum {
2038 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002039 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002040 enum XOPEnum {
2041 NoXOP,
2042 SSE4A,
2043 FMA4,
2044 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002045 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002046
Craig Topper543f3bd2015-10-14 23:47:57 +00002047 bool HasAES = false;
2048 bool HasPCLMUL = false;
2049 bool HasLZCNT = false;
2050 bool HasRDRND = false;
2051 bool HasFSGSBASE = false;
2052 bool HasBMI = false;
2053 bool HasBMI2 = false;
2054 bool HasPOPCNT = false;
2055 bool HasRTM = false;
2056 bool HasPRFCHW = false;
2057 bool HasRDSEED = false;
2058 bool HasADX = false;
2059 bool HasTBM = false;
2060 bool HasFMA = false;
2061 bool HasF16C = false;
2062 bool HasAVX512CD = false;
2063 bool HasAVX512ER = false;
2064 bool HasAVX512PF = false;
2065 bool HasAVX512DQ = false;
2066 bool HasAVX512BW = false;
2067 bool HasAVX512VL = false;
2068 bool HasSHA = false;
2069 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002070 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002071 bool HasXSAVE = false;
2072 bool HasXSAVEOPT = false;
2073 bool HasXSAVEC = false;
2074 bool HasXSAVES = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002075
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002076 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2077 ///
2078 /// Each enumeration represents a particular CPU supported by Clang. These
2079 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2080 enum CPUKind {
2081 CK_Generic,
2082
2083 /// \name i386
2084 /// i386-generation processors.
2085 //@{
2086 CK_i386,
2087 //@}
2088
2089 /// \name i486
2090 /// i486-generation processors.
2091 //@{
2092 CK_i486,
2093 CK_WinChipC6,
2094 CK_WinChip2,
2095 CK_C3,
2096 //@}
2097
2098 /// \name i586
2099 /// i586-generation processors, P5 microarchitecture based.
2100 //@{
2101 CK_i586,
2102 CK_Pentium,
2103 CK_PentiumMMX,
2104 //@}
2105
2106 /// \name i686
2107 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2108 //@{
2109 CK_i686,
2110 CK_PentiumPro,
2111 CK_Pentium2,
2112 CK_Pentium3,
2113 CK_Pentium3M,
2114 CK_PentiumM,
2115 CK_C3_2,
2116
2117 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2118 /// Clang however has some logic to suport this.
2119 // FIXME: Warn, deprecate, and potentially remove this.
2120 CK_Yonah,
2121 //@}
2122
2123 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002124 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002125 //@{
2126 CK_Pentium4,
2127 CK_Pentium4M,
2128 CK_Prescott,
2129 CK_Nocona,
2130 //@}
2131
2132 /// \name Core
2133 /// Core microarchitecture based processors.
2134 //@{
2135 CK_Core2,
2136
2137 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2138 /// codename which GCC no longer accepts as an option to -march, but Clang
2139 /// has some logic for recognizing it.
2140 // FIXME: Warn, deprecate, and potentially remove this.
2141 CK_Penryn,
2142 //@}
2143
2144 /// \name Atom
2145 /// Atom processors
2146 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002147 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002148 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002149 //@}
2150
2151 /// \name Nehalem
2152 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002153 CK_Nehalem,
2154
2155 /// \name Westmere
2156 /// Westmere microarchitecture based processors.
2157 CK_Westmere,
2158
2159 /// \name Sandy Bridge
2160 /// Sandy Bridge microarchitecture based processors.
2161 CK_SandyBridge,
2162
2163 /// \name Ivy Bridge
2164 /// Ivy Bridge microarchitecture based processors.
2165 CK_IvyBridge,
2166
2167 /// \name Haswell
2168 /// Haswell microarchitecture based processors.
2169 CK_Haswell,
2170
2171 /// \name Broadwell
2172 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002173 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002174
2175 /// \name Skylake
2176 /// Skylake microarchitecture based processors.
2177 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002178
Craig Topper449314e2013-08-20 07:09:39 +00002179 /// \name Knights Landing
2180 /// Knights Landing processor.
2181 CK_KNL,
2182
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002183 /// \name K6
2184 /// K6 architecture processors.
2185 //@{
2186 CK_K6,
2187 CK_K6_2,
2188 CK_K6_3,
2189 //@}
2190
2191 /// \name K7
2192 /// K7 architecture processors.
2193 //@{
2194 CK_Athlon,
2195 CK_AthlonThunderbird,
2196 CK_Athlon4,
2197 CK_AthlonXP,
2198 CK_AthlonMP,
2199 //@}
2200
2201 /// \name K8
2202 /// K8 architecture processors.
2203 //@{
2204 CK_Athlon64,
2205 CK_Athlon64SSE3,
2206 CK_AthlonFX,
2207 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002208 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002209 CK_Opteron,
2210 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002211 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002212 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002213
Benjamin Kramer569f2152012-01-10 11:50:18 +00002214 /// \name Bobcat
2215 /// Bobcat architecture processors.
2216 //@{
2217 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002218 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002219 //@}
2220
2221 /// \name Bulldozer
2222 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002223 //@{
2224 CK_BDVER1,
2225 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002226 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002227 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002228 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002229
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002230 /// This specification is deprecated and will be removed in the future.
2231 /// Users should prefer \see CK_K8.
2232 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002233 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002234 CK_x86_64,
2235 //@}
2236
2237 /// \name Geode
2238 /// Geode processors.
2239 //@{
2240 CK_Geode
2241 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002242 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002243
Eric Christopherc50738f2015-08-27 00:05:50 +00002244 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002245 return llvm::StringSwitch<CPUKind>(CPU)
2246 .Case("i386", CK_i386)
2247 .Case("i486", CK_i486)
2248 .Case("winchip-c6", CK_WinChipC6)
2249 .Case("winchip2", CK_WinChip2)
2250 .Case("c3", CK_C3)
2251 .Case("i586", CK_i586)
2252 .Case("pentium", CK_Pentium)
2253 .Case("pentium-mmx", CK_PentiumMMX)
2254 .Case("i686", CK_i686)
2255 .Case("pentiumpro", CK_PentiumPro)
2256 .Case("pentium2", CK_Pentium2)
2257 .Case("pentium3", CK_Pentium3)
2258 .Case("pentium3m", CK_Pentium3M)
2259 .Case("pentium-m", CK_PentiumM)
2260 .Case("c3-2", CK_C3_2)
2261 .Case("yonah", CK_Yonah)
2262 .Case("pentium4", CK_Pentium4)
2263 .Case("pentium4m", CK_Pentium4M)
2264 .Case("prescott", CK_Prescott)
2265 .Case("nocona", CK_Nocona)
2266 .Case("core2", CK_Core2)
2267 .Case("penryn", CK_Penryn)
2268 .Case("bonnell", CK_Bonnell)
2269 .Case("atom", CK_Bonnell) // Legacy name.
2270 .Case("silvermont", CK_Silvermont)
2271 .Case("slm", CK_Silvermont) // Legacy name.
2272 .Case("nehalem", CK_Nehalem)
2273 .Case("corei7", CK_Nehalem) // Legacy name.
2274 .Case("westmere", CK_Westmere)
2275 .Case("sandybridge", CK_SandyBridge)
2276 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2277 .Case("ivybridge", CK_IvyBridge)
2278 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2279 .Case("haswell", CK_Haswell)
2280 .Case("core-avx2", CK_Haswell) // Legacy name.
2281 .Case("broadwell", CK_Broadwell)
2282 .Case("skylake", CK_Skylake)
2283 .Case("skx", CK_Skylake) // Legacy name.
2284 .Case("knl", CK_KNL)
2285 .Case("k6", CK_K6)
2286 .Case("k6-2", CK_K6_2)
2287 .Case("k6-3", CK_K6_3)
2288 .Case("athlon", CK_Athlon)
2289 .Case("athlon-tbird", CK_AthlonThunderbird)
2290 .Case("athlon-4", CK_Athlon4)
2291 .Case("athlon-xp", CK_AthlonXP)
2292 .Case("athlon-mp", CK_AthlonMP)
2293 .Case("athlon64", CK_Athlon64)
2294 .Case("athlon64-sse3", CK_Athlon64SSE3)
2295 .Case("athlon-fx", CK_AthlonFX)
2296 .Case("k8", CK_K8)
2297 .Case("k8-sse3", CK_K8SSE3)
2298 .Case("opteron", CK_Opteron)
2299 .Case("opteron-sse3", CK_OpteronSSE3)
2300 .Case("barcelona", CK_AMDFAM10)
2301 .Case("amdfam10", CK_AMDFAM10)
2302 .Case("btver1", CK_BTVER1)
2303 .Case("btver2", CK_BTVER2)
2304 .Case("bdver1", CK_BDVER1)
2305 .Case("bdver2", CK_BDVER2)
2306 .Case("bdver3", CK_BDVER3)
2307 .Case("bdver4", CK_BDVER4)
2308 .Case("x86-64", CK_x86_64)
2309 .Case("geode", CK_Geode)
2310 .Default(CK_Generic);
2311 }
2312
Rafael Espindolaeb265472013-08-21 21:59:03 +00002313 enum FPMathKind {
2314 FP_Default,
2315 FP_SSE,
2316 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002317 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002318
Eli Friedman3fd920a2008-08-20 02:34:37 +00002319public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002320 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002321 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002322 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002323 }
Craig Topper3164f332014-03-11 03:39:26 +00002324 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002325 // X87 evaluates with 80 bits "long double" precision.
2326 return SSELevel == NoSSE ? 2 : 0;
2327 }
Craig Topper6c03a542015-10-19 04:51:35 +00002328 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2329 return llvm::makeArrayRef(BuiltinInfo,
2330 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002331 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002332 ArrayRef<const char *> getGCCRegNames() const override {
2333 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002334 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002335 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2336 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002337 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002338 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2339 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002340 }
Eric Christopherd9832702015-06-29 21:00:05 +00002341 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002342 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002343 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002344
Akira Hatanaka974131e2014-09-18 18:17:18 +00002345 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2346
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002347 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2348
Akira Hatanaka974131e2014-09-18 18:17:18 +00002349 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2350
Craig Topper3164f332014-03-11 03:39:26 +00002351 std::string convertConstraint(const char *&Constraint) const override;
2352 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002353 return "~{dirflag},~{fpsr},~{flags}";
2354 }
Craig Topper3164f332014-03-11 03:39:26 +00002355 void getTargetDefines(const LangOptions &Opts,
2356 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002357 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2358 bool Enabled);
2359 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2360 bool Enabled);
2361 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2362 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002363 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2364 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002365 setFeatureEnabledImpl(Features, Name, Enabled);
2366 }
2367 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002368 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002369 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2370 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002371 bool
2372 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2373 StringRef CPU,
2374 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002375 bool hasFeature(StringRef Feature) const override;
2376 bool handleTargetFeatures(std::vector<std::string> &Features,
2377 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002378 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002379 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2380 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002381 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002382 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002383 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002384 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002385 return "no-mmx";
2386 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002387 }
Craig Topper3164f332014-03-11 03:39:26 +00002388 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002389 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002390
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002391 // Perform any per-CPU checks necessary to determine if this CPU is
2392 // acceptable.
2393 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2394 // invalid without explaining *why*.
2395 switch (CPU) {
2396 case CK_Generic:
2397 // No processor selected!
2398 return false;
2399
2400 case CK_i386:
2401 case CK_i486:
2402 case CK_WinChipC6:
2403 case CK_WinChip2:
2404 case CK_C3:
2405 case CK_i586:
2406 case CK_Pentium:
2407 case CK_PentiumMMX:
2408 case CK_i686:
2409 case CK_PentiumPro:
2410 case CK_Pentium2:
2411 case CK_Pentium3:
2412 case CK_Pentium3M:
2413 case CK_PentiumM:
2414 case CK_Yonah:
2415 case CK_C3_2:
2416 case CK_Pentium4:
2417 case CK_Pentium4M:
2418 case CK_Prescott:
2419 case CK_K6:
2420 case CK_K6_2:
2421 case CK_K6_3:
2422 case CK_Athlon:
2423 case CK_AthlonThunderbird:
2424 case CK_Athlon4:
2425 case CK_AthlonXP:
2426 case CK_AthlonMP:
2427 case CK_Geode:
2428 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002429 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002430 return false;
2431
2432 // Fallthrough
2433 case CK_Nocona:
2434 case CK_Core2:
2435 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002436 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002437 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002438 case CK_Nehalem:
2439 case CK_Westmere:
2440 case CK_SandyBridge:
2441 case CK_IvyBridge:
2442 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002443 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002444 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002445 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002446 case CK_Athlon64:
2447 case CK_Athlon64SSE3:
2448 case CK_AthlonFX:
2449 case CK_K8:
2450 case CK_K8SSE3:
2451 case CK_Opteron:
2452 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002453 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002454 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002455 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002456 case CK_BDVER1:
2457 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002458 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002459 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002460 case CK_x86_64:
2461 return true;
2462 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002463 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002464 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002465
Craig Topper3164f332014-03-11 03:39:26 +00002466 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002467
Craig Topper3164f332014-03-11 03:39:26 +00002468 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002469 // We accept all non-ARM calling conventions
2470 return (CC == CC_X86ThisCall ||
2471 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002472 CC == CC_X86StdCall ||
2473 CC == CC_X86VectorCall ||
2474 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002475 CC == CC_X86Pascal ||
2476 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002477 }
2478
Craig Topper3164f332014-03-11 03:39:26 +00002479 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002480 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002481 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002482
2483 bool hasSjLjLowering() const override {
2484 return true;
2485 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002486};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002487
Rafael Espindolaeb265472013-08-21 21:59:03 +00002488bool X86TargetInfo::setFPMath(StringRef Name) {
2489 if (Name == "387") {
2490 FPMath = FP_387;
2491 return true;
2492 }
2493 if (Name == "sse") {
2494 FPMath = FP_SSE;
2495 return true;
2496 }
2497 return false;
2498}
2499
Eric Christopher007b0a02015-08-28 22:32:01 +00002500bool X86TargetInfo::initFeatureMap(
2501 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002502 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002503 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002504 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002505 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002506 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002507
Eric Christopher2b4a7252015-08-27 00:05:52 +00002508 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002509 case CK_Generic:
2510 case CK_i386:
2511 case CK_i486:
2512 case CK_i586:
2513 case CK_Pentium:
2514 case CK_i686:
2515 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002516 break;
2517 case CK_PentiumMMX:
2518 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002519 case CK_K6:
2520 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002521 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002522 break;
2523 case CK_Pentium3:
2524 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002525 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002526 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002527 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002528 break;
2529 case CK_PentiumM:
2530 case CK_Pentium4:
2531 case CK_Pentium4M:
2532 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002533 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002534 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002535 break;
2536 case CK_Yonah:
2537 case CK_Prescott:
2538 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002539 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002540 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002541 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002542 break;
2543 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002544 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002545 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002546 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002547 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002548 break;
2549 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002550 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002551 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002552 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002553 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002554 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002555 setFeatureEnabledImpl(Features, "avx512f", true);
2556 setFeatureEnabledImpl(Features, "avx512cd", true);
2557 setFeatureEnabledImpl(Features, "avx512dq", true);
2558 setFeatureEnabledImpl(Features, "avx512bw", true);
2559 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002560 setFeatureEnabledImpl(Features, "xsavec", true);
2561 setFeatureEnabledImpl(Features, "xsaves", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002562 // FALLTHROUGH
2563 case CK_Broadwell:
2564 setFeatureEnabledImpl(Features, "rdseed", true);
2565 setFeatureEnabledImpl(Features, "adx", true);
2566 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002567 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002568 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002569 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002570 setFeatureEnabledImpl(Features, "bmi", true);
2571 setFeatureEnabledImpl(Features, "bmi2", true);
2572 setFeatureEnabledImpl(Features, "rtm", true);
2573 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002574 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002575 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002576 setFeatureEnabledImpl(Features, "rdrnd", true);
2577 setFeatureEnabledImpl(Features, "f16c", true);
2578 setFeatureEnabledImpl(Features, "fsgsbase", true);
2579 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002580 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002581 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002582 setFeatureEnabledImpl(Features, "xsave", true);
2583 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002584 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002585 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002586 case CK_Silvermont:
2587 setFeatureEnabledImpl(Features, "aes", true);
2588 setFeatureEnabledImpl(Features, "pclmul", true);
2589 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002590 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002591 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002592 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002593 setFeatureEnabledImpl(Features, "cx16", true);
2594 break;
2595 case CK_KNL:
2596 setFeatureEnabledImpl(Features, "avx512f", true);
2597 setFeatureEnabledImpl(Features, "avx512cd", true);
2598 setFeatureEnabledImpl(Features, "avx512er", true);
2599 setFeatureEnabledImpl(Features, "avx512pf", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002600 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002601 setFeatureEnabledImpl(Features, "rdseed", true);
2602 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002603 setFeatureEnabledImpl(Features, "lzcnt", true);
2604 setFeatureEnabledImpl(Features, "bmi", true);
2605 setFeatureEnabledImpl(Features, "bmi2", true);
2606 setFeatureEnabledImpl(Features, "rtm", true);
2607 setFeatureEnabledImpl(Features, "fma", true);
2608 setFeatureEnabledImpl(Features, "rdrnd", true);
2609 setFeatureEnabledImpl(Features, "f16c", true);
2610 setFeatureEnabledImpl(Features, "fsgsbase", true);
2611 setFeatureEnabledImpl(Features, "aes", true);
2612 setFeatureEnabledImpl(Features, "pclmul", true);
2613 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002614 setFeatureEnabledImpl(Features, "xsaveopt", true);
2615 setFeatureEnabledImpl(Features, "xsave", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002616 break;
2617 case CK_K6_2:
2618 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002619 case CK_WinChip2:
2620 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002621 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002622 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002623 case CK_Athlon:
2624 case CK_AthlonThunderbird:
2625 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002626 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002627 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002628 case CK_Athlon4:
2629 case CK_AthlonXP:
2630 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002631 setFeatureEnabledImpl(Features, "sse", true);
2632 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002633 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002634 break;
2635 case CK_K8:
2636 case CK_Opteron:
2637 case CK_Athlon64:
2638 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002639 setFeatureEnabledImpl(Features, "sse2", true);
2640 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002641 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002642 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002643 case CK_AMDFAM10:
2644 setFeatureEnabledImpl(Features, "sse4a", true);
2645 setFeatureEnabledImpl(Features, "lzcnt", true);
2646 setFeatureEnabledImpl(Features, "popcnt", true);
2647 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002648 case CK_K8SSE3:
2649 case CK_OpteronSSE3:
2650 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002651 setFeatureEnabledImpl(Features, "sse3", true);
2652 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002653 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002654 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002655 case CK_BTVER2:
2656 setFeatureEnabledImpl(Features, "avx", true);
2657 setFeatureEnabledImpl(Features, "aes", true);
2658 setFeatureEnabledImpl(Features, "pclmul", true);
2659 setFeatureEnabledImpl(Features, "bmi", true);
2660 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002661 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002662 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002663 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002664 setFeatureEnabledImpl(Features, "ssse3", true);
2665 setFeatureEnabledImpl(Features, "sse4a", true);
2666 setFeatureEnabledImpl(Features, "lzcnt", true);
2667 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002668 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002669 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002670 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002671 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002672 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002673 case CK_BDVER4:
2674 setFeatureEnabledImpl(Features, "avx2", true);
2675 setFeatureEnabledImpl(Features, "bmi2", true);
2676 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002677 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002678 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002679 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002680 // FALLTHROUGH
2681 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002682 setFeatureEnabledImpl(Features, "bmi", true);
2683 setFeatureEnabledImpl(Features, "fma", true);
2684 setFeatureEnabledImpl(Features, "f16c", true);
2685 setFeatureEnabledImpl(Features, "tbm", true);
2686 // FALLTHROUGH
2687 case CK_BDVER1:
2688 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002689 setFeatureEnabledImpl(Features, "xop", true);
2690 setFeatureEnabledImpl(Features, "lzcnt", true);
2691 setFeatureEnabledImpl(Features, "aes", true);
2692 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002693 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002694 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002695 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002696 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002697 break;
Eli Friedman33465822011-07-08 23:31:17 +00002698 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002699 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2700 return false;
2701
2702 // Can't do this earlier because we need to be able to explicitly enable
2703 // or disable these features and the things that they depend upon.
2704
2705 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2706 auto I = Features.find("sse4.2");
2707 if (I != Features.end() && I->getValue() == true &&
2708 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2709 FeaturesVec.end())
2710 Features["popcnt"] = true;
2711
2712 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2713 I = Features.find("3dnow");
2714 if (I != Features.end() && I->getValue() == true &&
2715 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2716 FeaturesVec.end())
2717 Features["prfchw"] = true;
2718
Eric Christophera7260af2015-10-08 20:10:18 +00002719 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2720 // then enable MMX.
2721 I = Features.find("sse");
2722 if (I != Features.end() && I->getValue() == true &&
2723 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2724 FeaturesVec.end())
2725 Features["mmx"] = true;
2726
Eric Christopherbbd746d2015-10-08 20:10:14 +00002727 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002728}
2729
Rafael Espindolae62e2792013-08-20 13:44:29 +00002730void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002731 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002732 if (Enabled) {
2733 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002734 case AVX512F:
2735 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002736 case AVX2:
2737 Features["avx2"] = true;
2738 case AVX:
2739 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002740 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002741 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002742 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002743 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002744 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002745 case SSSE3:
2746 Features["ssse3"] = true;
2747 case SSE3:
2748 Features["sse3"] = true;
2749 case SSE2:
2750 Features["sse2"] = true;
2751 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002752 Features["sse"] = true;
2753 case NoSSE:
2754 break;
2755 }
2756 return;
2757 }
2758
2759 switch (Level) {
2760 case NoSSE:
2761 case SSE1:
2762 Features["sse"] = false;
2763 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002764 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2765 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002766 case SSE3:
2767 Features["sse3"] = false;
2768 setXOPLevel(Features, NoXOP, false);
2769 case SSSE3:
2770 Features["ssse3"] = false;
2771 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002772 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002773 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002774 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002775 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002776 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2777 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002778 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002779 case AVX2:
2780 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002781 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002782 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002783 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2784 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002785 }
2786}
2787
2788void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002789 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002790 if (Enabled) {
2791 switch (Level) {
2792 case AMD3DNowAthlon:
2793 Features["3dnowa"] = true;
2794 case AMD3DNow:
2795 Features["3dnow"] = true;
2796 case MMX:
2797 Features["mmx"] = true;
2798 case NoMMX3DNow:
2799 break;
2800 }
2801 return;
2802 }
2803
2804 switch (Level) {
2805 case NoMMX3DNow:
2806 case MMX:
2807 Features["mmx"] = false;
2808 case AMD3DNow:
2809 Features["3dnow"] = false;
2810 case AMD3DNowAthlon:
2811 Features["3dnowa"] = false;
2812 }
2813}
2814
2815void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002816 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002817 if (Enabled) {
2818 switch (Level) {
2819 case XOP:
2820 Features["xop"] = true;
2821 case FMA4:
2822 Features["fma4"] = true;
2823 setSSELevel(Features, AVX, true);
2824 case SSE4A:
2825 Features["sse4a"] = true;
2826 setSSELevel(Features, SSE3, true);
2827 case NoXOP:
2828 break;
2829 }
2830 return;
2831 }
2832
2833 switch (Level) {
2834 case NoXOP:
2835 case SSE4A:
2836 Features["sse4a"] = false;
2837 case FMA4:
2838 Features["fma4"] = false;
2839 case XOP:
2840 Features["xop"] = false;
2841 }
2842}
2843
Craig Topper86d79ef2013-09-17 04:51:29 +00002844void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2845 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002846 // This is a bit of a hack to deal with the sse4 target feature when used
2847 // as part of the target attribute. We handle sse4 correctly everywhere
2848 // else. See below for more information on how we handle the sse4 options.
2849 if (Name != "sse4")
2850 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002851
Craig Topper29561122013-09-19 01:13:07 +00002852 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002853 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002854 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002855 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002856 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002857 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002858 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002859 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002860 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002861 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002862 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002863 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002864 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002865 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002866 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002867 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002868 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002869 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002870 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002871 if (Enabled)
2872 setSSELevel(Features, SSE2, Enabled);
2873 } else if (Name == "pclmul") {
2874 if (Enabled)
2875 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002876 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002877 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002878 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002879 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002880 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002881 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002882 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2883 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002884 if (Enabled)
2885 setSSELevel(Features, AVX512F, Enabled);
2886 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002887 if (Enabled)
2888 setSSELevel(Features, AVX, Enabled);
2889 } else if (Name == "fma4") {
2890 setXOPLevel(Features, FMA4, Enabled);
2891 } else if (Name == "xop") {
2892 setXOPLevel(Features, XOP, Enabled);
2893 } else if (Name == "sse4a") {
2894 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002895 } else if (Name == "f16c") {
2896 if (Enabled)
2897 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002898 } else if (Name == "sha") {
2899 if (Enabled)
2900 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002901 } else if (Name == "sse4") {
2902 // We can get here via the __target__ attribute since that's not controlled
2903 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2904 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2905 // disabled.
2906 if (Enabled)
2907 setSSELevel(Features, SSE42, Enabled);
2908 else
2909 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00002910 } else if (Name == "xsave") {
2911 if (Enabled)
2912 setSSELevel(Features, AVX, Enabled);
2913 else
2914 Features["xsaveopt"] = false;
2915 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
2916 if (Enabled) {
2917 Features["xsave"] = true;
2918 setSSELevel(Features, AVX, Enabled);
2919 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002920 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002921}
2922
Eric Christopher3ff21b32013-10-16 21:26:26 +00002923/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002924/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002925bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002926 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00002927 for (const auto &Feature : Features) {
2928 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00002929 continue;
2930
Eric Christopher610fe112015-08-26 08:21:55 +00002931 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002932 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002933 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00002934 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002935 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002936 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002937 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002938 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002939 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00002940 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002941 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002942 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002943 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002944 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002945 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002946 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002947 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00002948 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002949 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00002950 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002951 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00002952 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002953 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00002954 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002955 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002956 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002957 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00002958 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002959 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00002960 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002961 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00002962 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002963 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00002964 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002965 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002966 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002967 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002968 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002969 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002970 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002971 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002972 HasAVX512VL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002973 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00002974 HasSHA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002975 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00002976 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00002977 } else if (Feature == "+fxsr") {
2978 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002979 } else if (Feature == "+xsave") {
2980 HasXSAVE = true;
2981 } else if (Feature == "+xsaveopt") {
2982 HasXSAVEOPT = true;
2983 } else if (Feature == "+xsavec") {
2984 HasXSAVEC = true;
2985 } else if (Feature == "+xsaves") {
2986 HasXSAVES = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002987 }
2988
Benjamin Kramer27402c62012-03-05 15:10:44 +00002989 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002990 .Case("+avx512f", AVX512F)
2991 .Case("+avx2", AVX2)
2992 .Case("+avx", AVX)
2993 .Case("+sse4.2", SSE42)
2994 .Case("+sse4.1", SSE41)
2995 .Case("+ssse3", SSSE3)
2996 .Case("+sse3", SSE3)
2997 .Case("+sse2", SSE2)
2998 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002999 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003000 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003001
Eli Friedman33465822011-07-08 23:31:17 +00003002 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003003 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003004 .Case("+3dnowa", AMD3DNowAthlon)
3005 .Case("+3dnow", AMD3DNow)
3006 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003007 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003008 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003009
3010 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003011 .Case("+xop", XOP)
3012 .Case("+fma4", FMA4)
3013 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003014 .Default(NoXOP);
3015 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003016 }
Eli Friedman33465822011-07-08 23:31:17 +00003017
Rafael Espindolaeb265472013-08-21 21:59:03 +00003018 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3019 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003020 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3021 (FPMath == FP_387 && SSELevel >= SSE1)) {
3022 Diags.Report(diag::err_target_unsupported_fpmath) <<
3023 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003024 return false;
3025 }
3026
Alexey Bataev00396512015-07-02 03:40:19 +00003027 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003028 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003029 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003030}
Chris Lattnerecd49032009-03-02 22:27:17 +00003031
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003032/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3033/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003034void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003035 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003036 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003037 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003038 Builder.defineMacro("__amd64__");
3039 Builder.defineMacro("__amd64");
3040 Builder.defineMacro("__x86_64");
3041 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003042 if (getTriple().getArchName() == "x86_64h") {
3043 Builder.defineMacro("__x86_64h");
3044 Builder.defineMacro("__x86_64h__");
3045 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003046 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003047 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003048 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003049
Chris Lattnerecd49032009-03-02 22:27:17 +00003050 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003051 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3052 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003053 switch (CPU) {
3054 case CK_Generic:
3055 break;
3056 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003057 // The rest are coming from the i386 define above.
3058 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003059 break;
3060 case CK_i486:
3061 case CK_WinChipC6:
3062 case CK_WinChip2:
3063 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003064 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003065 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003066 case CK_PentiumMMX:
3067 Builder.defineMacro("__pentium_mmx__");
3068 Builder.defineMacro("__tune_pentium_mmx__");
3069 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003070 case CK_i586:
3071 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003072 defineCPUMacros(Builder, "i586");
3073 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003074 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003075 case CK_Pentium3:
3076 case CK_Pentium3M:
3077 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003078 Builder.defineMacro("__tune_pentium3__");
3079 // Fallthrough
3080 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003081 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003082 Builder.defineMacro("__tune_pentium2__");
3083 // Fallthrough
3084 case CK_PentiumPro:
3085 Builder.defineMacro("__tune_i686__");
3086 Builder.defineMacro("__tune_pentiumpro__");
3087 // Fallthrough
3088 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003089 Builder.defineMacro("__i686");
3090 Builder.defineMacro("__i686__");
3091 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3092 Builder.defineMacro("__pentiumpro");
3093 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003094 break;
3095 case CK_Pentium4:
3096 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003097 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003098 break;
3099 case CK_Yonah:
3100 case CK_Prescott:
3101 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003102 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003103 break;
3104 case CK_Core2:
3105 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003106 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003107 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003108 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003109 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003110 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003111 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003112 defineCPUMacros(Builder, "slm");
3113 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003114 case CK_Nehalem:
3115 case CK_Westmere:
3116 case CK_SandyBridge:
3117 case CK_IvyBridge:
3118 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003119 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003120 // FIXME: Historically, we defined this legacy name, it would be nice to
3121 // remove it at some point. We've never exposed fine-grained names for
3122 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003123 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003124 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003125 case CK_Skylake:
3126 // FIXME: Historically, we defined this legacy name, it would be nice to
3127 // remove it at some point. This is the only fine-grained CPU macro in the
3128 // main intel CPU line, and it would be better to not have these and force
3129 // people to use ISA macros.
3130 defineCPUMacros(Builder, "skx");
3131 break;
Craig Topper449314e2013-08-20 07:09:39 +00003132 case CK_KNL:
3133 defineCPUMacros(Builder, "knl");
3134 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003135 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003136 Builder.defineMacro("__k6_2__");
3137 Builder.defineMacro("__tune_k6_2__");
3138 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003139 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003140 if (CPU != CK_K6_2) { // In case of fallthrough
3141 // FIXME: GCC may be enabling these in cases where some other k6
3142 // architecture is specified but -m3dnow is explicitly provided. The
3143 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003144 Builder.defineMacro("__k6_3__");
3145 Builder.defineMacro("__tune_k6_3__");
3146 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003147 // Fallthrough
3148 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003149 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003150 break;
3151 case CK_Athlon:
3152 case CK_AthlonThunderbird:
3153 case CK_Athlon4:
3154 case CK_AthlonXP:
3155 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003156 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003157 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003158 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003159 Builder.defineMacro("__tune_athlon_sse__");
3160 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003161 break;
3162 case CK_K8:
3163 case CK_K8SSE3:
3164 case CK_x86_64:
3165 case CK_Opteron:
3166 case CK_OpteronSSE3:
3167 case CK_Athlon64:
3168 case CK_Athlon64SSE3:
3169 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003170 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003171 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003172 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003173 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003174 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003175 case CK_BTVER1:
3176 defineCPUMacros(Builder, "btver1");
3177 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003178 case CK_BTVER2:
3179 defineCPUMacros(Builder, "btver2");
3180 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003181 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003182 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003183 break;
3184 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003185 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003186 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003187 case CK_BDVER3:
3188 defineCPUMacros(Builder, "bdver3");
3189 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003190 case CK_BDVER4:
3191 defineCPUMacros(Builder, "bdver4");
3192 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003193 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003194 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003195 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003196 }
Chris Lattner96e43572009-03-02 22:40:39 +00003197
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003198 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003199 Builder.defineMacro("__REGISTER_PREFIX__", "");
3200
Chris Lattner6df41af2009-04-19 17:32:33 +00003201 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3202 // functions in glibc header files that use FP Stack inline asm which the
3203 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003204 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003205
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003206 if (HasAES)
3207 Builder.defineMacro("__AES__");
3208
Craig Topper3f122a72012-05-31 05:18:48 +00003209 if (HasPCLMUL)
3210 Builder.defineMacro("__PCLMUL__");
3211
Craig Topper22967d42011-12-25 05:06:45 +00003212 if (HasLZCNT)
3213 Builder.defineMacro("__LZCNT__");
3214
Benjamin Kramer1e250392012-07-07 09:39:18 +00003215 if (HasRDRND)
3216 Builder.defineMacro("__RDRND__");
3217
Craig Topper8c7f2512014-11-03 06:51:41 +00003218 if (HasFSGSBASE)
3219 Builder.defineMacro("__FSGSBASE__");
3220
Craig Topper22967d42011-12-25 05:06:45 +00003221 if (HasBMI)
3222 Builder.defineMacro("__BMI__");
3223
3224 if (HasBMI2)
3225 Builder.defineMacro("__BMI2__");
3226
Craig Topper1de83482011-12-29 16:10:46 +00003227 if (HasPOPCNT)
3228 Builder.defineMacro("__POPCNT__");
3229
Michael Liao625a8752012-11-10 05:17:46 +00003230 if (HasRTM)
3231 Builder.defineMacro("__RTM__");
3232
Michael Liao74f4eaf2013-03-26 17:52:08 +00003233 if (HasPRFCHW)
3234 Builder.defineMacro("__PRFCHW__");
3235
Michael Liaoffaae352013-03-29 05:17:55 +00003236 if (HasRDSEED)
3237 Builder.defineMacro("__RDSEED__");
3238
Robert Khasanov50e6f582014-09-19 09:53:48 +00003239 if (HasADX)
3240 Builder.defineMacro("__ADX__");
3241
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003242 if (HasTBM)
3243 Builder.defineMacro("__TBM__");
3244
Rafael Espindolae62e2792013-08-20 13:44:29 +00003245 switch (XOPLevel) {
3246 case XOP:
3247 Builder.defineMacro("__XOP__");
3248 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003249 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003250 case SSE4A:
3251 Builder.defineMacro("__SSE4A__");
3252 case NoXOP:
3253 break;
3254 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003255
Craig Topperbba778b2012-06-03 21:46:30 +00003256 if (HasFMA)
3257 Builder.defineMacro("__FMA__");
3258
Manman Rena45358c2012-10-11 00:59:55 +00003259 if (HasF16C)
3260 Builder.defineMacro("__F16C__");
3261
Craig Topper679b53a2013-08-21 05:29:10 +00003262 if (HasAVX512CD)
3263 Builder.defineMacro("__AVX512CD__");
3264 if (HasAVX512ER)
3265 Builder.defineMacro("__AVX512ER__");
3266 if (HasAVX512PF)
3267 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003268 if (HasAVX512DQ)
3269 Builder.defineMacro("__AVX512DQ__");
3270 if (HasAVX512BW)
3271 Builder.defineMacro("__AVX512BW__");
3272 if (HasAVX512VL)
3273 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003274
Ben Langmuir58078d02013-09-19 13:22:04 +00003275 if (HasSHA)
3276 Builder.defineMacro("__SHA__");
3277
Craig Toppere33f51f2015-10-16 06:22:36 +00003278 if (HasFXSR)
3279 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003280 if (HasXSAVE)
3281 Builder.defineMacro("__XSAVE__");
3282 if (HasXSAVEOPT)
3283 Builder.defineMacro("__XSAVEOPT__");
3284 if (HasXSAVEC)
3285 Builder.defineMacro("__XSAVEC__");
3286 if (HasXSAVES)
3287 Builder.defineMacro("__XSAVES__");
3288
Nick Lewycky50e8f482013-10-05 20:14:27 +00003289 if (HasCX16)
3290 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3291
Chris Lattner96e43572009-03-02 22:40:39 +00003292 // Each case falls through to the previous one here.
3293 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003294 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003295 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003296 case AVX2:
3297 Builder.defineMacro("__AVX2__");
3298 case AVX:
3299 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003300 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003301 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003302 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003303 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003304 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003305 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003306 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003307 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003308 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003309 Builder.defineMacro("__SSE2__");
3310 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003311 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003312 Builder.defineMacro("__SSE__");
3313 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003314 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003315 break;
3316 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003317
Derek Schuffc7dd7222012-10-11 15:52:22 +00003318 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003319 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003320 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003321 case AVX2:
3322 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003323 case SSE42:
3324 case SSE41:
3325 case SSSE3:
3326 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003327 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003328 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003329 break;
3330 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003331 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003332 break;
3333 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003334 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003335 }
3336 }
3337
Anders Carlssone437c682010-01-27 03:47:49 +00003338 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003339 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003340 case AMD3DNowAthlon:
3341 Builder.defineMacro("__3dNOW_A__");
3342 case AMD3DNow:
3343 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003344 case MMX:
3345 Builder.defineMacro("__MMX__");
3346 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003347 break;
3348 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003349
3350 if (CPU >= CK_i486) {
3351 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3352 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3353 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3354 }
3355 if (CPU >= CK_i586)
3356 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003357}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003358
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003359bool X86TargetInfo::hasFeature(StringRef Feature) const {
3360 return llvm::StringSwitch<bool>(Feature)
3361 .Case("aes", HasAES)
3362 .Case("avx", SSELevel >= AVX)
3363 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003364 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003365 .Case("avx512cd", HasAVX512CD)
3366 .Case("avx512er", HasAVX512ER)
3367 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003368 .Case("avx512dq", HasAVX512DQ)
3369 .Case("avx512bw", HasAVX512BW)
3370 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003371 .Case("bmi", HasBMI)
3372 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003373 .Case("cx16", HasCX16)
3374 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003375 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003376 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003377 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003378 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003379 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003380 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3381 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3382 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003383 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003384 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003385 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003386 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003387 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003388 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003389 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003390 .Case("sse", SSELevel >= SSE1)
3391 .Case("sse2", SSELevel >= SSE2)
3392 .Case("sse3", SSELevel >= SSE3)
3393 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003394 .Case("sse4.1", SSELevel >= SSE41)
3395 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003396 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003397 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003398 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003399 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3400 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003401 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003402 .Case("xsave", HasXSAVE)
3403 .Case("xsavec", HasXSAVEC)
3404 .Case("xsaves", HasXSAVES)
3405 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003406 .Default(false);
3407}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003408
Eric Christopherd9832702015-06-29 21:00:05 +00003409// We can't use a generic validation scheme for the features accepted here
3410// versus subtarget features accepted in the target attribute because the
3411// bitfield structure that's initialized in the runtime only supports the
3412// below currently rather than the full range of subtarget features. (See
3413// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3414bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3415 return llvm::StringSwitch<bool>(FeatureStr)
3416 .Case("cmov", true)
3417 .Case("mmx", true)
3418 .Case("popcnt", true)
3419 .Case("sse", true)
3420 .Case("sse2", true)
3421 .Case("sse3", true)
3422 .Case("sse4.1", true)
3423 .Case("sse4.2", true)
3424 .Case("avx", true)
3425 .Case("avx2", true)
3426 .Case("sse4a", true)
3427 .Case("fma4", true)
3428 .Case("xop", true)
3429 .Case("fma", true)
3430 .Case("avx512f", true)
3431 .Case("bmi", true)
3432 .Case("bmi2", true)
3433 .Default(false);
3434}
3435
Eli Friedman3fd920a2008-08-20 02:34:37 +00003436bool
Anders Carlsson58436352009-02-28 17:11:49 +00003437X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003438 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003439 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003440 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003441 // Constant constraints.
3442 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3443 // instructions.
3444 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3445 // x86_64 instructions.
3446 case 's':
3447 Info.setRequiresImmediate();
3448 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003449 case 'I':
3450 Info.setRequiresImmediate(0, 31);
3451 return true;
3452 case 'J':
3453 Info.setRequiresImmediate(0, 63);
3454 return true;
3455 case 'K':
3456 Info.setRequiresImmediate(-128, 127);
3457 return true;
3458 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003459 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003460 return true;
3461 case 'M':
3462 Info.setRequiresImmediate(0, 3);
3463 return true;
3464 case 'N':
3465 Info.setRequiresImmediate(0, 255);
3466 return true;
3467 case 'O':
3468 Info.setRequiresImmediate(0, 127);
3469 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003470 // Register constraints.
3471 case 'Y': // 'Y' is the first character for several 2-character constraints.
3472 // Shift the pointer to the second character of the constraint.
3473 Name++;
3474 switch (*Name) {
3475 default:
3476 return false;
3477 case '0': // First SSE register.
3478 case 't': // Any SSE register, when SSE2 is enabled.
3479 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3480 case 'm': // Any MMX register, when inter-unit moves enabled.
3481 Info.setAllowsRegister();
3482 return true;
3483 }
3484 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003485 // Constraint 'f' cannot be used for output operands.
3486 if (Info.ConstraintStr[0] == '=')
3487 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003488 Info.setAllowsRegister();
3489 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003490 case 'a': // eax.
3491 case 'b': // ebx.
3492 case 'c': // ecx.
3493 case 'd': // edx.
3494 case 'S': // esi.
3495 case 'D': // edi.
3496 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003497 case 't': // Top of floating point stack.
3498 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003499 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003500 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003501 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003502 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003503 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3504 case 'l': // "Index" registers: any general register that can be used as an
3505 // index in a base+index memory access.
3506 Info.setAllowsRegister();
3507 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003508 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003509 case 'C': // SSE floating point constant.
3510 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003511 return true;
3512 }
3513}
3514
Akira Hatanaka974131e2014-09-18 18:17:18 +00003515bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3516 unsigned Size) const {
3517 // Strip off constraint modifiers.
3518 while (Constraint[0] == '=' ||
3519 Constraint[0] == '+' ||
3520 Constraint[0] == '&')
3521 Constraint = Constraint.substr(1);
3522
3523 return validateOperandSize(Constraint, Size);
3524}
3525
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003526bool X86TargetInfo::validateInputSize(StringRef Constraint,
3527 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003528 return validateOperandSize(Constraint, Size);
3529}
3530
3531bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3532 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003533 switch (Constraint[0]) {
3534 default: break;
3535 case 'y':
3536 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003537 case 'f':
3538 case 't':
3539 case 'u':
3540 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003541 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003542 if (SSELevel >= AVX512F)
3543 // 512-bit zmm registers can be used if target supports AVX512F.
3544 return Size <= 512U;
3545 else if (SSELevel >= AVX)
3546 // 256-bit ymm registers can be used if target supports AVX.
3547 return Size <= 256U;
3548 return Size <= 128U;
3549 case 'Y':
3550 // 'Y' is the first character for several 2-character constraints.
3551 switch (Constraint[1]) {
3552 default: break;
3553 case 'm':
3554 // 'Ym' is synonymous with 'y'.
3555 return Size <= 64;
3556 case 'i':
3557 case 't':
3558 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3559 if (SSELevel >= AVX512F)
3560 return Size <= 512U;
3561 else if (SSELevel >= AVX)
3562 return Size <= 256U;
3563 return SSELevel >= SSE2 && Size <= 128U;
3564 }
3565
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003566 }
3567
3568 return true;
3569}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003570
Eli Friedman3fd920a2008-08-20 02:34:37 +00003571std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003572X86TargetInfo::convertConstraint(const char *&Constraint) const {
3573 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003574 case 'a': return std::string("{ax}");
3575 case 'b': return std::string("{bx}");
3576 case 'c': return std::string("{cx}");
3577 case 'd': return std::string("{dx}");
3578 case 'S': return std::string("{si}");
3579 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003580 case 'p': // address
3581 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003582 case 't': // top of floating point stack.
3583 return std::string("{st}");
3584 case 'u': // second from top of floating point stack.
3585 return std::string("{st(1)}"); // second from top of floating point stack.
3586 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003587 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003588 }
3589}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003590
Eli Friedman3fd920a2008-08-20 02:34:37 +00003591// X86-32 generic target
3592class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003593public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003594 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003595 DoubleAlign = LongLongAlign = 32;
3596 LongDoubleWidth = 96;
3597 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003598 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003599 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003600 SizeType = UnsignedInt;
3601 PtrDiffType = SignedInt;
3602 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003603 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003604
3605 // Use fpret for all types.
3606 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3607 (1 << TargetInfo::Double) |
3608 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003609
3610 // x86-32 has atomics up to 8 bytes
3611 // FIXME: Check that we actually have cmpxchg8b before setting
3612 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3613 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003614 }
Craig Topper3164f332014-03-11 03:39:26 +00003615 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003616 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003617 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003618
Craig Topper3164f332014-03-11 03:39:26 +00003619 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003620 if (RegNo == 0) return 0;
3621 if (RegNo == 1) return 2;
3622 return -1;
3623 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003624 bool validateOperandSize(StringRef Constraint,
3625 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003626 switch (Constraint[0]) {
3627 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003628 case 'R':
3629 case 'q':
3630 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003631 case 'a':
3632 case 'b':
3633 case 'c':
3634 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003635 case 'S':
3636 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003637 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003638 case 'A':
3639 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003640 }
3641
Akira Hatanaka974131e2014-09-18 18:17:18 +00003642 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003643 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003644};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003645
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003646class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3647public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003648 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3649 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003650
Craig Topper3164f332014-03-11 03:39:26 +00003651 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003652 unsigned Major, Minor, Micro;
3653 getTriple().getOSVersion(Major, Minor, Micro);
3654 // New NetBSD uses the default rounding mode.
3655 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3656 return X86_32TargetInfo::getFloatEvalMethod();
3657 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003658 return 1;
3659 }
3660};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003661
Eli Friedmane3aa4542009-07-05 18:47:56 +00003662class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3663public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003664 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3665 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003666 SizeType = UnsignedLong;
3667 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003668 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003669 }
3670};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003671
Eli Friedman9fa28852012-08-08 23:57:20 +00003672class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3673public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003674 BitrigI386TargetInfo(const llvm::Triple &Triple)
3675 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003676 SizeType = UnsignedLong;
3677 IntPtrType = SignedLong;
3678 PtrDiffType = SignedLong;
3679 }
3680};
Eli Friedman9fa28852012-08-08 23:57:20 +00003681
Torok Edwinb2b37c62009-06-30 17:10:35 +00003682class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003683public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003684 DarwinI386TargetInfo(const llvm::Triple &Triple)
3685 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003686 LongDoubleWidth = 128;
3687 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003688 SuitableAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003689 SizeType = UnsignedLong;
3690 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003691 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003692 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003693 }
3694
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003695 bool handleTargetFeatures(std::vector<std::string> &Features,
3696 DiagnosticsEngine &Diags) override {
3697 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3698 Diags))
3699 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003700 // We now know the features we have: we can decide how to align vectors.
3701 MaxVectorAlign =
3702 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003703 return true;
3704 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003705};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003706
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003707// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003708class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003709public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003710 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3711 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003712 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003713 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003714 bool IsWinCOFF =
3715 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003716 DataLayoutString = IsWinCOFF
3717 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3718 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003719 }
Craig Topper3164f332014-03-11 03:39:26 +00003720 void getTargetDefines(const LangOptions &Opts,
3721 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003722 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3723 }
3724};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003725
3726// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003727class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003728public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003729 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003730 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003731 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003732 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3733 }
Craig Topper3164f332014-03-11 03:39:26 +00003734 void getTargetDefines(const LangOptions &Opts,
3735 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003736 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3737 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3738 // The value of the following reflects processor type.
3739 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3740 // We lost the original triple, so we use the default.
3741 Builder.defineMacro("_M_IX86", "600");
3742 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003743};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003744
David Majnemerae1ed0e2015-05-28 04:36:18 +00003745static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003746 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3747 // supports __declspec natively under -fms-extensions, but we define a no-op
3748 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003749 if (Opts.MicrosoftExt)
3750 Builder.defineMacro("__declspec", "__declspec");
3751 else
3752 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3753
3754 if (!Opts.MicrosoftExt) {
3755 // Provide macros for all the calling convention keywords. Provide both
3756 // single and double underscore prefixed variants. These are available on
3757 // x64 as well as x86, even though they have no effect.
3758 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3759 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003760 std::string GCCSpelling = "__attribute__((__";
3761 GCCSpelling += CC;
3762 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003763 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3764 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3765 }
3766 }
3767}
3768
David Majnemerae1ed0e2015-05-28 04:36:18 +00003769static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3770 Builder.defineMacro("__MSVCRT__");
3771 Builder.defineMacro("__MINGW32__");
3772 addCygMingDefines(Opts, Builder);
3773}
3774
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003775// x86-32 MinGW target
3776class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3777public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003778 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003779 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003780 void getTargetDefines(const LangOptions &Opts,
3781 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003782 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003783 DefineStd(Builder, "WIN32", Opts);
3784 DefineStd(Builder, "WINNT", Opts);
3785 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003786 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003787 }
3788};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003789
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003790// x86-32 Cygwin target
3791class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3792public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003793 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3794 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003795 TLSSupported = false;
3796 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003797 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003798 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 +00003799 }
Craig Topper3164f332014-03-11 03:39:26 +00003800 void getTargetDefines(const LangOptions &Opts,
3801 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003802 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003803 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003804 Builder.defineMacro("__CYGWIN__");
3805 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003806 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003807 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003808 if (Opts.CPlusPlus)
3809 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003810 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003811};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003812
Chris Lattnerb986aba2010-04-11 19:29:39 +00003813// x86-32 Haiku target
3814class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3815public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003816 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003817 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003818 IntPtrType = SignedLong;
3819 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003820 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003821 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003822 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003823 }
Craig Topper3164f332014-03-11 03:39:26 +00003824 void getTargetDefines(const LangOptions &Opts,
3825 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003826 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3827 Builder.defineMacro("__INTEL__");
3828 Builder.defineMacro("__HAIKU__");
3829 }
3830};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003831
Douglas Gregor9fabd852011-07-01 22:41:14 +00003832// RTEMS Target
3833template<typename Target>
3834class RTEMSTargetInfo : public OSTargetInfo<Target> {
3835protected:
Craig Topper3164f332014-03-11 03:39:26 +00003836 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3837 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003838 // RTEMS defines; list based off of gcc output
3839
Douglas Gregor9fabd852011-07-01 22:41:14 +00003840 Builder.defineMacro("__rtems__");
3841 Builder.defineMacro("__ELF__");
3842 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003843
Douglas Gregor9fabd852011-07-01 22:41:14 +00003844public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003845 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3846 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003847
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003848 switch (Triple.getArch()) {
3849 default:
3850 case llvm::Triple::x86:
3851 // this->MCountName = ".mcount";
3852 break;
3853 case llvm::Triple::mips:
3854 case llvm::Triple::mipsel:
3855 case llvm::Triple::ppc:
3856 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003857 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003858 // this->MCountName = "_mcount";
3859 break;
3860 case llvm::Triple::arm:
3861 // this->MCountName = "__mcount";
3862 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003863 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003864 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003865};
3866
Douglas Gregor9fabd852011-07-01 22:41:14 +00003867// x86-32 RTEMS target
3868class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3869public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003870 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003871 SizeType = UnsignedLong;
3872 IntPtrType = SignedLong;
3873 PtrDiffType = SignedLong;
3874 this->UserLabelPrefix = "";
3875 }
Craig Topper3164f332014-03-11 03:39:26 +00003876 void getTargetDefines(const LangOptions &Opts,
3877 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003878 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3879 Builder.defineMacro("__INTEL__");
3880 Builder.defineMacro("__rtems__");
3881 }
3882};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003883
Eli Friedman3fd920a2008-08-20 02:34:37 +00003884// x86-64 generic target
3885class X86_64TargetInfo : public X86TargetInfo {
3886public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003887 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003888 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003889 bool IsWinCOFF =
3890 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003891 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003892 LongDoubleWidth = 128;
3893 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003894 LargeArrayMinWidth = 128;
3895 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003896 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003897 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3898 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3899 IntPtrType = IsX32 ? SignedInt : SignedLong;
3900 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003901 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003902 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003903
Eric Christopher917e9522014-11-18 22:36:15 +00003904 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003905 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3906 : IsWinCOFF
3907 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3908 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003909
3910 // Use fpret only for long double.
3911 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003912
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003913 // Use fp2ret for _Complex long double.
3914 ComplexLongDoubleUsesFP2Ret = true;
3915
Charles Davisc7d5c942015-09-17 20:55:33 +00003916 // Make __builtin_ms_va_list available.
3917 HasBuiltinMSVaList = true;
3918
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003919 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003920 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003921 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003922 }
Craig Topper3164f332014-03-11 03:39:26 +00003923 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003924 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003925 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003926
Craig Topper3164f332014-03-11 03:39:26 +00003927 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003928 if (RegNo == 0) return 0;
3929 if (RegNo == 1) return 1;
3930 return -1;
3931 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003932
Craig Topper3164f332014-03-11 03:39:26 +00003933 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003934 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003935 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003936 CC == CC_IntelOclBicc ||
3937 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003938 }
3939
Craig Topper3164f332014-03-11 03:39:26 +00003940 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003941 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003942 }
3943
Pavel Chupinfd223e12014-08-04 12:39:43 +00003944 // for x32 we need it here explicitly
3945 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003946};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003947
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003948// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003949class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003950public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003951 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3952 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003953 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003954 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003955 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003956 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003957 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003958 SizeType = UnsignedLongLong;
3959 PtrDiffType = SignedLongLong;
3960 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003961 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003962 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003963
Craig Topper3164f332014-03-11 03:39:26 +00003964 void getTargetDefines(const LangOptions &Opts,
3965 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003966 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003967 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003968 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003969
Craig Topper3164f332014-03-11 03:39:26 +00003970 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003971 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003972 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003973
Craig Topper3164f332014-03-11 03:39:26 +00003974 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003975 switch (CC) {
3976 case CC_X86StdCall:
3977 case CC_X86ThisCall:
3978 case CC_X86FastCall:
3979 return CCCR_Ignore;
3980 case CC_C:
3981 case CC_X86VectorCall:
3982 case CC_IntelOclBicc:
3983 case CC_X86_64SysV:
3984 return CCCR_OK;
3985 default:
3986 return CCCR_Warning;
3987 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003988 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003989};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003990
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003991// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003992class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003993public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003994 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003995 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003996 LongDoubleWidth = LongDoubleAlign = 64;
3997 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003998 }
Craig Topper3164f332014-03-11 03:39:26 +00003999 void getTargetDefines(const LangOptions &Opts,
4000 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004001 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4002 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004003 Builder.defineMacro("_M_X64", "100");
4004 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004005 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004006};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004007
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004008// x86-64 MinGW target
4009class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4010public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004011 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Yaron Keren480bc9f2015-08-20 21:51:46 +00004012 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00004013 void getTargetDefines(const LangOptions &Opts,
4014 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004015 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004016 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004017 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004018 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004019
4020 // GCC defines this macro when it is using __gxx_personality_seh0.
4021 if (!Opts.SjLjExceptions)
4022 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004023 }
4024};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004025
Yaron Kerend030d112015-07-22 17:38:19 +00004026// x86-64 Cygwin target
4027class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4028public:
4029 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4030 : X86_64TargetInfo(Triple) {
4031 TLSSupported = false;
4032 WCharType = UnsignedShort;
4033 }
4034 void getTargetDefines(const LangOptions &Opts,
4035 MacroBuilder &Builder) const override {
4036 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4037 Builder.defineMacro("__x86_64__");
4038 Builder.defineMacro("__CYGWIN__");
4039 Builder.defineMacro("__CYGWIN64__");
4040 addCygMingDefines(Opts, Builder);
4041 DefineStd(Builder, "unix", Opts);
4042 if (Opts.CPlusPlus)
4043 Builder.defineMacro("_GNU_SOURCE");
4044
4045 // GCC defines this macro when it is using __gxx_personality_seh0.
4046 if (!Opts.SjLjExceptions)
4047 Builder.defineMacro("__SEH__");
4048 }
4049};
4050
Eli Friedman2857ccb2009-07-01 03:36:11 +00004051class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4052public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004053 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4054 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004055 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004056 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4057 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004058 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004059 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004060 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004061 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004062
4063 bool handleTargetFeatures(std::vector<std::string> &Features,
4064 DiagnosticsEngine &Diags) override {
4065 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4066 Diags))
4067 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004068 // We now know the features we have: we can decide how to align vectors.
4069 MaxVectorAlign =
4070 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004071 return true;
4072 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004073};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004074
Eli Friedman245f2292009-07-05 22:31:18 +00004075class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4076public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004077 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4078 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004079 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004080 Int64Type = SignedLongLong;
4081 }
4082};
Eli Friedman245f2292009-07-05 22:31:18 +00004083
Eli Friedman9fa28852012-08-08 23:57:20 +00004084class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4085public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004086 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4087 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4088 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004089 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004090 }
4091};
Tim Northover9bb857a2013-01-31 12:13:10 +00004092
Eli Friedmanf05b7722008-08-20 07:44:10 +00004093class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004094 // Possible FPU choices.
4095 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004096 VFP2FPU = (1 << 0),
4097 VFP3FPU = (1 << 1),
4098 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004099 NeonFPU = (1 << 3),
4100 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004101 };
4102
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004103 // Possible HWDiv features.
4104 enum HWDivMode {
4105 HWDivThumb = (1 << 0),
4106 HWDivARM = (1 << 1)
4107 };
4108
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004109 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004110 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004111 }
4112
4113 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4114 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004115
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004116 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004117
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004118 StringRef CPUProfile;
4119 StringRef CPUAttr;
4120
Rafael Espindolaeb265472013-08-21 21:59:03 +00004121 enum {
4122 FP_Default,
4123 FP_VFP,
4124 FP_Neon
4125 } FPMath;
4126
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004127 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004128 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004129 unsigned ArchProfile;
4130 unsigned ArchVersion;
4131
Bernard Ogdenda13af32013-10-24 18:32:51 +00004132 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004133
Logan Chien57086ce2012-10-10 06:56:20 +00004134 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004135 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004136
4137 // Initialized via features.
4138 unsigned SoftFloat : 1;
4139 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004140
Bernard Ogden18b57012013-10-29 09:47:51 +00004141 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004142 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004143 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004144 unsigned Unaligned : 1;
4145
4146 enum {
4147 LDREX_B = (1 << 0), /// byte (8-bit)
4148 LDREX_H = (1 << 1), /// half (16-bit)
4149 LDREX_W = (1 << 2), /// word (32-bit)
4150 LDREX_D = (1 << 3), /// double (64-bit)
4151 };
4152
4153 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004154
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004155 // ACLE 6.5.1 Hardware floating point
4156 enum {
4157 HW_FP_HP = (1 << 1), /// half (16-bit)
4158 HW_FP_SP = (1 << 2), /// single (32-bit)
4159 HW_FP_DP = (1 << 3), /// double (64-bit)
4160 };
4161 uint32_t HW_FP;
4162
Chris Lattner5cc15e02010-03-03 19:03:45 +00004163 static const Builtin::Info BuiltinInfo[];
4164
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004165 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004166 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004167
4168 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004169 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004170
Renato Golin9ba39232015-02-27 16:35:48 +00004171 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4172 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4173 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004174 SizeType = UnsignedLong;
4175 else
4176 SizeType = UnsignedInt;
4177
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004178 switch (T.getOS()) {
4179 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004180 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004181 break;
4182 case llvm::Triple::Win32:
4183 WCharType = UnsignedShort;
4184 break;
4185 case llvm::Triple::Linux:
4186 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004187 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4188 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004189 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004190 }
4191
4192 UseBitFieldTypeAlignment = true;
4193
4194 ZeroLengthBitfieldBoundary = 0;
4195
Tim Northover147cd2f2014-10-14 22:12:21 +00004196 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4197 // so set preferred for small types to 32.
4198 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004199 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004200 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4201 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4202 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004203 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004204 DataLayoutString = "e"
4205 "-m:w"
4206 "-p:32:32"
4207 "-i64:64"
4208 "-v128:64:128"
4209 "-a:0:32"
4210 "-n32"
4211 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004212 } else if (T.isOSNaCl()) {
4213 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004214 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004215 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004216 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004217 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4218 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004219 }
4220
4221 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004222 }
4223
4224 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004225 const llvm::Triple &T = getTriple();
4226
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004227 IsAAPCS = false;
4228
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004229 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004230
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004231 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004232 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004233 SizeType = UnsignedInt;
4234 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004235 SizeType = UnsignedLong;
4236
4237 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4238 WCharType = SignedInt;
4239
4240 // Do not respect the alignment of bit-field types when laying out
4241 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4242 UseBitFieldTypeAlignment = false;
4243
4244 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4245 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4246 /// gcc.
4247 ZeroLengthBitfieldBoundary = 32;
4248
Tim Northover147cd2f2014-10-14 22:12:21 +00004249 if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004250 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004251 BigEndian
4252 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4253 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4254 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004255 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004256 BigEndian
4257 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4258 : "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 +00004259
4260 // FIXME: Override "preferred align" for double and long long.
4261 }
4262
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004263 void setArchInfo() {
4264 StringRef ArchName = getTriple().getArchName();
4265
Renato Goline84b0002015-10-08 16:43:26 +00004266 ArchISA = llvm::ARM::parseArchISA(ArchName);
4267 CPU = llvm::ARM::getDefaultCPU(ArchName);
4268 unsigned AK = llvm::ARM::parseArch(ArchName);
4269 if (AK != llvm::ARM::AK_INVALID)
4270 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004271 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004272 }
4273
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004274 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004275 StringRef SubArch;
4276
4277 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004278 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004279 SubArch = llvm::ARM::getSubArch(ArchKind);
4280 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4281 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004282
4283 // cache CPU related strings
4284 CPUAttr = getCPUAttr();
4285 CPUProfile = getCPUProfile();
4286 }
4287
4288 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004289 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004290 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004291 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004292 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4293 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004294 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004295 if (ArchProfile == llvm::ARM::PK_M) {
4296 MaxAtomicPromoteWidth = 32;
4297 if (ShouldUseInlineAtomic)
4298 MaxAtomicInlineWidth = 32;
4299 }
4300 else {
4301 MaxAtomicPromoteWidth = 64;
4302 if (ShouldUseInlineAtomic)
4303 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004304 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004305 }
4306
4307 bool isThumb() const {
4308 return (ArchISA == llvm::ARM::IK_THUMB);
4309 }
4310
4311 bool supportsThumb() const {
4312 return CPUAttr.count('T') || ArchVersion >= 6;
4313 }
4314
4315 bool supportsThumb2() const {
4316 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4317 }
4318
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004319 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004320 // For most sub-arches, the build attribute CPU name is enough.
4321 // For Cortex variants, it's slightly different.
4322 switch(ArchKind) {
4323 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004324 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004325 case llvm::ARM::AK_ARMV6M:
4326 case llvm::ARM::AK_ARMV6SM:
4327 case llvm::ARM::AK_ARMV6HL:
4328 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004329 case llvm::ARM::AK_ARMV7S:
4330 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004331 case llvm::ARM::AK_ARMV7:
4332 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004333 case llvm::ARM::AK_ARMV7L:
4334 case llvm::ARM::AK_ARMV7HL:
4335 return "7A";
4336 case llvm::ARM::AK_ARMV7R:
4337 return "7R";
4338 case llvm::ARM::AK_ARMV7M:
4339 return "7M";
4340 case llvm::ARM::AK_ARMV7EM:
4341 return "7EM";
4342 case llvm::ARM::AK_ARMV8A:
4343 return "8A";
4344 case llvm::ARM::AK_ARMV8_1A:
4345 return "8_1A";
4346 }
4347 }
4348
4349 StringRef getCPUProfile() const {
4350 switch(ArchProfile) {
4351 case llvm::ARM::PK_A:
4352 return "A";
4353 case llvm::ARM::PK_R:
4354 return "R";
4355 case llvm::ARM::PK_M:
4356 return "M";
4357 default:
4358 return "";
4359 }
4360 }
4361
Chris Lattner17df24e2008-04-21 18:56:49 +00004362public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004363 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004364 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004365 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004366 BigEndian = IsBigEndian;
4367
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004368 switch (getTriple().getOS()) {
4369 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004370 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004371 break;
4372 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004373 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004374 break;
4375 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004376
Renato Goline84b0002015-10-08 16:43:26 +00004377 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004378 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004379
Chris Lattner1a8f3942010-04-23 16:29:58 +00004380 // {} in inline assembly are neon specifiers, not assembly variant
4381 // specifiers.
4382 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004383
Eric Christopher0e261882014-12-05 01:06:59 +00004384 // FIXME: This duplicates code from the driver that sets the -target-abi
4385 // option - this code is used if -target-abi isn't passed and should
4386 // be unified in some way.
4387 if (Triple.isOSBinFormatMachO()) {
4388 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4389 // the frontend matches that.
4390 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4391 Triple.getOS() == llvm::Triple::UnknownOS ||
4392 StringRef(CPU).startswith("cortex-m")) {
4393 setABI("aapcs");
4394 } else {
4395 setABI("apcs-gnu");
4396 }
4397 } else if (Triple.isOSWindows()) {
4398 // FIXME: this is invalid for WindowsCE
4399 setABI("aapcs");
4400 } else {
4401 // Select the default based on the platform.
4402 switch (Triple.getEnvironment()) {
4403 case llvm::Triple::Android:
4404 case llvm::Triple::GNUEABI:
4405 case llvm::Triple::GNUEABIHF:
4406 setABI("aapcs-linux");
4407 break;
4408 case llvm::Triple::EABIHF:
4409 case llvm::Triple::EABI:
4410 setABI("aapcs");
4411 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004412 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004413 setABI("apcs-gnu");
4414 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004415 default:
4416 if (Triple.getOS() == llvm::Triple::NetBSD)
4417 setABI("apcs-gnu");
4418 else
4419 setABI("aapcs");
4420 break;
4421 }
4422 }
John McCall86353412010-08-21 22:46:04 +00004423
4424 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004425 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004426
Renato Golin15b86152015-07-03 16:41:13 +00004427 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004428 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004429
James Molloya7139222012-03-12 09:14:10 +00004430 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004431 // the alignment of the zero-length bitfield is greater than the member
4432 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004433 // zero length bitfield.
4434 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004435 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004436
Alp Toker4925ba72014-06-07 23:30:42 +00004437 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004438
Craig Topper3164f332014-03-11 03:39:26 +00004439 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004440 ABI = Name;
4441
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004442 // The defaults (above) are for AAPCS, check if we need to change them.
4443 //
4444 // FIXME: We need support for -meabi... we could just mangle it into the
4445 // name.
4446 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004447 setABIAPCS();
4448 return true;
4449 }
4450 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4451 setABIAAPCS();
4452 return true;
4453 }
4454 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004455 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004456
Renato Golinf5c4dec2015-05-27 13:33:00 +00004457 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004458 bool
4459 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4460 StringRef CPU,
4461 const std::vector<std::string> &FeaturesVec) const override {
4462
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004463 std::vector<const char*> TargetFeatures;
4464
4465 // get default FPU features
4466 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU);
4467 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4468
4469 // get default Extension features
4470 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU);
4471 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4472
4473 for (const char *Feature : TargetFeatures)
4474 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004475 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004476
Eric Christopher007b0a02015-08-28 22:32:01 +00004477 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004478 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004479
Craig Topper3164f332014-03-11 03:39:26 +00004480 bool handleTargetFeatures(std::vector<std::string> &Features,
4481 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004482 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004483 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004484 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004485 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004486 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004487 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004488 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004489
Ranjeet Singhac08e532015-06-24 23:39:25 +00004490 // This does not diagnose illegal cases like having both
4491 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4492 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004493 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004494 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004495 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004496 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004497 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004498 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004499 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004500 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004501 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004502 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004503 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004504 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004505 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004506 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004507 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004508 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004509 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004510 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004511 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004512 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004513 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004514 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004515 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004516 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004517 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004518 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004519 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004520 Crypto = 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004521 } else if (Feature == "+t2dsp") {
4522 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004523 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004524 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004525 } else if (Feature == "+strict-align") {
4526 Unaligned = 0;
4527 } else if (Feature == "+fp16") {
4528 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004529 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004530 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004531 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004532
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004533 switch (ArchVersion) {
4534 case 6:
4535 if (ArchProfile == llvm::ARM::PK_M)
4536 LDREX = 0;
4537 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4538 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4539 else
4540 LDREX = LDREX_W;
4541 break;
4542 case 7:
4543 if (ArchProfile == llvm::ARM::PK_M)
4544 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4545 else
4546 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4547 break;
4548 case 8:
4549 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4550 }
4551
Rafael Espindolaeb265472013-08-21 21:59:03 +00004552 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4553 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4554 return false;
4555 }
4556
4557 if (FPMath == FP_Neon)
4558 Features.push_back("+neonfp");
4559 else if (FPMath == FP_VFP)
4560 Features.push_back("-neonfp");
4561
Daniel Dunbar893d4752009-12-19 04:15:38 +00004562 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004563 auto Feature =
4564 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4565 if (Feature != Features.end())
4566 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004567
Rafael Espindolaeb265472013-08-21 21:59:03 +00004568 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004569 }
4570
Craig Topper3164f332014-03-11 03:39:26 +00004571 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004572 return llvm::StringSwitch<bool>(Feature)
4573 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004574 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004575 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004576 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004577 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004578 .Case("hwdiv", HWDiv & HWDivThumb)
4579 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004580 .Default(false);
4581 }
Renato Golin15b86152015-07-03 16:41:13 +00004582
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004583 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004584 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004585 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004586
Renato Golin15b86152015-07-03 16:41:13 +00004587 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004588 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004589 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004590 CPU = Name;
4591 return true;
4592 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004593
Craig Topper3164f332014-03-11 03:39:26 +00004594 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004595
Craig Topper3164f332014-03-11 03:39:26 +00004596 void getTargetDefines(const LangOptions &Opts,
4597 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004598 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004599 Builder.defineMacro("__arm");
4600 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004601
Chris Lattnerecd49032009-03-02 22:27:17 +00004602 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004603 Builder.defineMacro("__REGISTER_PREFIX__", "");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004604 if (!CPUAttr.empty())
4605 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004606
4607 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004608 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004609 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004610
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004611 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004612 // ACLE 6.5.7 Crypto Extension
4613 if (Crypto)
4614 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4615 // ACLE 6.5.8 CRC32 Extension
4616 if (CRC)
4617 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4618 // ACLE 6.5.10 Numeric Maximum and Minimum
4619 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4620 // ACLE 6.5.9 Directed Rounding
4621 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004622 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004623
4624 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4625 // is not defined for the M-profile.
4626 // NOTE that the deffault profile is assumed to be 'A'
4627 if (CPUProfile.empty() || CPUProfile != "M")
4628 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4629
4630 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4631 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4632 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004633 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004634 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004635 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004636 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4637
4638 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4639 // instruction set such as ARM or Thumb.
4640 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4641
4642 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4643
4644 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004645 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004646 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004647
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004648 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004649 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004650 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004651
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004652 // ACLE 6.4.4 LDREX/STREX
4653 if (LDREX)
4654 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4655
4656 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004657 if (ArchVersion == 5 ||
4658 (ArchVersion == 6 && CPUProfile != "M") ||
4659 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004660 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4661
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004662 // ACLE 6.5.1 Hardware Floating Point
4663 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004664 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004665
Yi Konga44c4d72014-06-27 21:25:42 +00004666 // ACLE predefines.
4667 Builder.defineMacro("__ARM_ACLE", "200");
4668
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004669 // FP16 support (we currently only support IEEE format).
4670 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4671 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4672
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004673 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4674 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4675 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4676
Mike Stump9d54bd72009-04-08 02:07:04 +00004677 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004678
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004679 // FIXME: It's more complicated than this and we don't really support
4680 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004681 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004682 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004683 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004684
David Tweed8f676532012-10-25 13:33:01 +00004685 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004686 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004687 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4688 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004689 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004690 Builder.defineMacro("__ARM_PCS", "1");
4691
David Tweed8f676532012-10-25 13:33:01 +00004692 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004693 Builder.defineMacro("__ARM_PCS_VFP", "1");
4694 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004695
Daniel Dunbar893d4752009-12-19 04:15:38 +00004696 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004697 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004698
4699 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004700 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004701
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004702 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004703 Builder.defineMacro("__THUMBEL__");
4704 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004705 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004706 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004707 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004708
4709 // ACLE 6.4.9 32-bit SIMD instructions
4710 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4711 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4712
4713 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004714 if (((HWDiv & HWDivThumb) && isThumb()) ||
4715 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004716 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004717 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004718 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004719
4720 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004721 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004722
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004723 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004724 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004725 if (FPU & VFP2FPU)
4726 Builder.defineMacro("__ARM_VFPV2__");
4727 if (FPU & VFP3FPU)
4728 Builder.defineMacro("__ARM_VFPV3__");
4729 if (FPU & VFP4FPU)
4730 Builder.defineMacro("__ARM_VFPV4__");
4731 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004732
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004733 // This only gets set when Neon instructions are actually available, unlike
4734 // the VFP define, hence the soft float and arch check. This is subtly
4735 // different from gcc, we follow the intent which was that it should be set
4736 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004737 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004738 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004739 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004740 // current AArch32 NEON implementations do not support double-precision
4741 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004742 Builder.defineMacro("__ARM_NEON_FP",
4743 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004744 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004745
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004746 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4747 Opts.ShortWChar ? "2" : "4");
4748
4749 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4750 Opts.ShortEnums ? "1" : "4");
4751
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004752 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004753 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4754 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4755 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4756 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4757 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004758
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004759 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004760 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004761 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004762 }
4763
4764 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004765 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004766 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4767 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004768 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004769 }
4770
4771 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004772 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004773 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004774
4775 if (Opts.UnsafeFPMath)
4776 Builder.defineMacro("__ARM_FP_FAST", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004777 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004778
Craig Topper6c03a542015-10-19 04:51:35 +00004779 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4780 return llvm::makeArrayRef(BuiltinInfo,
4781 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00004782 }
Craig Topper3164f332014-03-11 03:39:26 +00004783 bool isCLZForZeroUndef() const override { return false; }
4784 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004785 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004786 }
Craig Topperf054e3a2015-10-19 03:52:27 +00004787 ArrayRef<const char *> getGCCRegNames() const override;
4788 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00004789 bool validateAsmConstraint(const char *&Name,
4790 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004791 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004792 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004793 case 'l': // r0-r7
4794 case 'h': // r8-r15
4795 case 'w': // VFP Floating point register single precision
4796 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004797 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004798 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004799 case 'I':
4800 case 'J':
4801 case 'K':
4802 case 'L':
4803 case 'M':
4804 // FIXME
4805 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004806 case 'Q': // A memory address that is a single base register.
4807 Info.setAllowsMemory();
4808 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004809 case 'U': // a memory reference...
4810 switch (Name[1]) {
4811 case 'q': // ...ARMV4 ldrsb
4812 case 'v': // ...VFP load/store (reg+constant offset)
4813 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004814 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004815 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004816 case 'n': // valid address for Neon doubleword vector load/store
4817 case 'm': // valid address for Neon element and structure load/store
4818 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004819 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004820 Info.setAllowsMemory();
4821 Name++;
4822 return true;
4823 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004824 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004825 return false;
4826 }
Craig Topper3164f332014-03-11 03:39:26 +00004827 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004828 std::string R;
4829 switch (*Constraint) {
4830 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004831 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004832 Constraint++;
4833 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004834 case 'p': // 'p' should be translated to 'r' by default.
4835 R = std::string("r");
4836 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004837 default:
4838 return std::string(1, *Constraint);
4839 }
4840 return R;
4841 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004842 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004843 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004844 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004845 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004846 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004847
Bill Wendling9d1ee112012-10-25 23:28:48 +00004848 // Strip off constraint modifiers.
4849 while (Constraint[0] == '=' ||
4850 Constraint[0] == '+' ||
4851 Constraint[0] == '&')
4852 Constraint = Constraint.substr(1);
4853
4854 switch (Constraint[0]) {
4855 default: break;
4856 case 'r': {
4857 switch (Modifier) {
4858 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004859 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004860 case 'q':
4861 // A register of size 32 cannot fit a vector type.
4862 return false;
4863 }
4864 }
4865 }
4866
4867 return true;
4868 }
Craig Topper3164f332014-03-11 03:39:26 +00004869 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004870 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004871 return "";
4872 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004873
Craig Topper3164f332014-03-11 03:39:26 +00004874 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004875 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4876 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004877
Craig Topper3164f332014-03-11 03:39:26 +00004878 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004879 if (RegNo == 0) return 0;
4880 if (RegNo == 1) return 1;
4881 return -1;
4882 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004883
4884 bool hasSjLjLowering() const override {
4885 return true;
4886 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004887};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004888
Rafael Espindolaeb265472013-08-21 21:59:03 +00004889bool ARMTargetInfo::setFPMath(StringRef Name) {
4890 if (Name == "neon") {
4891 FPMath = FP_Neon;
4892 return true;
4893 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4894 Name == "vfp4") {
4895 FPMath = FP_VFP;
4896 return true;
4897 }
4898 return false;
4899}
4900
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004901const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004902 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004903 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004904 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4905
4906 // Float registers
4907 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4908 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4909 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004910 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004911
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004912 // Double registers
4913 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4914 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004915 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4916 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004917
4918 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004919 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4920 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004921};
4922
Craig Topperf054e3a2015-10-19 03:52:27 +00004923ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
4924 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004925}
4926
4927const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004928 { { "a1" }, "r0" },
4929 { { "a2" }, "r1" },
4930 { { "a3" }, "r2" },
4931 { { "a4" }, "r3" },
4932 { { "v1" }, "r4" },
4933 { { "v2" }, "r5" },
4934 { { "v3" }, "r6" },
4935 { { "v4" }, "r7" },
4936 { { "v5" }, "r8" },
4937 { { "v6", "rfp" }, "r9" },
4938 { { "sl" }, "r10" },
4939 { { "fp" }, "r11" },
4940 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004941 { { "r13" }, "sp" },
4942 { { "r14" }, "lr" },
4943 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004944 // The S, D and Q registers overlap, but aren't really aliases; we
4945 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004946};
4947
Craig Topperf054e3a2015-10-19 03:52:27 +00004948ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
4949 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004950}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004951
4952const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00004953#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004954 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004955#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4956 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00004957#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004958
Craig Topper07d3b622015-08-07 05:14:44 +00004959#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004960 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004961#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004962 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004963#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4964 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004965#include "clang/Basic/BuiltinsARM.def"
4966};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004967
4968class ARMleTargetInfo : public ARMTargetInfo {
4969public:
4970 ARMleTargetInfo(const llvm::Triple &Triple)
4971 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004972 void getTargetDefines(const LangOptions &Opts,
4973 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004974 Builder.defineMacro("__ARMEL__");
4975 ARMTargetInfo::getTargetDefines(Opts, Builder);
4976 }
4977};
4978
4979class ARMbeTargetInfo : public ARMTargetInfo {
4980public:
4981 ARMbeTargetInfo(const llvm::Triple &Triple)
4982 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004983 void getTargetDefines(const LangOptions &Opts,
4984 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004985 Builder.defineMacro("__ARMEB__");
4986 Builder.defineMacro("__ARM_BIG_ENDIAN");
4987 ARMTargetInfo::getTargetDefines(Opts, Builder);
4988 }
4989};
Chris Lattner17df24e2008-04-21 18:56:49 +00004990
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004991class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4992 const llvm::Triple Triple;
4993public:
4994 WindowsARMTargetInfo(const llvm::Triple &Triple)
4995 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4996 TLSSupported = false;
4997 WCharType = UnsignedShort;
4998 SizeType = UnsignedInt;
4999 UserLabelPrefix = "";
5000 }
5001 void getVisualStudioDefines(const LangOptions &Opts,
5002 MacroBuilder &Builder) const {
5003 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5004
5005 // FIXME: this is invalid for WindowsCE
5006 Builder.defineMacro("_M_ARM_NT", "1");
5007 Builder.defineMacro("_M_ARMT", "_M_ARM");
5008 Builder.defineMacro("_M_THUMB", "_M_ARM");
5009
5010 assert((Triple.getArch() == llvm::Triple::arm ||
5011 Triple.getArch() == llvm::Triple::thumb) &&
5012 "invalid architecture for Windows ARM target info");
5013 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5014 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5015
5016 // TODO map the complete set of values
5017 // 31: VFPv3 40: VFPv4
5018 Builder.defineMacro("_M_ARM_FP", "31");
5019 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005020 BuiltinVaListKind getBuiltinVaListKind() const override {
5021 return TargetInfo::CharPtrBuiltinVaList;
5022 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005023 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5024 switch (CC) {
5025 case CC_X86StdCall:
5026 case CC_X86ThisCall:
5027 case CC_X86FastCall:
5028 case CC_X86VectorCall:
5029 return CCCR_Ignore;
5030 case CC_C:
5031 return CCCR_OK;
5032 default:
5033 return CCCR_Warning;
5034 }
5035 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005036};
5037
5038// Windows ARM + Itanium C++ ABI Target
5039class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5040public:
5041 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5042 : WindowsARMTargetInfo(Triple) {
5043 TheCXXABI.set(TargetCXXABI::GenericARM);
5044 }
5045
5046 void getTargetDefines(const LangOptions &Opts,
5047 MacroBuilder &Builder) const override {
5048 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5049
5050 if (Opts.MSVCCompat)
5051 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5052 }
5053};
5054
5055// Windows ARM, MS (C++) ABI
5056class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5057public:
5058 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5059 : WindowsARMTargetInfo(Triple) {
5060 TheCXXABI.set(TargetCXXABI::Microsoft);
5061 }
5062
5063 void getTargetDefines(const LangOptions &Opts,
5064 MacroBuilder &Builder) const override {
5065 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5066 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5067 }
5068};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005069
Yaron Keren321249c2015-07-15 13:32:23 +00005070// ARM MinGW target
5071class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5072public:
5073 MinGWARMTargetInfo(const llvm::Triple &Triple)
5074 : WindowsARMTargetInfo(Triple) {
5075 TheCXXABI.set(TargetCXXABI::GenericARM);
5076 }
5077
5078 void getTargetDefines(const LangOptions &Opts,
5079 MacroBuilder &Builder) const override {
5080 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5081 DefineStd(Builder, "WIN32", Opts);
5082 DefineStd(Builder, "WINNT", Opts);
5083 Builder.defineMacro("_ARM_");
5084 addMinGWDefines(Opts, Builder);
5085 }
5086};
5087
5088// ARM Cygwin target
5089class CygwinARMTargetInfo : public ARMleTargetInfo {
5090public:
5091 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5092 TLSSupported = false;
5093 WCharType = UnsignedShort;
5094 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005095 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005096 }
5097 void getTargetDefines(const LangOptions &Opts,
5098 MacroBuilder &Builder) const override {
5099 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5100 Builder.defineMacro("_ARM_");
5101 Builder.defineMacro("__CYGWIN__");
5102 Builder.defineMacro("__CYGWIN32__");
5103 DefineStd(Builder, "unix", Opts);
5104 if (Opts.CPlusPlus)
5105 Builder.defineMacro("_GNU_SOURCE");
5106 }
5107};
5108
Mike Stump11289f42009-09-09 15:08:12 +00005109class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005110 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005111protected:
Craig Topper3164f332014-03-11 03:39:26 +00005112 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5113 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005114 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005115 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005116
Torok Edwinb2b37c62009-06-30 17:10:35 +00005117public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005118 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005119 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005120 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005121 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005122 // FIXME: This should be based off of the target features in
5123 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005124 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005125
5126 // Darwin on iOS uses a variant of the ARM C++ ABI.
5127 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005128 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005129};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005130
Tim Northover573cbee2014-05-24 12:52:07 +00005131class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005132 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005133 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5134 static const char *const GCCRegNames[];
5135
James Molloy75f5f9e2014-04-16 15:33:48 +00005136 enum FPUModeEnum {
5137 FPUMode,
5138 NeonMode
5139 };
5140
5141 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005142 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005143 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005144 unsigned Unaligned;
James Molloy75f5f9e2014-04-16 15:33:48 +00005145
Tim Northovera2ee4332014-03-29 15:09:45 +00005146 static const Builtin::Info BuiltinInfo[];
5147
5148 std::string ABI;
5149
5150public:
Tim Northover573cbee2014-05-24 12:52:07 +00005151 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005152 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005153
5154 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5155 WCharType = SignedInt;
5156
5157 // NetBSD apparently prefers consistency across ARM targets to consistency
5158 // across 64-bit targets.
5159 Int64Type = SignedLongLong;
5160 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005161 } else {
5162 WCharType = UnsignedInt;
5163 Int64Type = SignedLong;
5164 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005165 }
5166
Tim Northovera2ee4332014-03-29 15:09:45 +00005167 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005168 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005169 MaxAtomicInlineWidth = 128;
5170 MaxAtomicPromoteWidth = 128;
5171
Tim Northovera6a19f12015-02-06 01:25:07 +00005172 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005173 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5174
Tim Northovera2ee4332014-03-29 15:09:45 +00005175 // {} in inline assembly are neon specifiers, not assembly variant
5176 // specifiers.
5177 NoAsmVariants = true;
5178
Tim Northover7ad87af2015-01-16 18:44:04 +00005179 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5180 // contributes to the alignment of the containing aggregate in the same way
5181 // a plain (non bit-field) member of that type would, without exception for
5182 // zero-sized or anonymous bit-fields."
5183 UseBitFieldTypeAlignment = true;
5184 UseZeroLengthBitfieldAlignment = true;
5185
Tim Northover573cbee2014-05-24 12:52:07 +00005186 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005187 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5188 }
5189
Alp Toker4925ba72014-06-07 23:30:42 +00005190 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005191 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005192 if (Name != "aapcs" && Name != "darwinpcs")
5193 return false;
5194
5195 ABI = Name;
5196 return true;
5197 }
5198
David Blaikie1cbb9712014-11-14 19:09:44 +00005199 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005200 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005201 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005202 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005203 .Case("cyclone", true)
5204 .Default(false);
5205 return CPUKnown;
5206 }
5207
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005208 void getTargetDefines(const LangOptions &Opts,
5209 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005210 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005211 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005212
5213 // Target properties.
5214 Builder.defineMacro("_LP64");
5215 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005216
5217 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5218 Builder.defineMacro("__ARM_ACLE", "200");
5219 Builder.defineMacro("__ARM_ARCH", "8");
5220 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5221
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005222 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005223 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005224 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005225
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005226 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5227 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5228 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5229 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005230 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005231 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5232 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005233
5234 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5235
5236 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005237 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005238
5239 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5240 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005241 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5242 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005243
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005244 if (Opts.UnsafeFPMath)
5245 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005246
5247 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5248
5249 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5250 Opts.ShortEnums ? "1" : "4");
5251
James Molloy75f5f9e2014-04-16 15:33:48 +00005252 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005253 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005254 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005255 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005256 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005257
Bradley Smith418c5932014-05-02 15:17:51 +00005258 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005259 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005260
James Molloy75f5f9e2014-04-16 15:33:48 +00005261 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005262 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5263
5264 if (Unaligned)
5265 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005266
5267 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5268 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5269 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5270 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5271 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005272 }
5273
Craig Topper6c03a542015-10-19 04:51:35 +00005274 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5275 return llvm::makeArrayRef(BuiltinInfo,
5276 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
Craig Topperf054e3a2015-10-19 03:52:27 +00005315 ArrayRef<const char *> getGCCRegNames() const override;
5316 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005317
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005318 bool validateAsmConstraint(const char *&Name,
5319 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005320 switch (*Name) {
5321 default:
5322 return false;
5323 case 'w': // Floating point and SIMD registers (V0-V31)
5324 Info.setAllowsRegister();
5325 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005326 case 'I': // Constant that can be used with an ADD instruction
5327 case 'J': // Constant that can be used with a SUB instruction
5328 case 'K': // Constant that can be used with a 32-bit logical instruction
5329 case 'L': // Constant that can be used with a 64-bit logical instruction
5330 case 'M': // Constant that can be used as a 32-bit MOV immediate
5331 case 'N': // Constant that can be used as a 64-bit MOV immediate
5332 case 'Y': // Floating point constant zero
5333 case 'Z': // Integer constant zero
5334 return true;
5335 case 'Q': // A memory reference with base register and no offset
5336 Info.setAllowsMemory();
5337 return true;
5338 case 'S': // A symbolic address
5339 Info.setAllowsRegister();
5340 return true;
5341 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005342 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5343 // Utf: A memory address suitable for ldp/stp in TF mode.
5344 // Usa: An absolute symbolic address.
5345 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5346 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005347 case 'z': // Zero register, wzr or xzr
5348 Info.setAllowsRegister();
5349 return true;
5350 case 'x': // Floating point and SIMD registers (V0-V15)
5351 Info.setAllowsRegister();
5352 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005353 }
5354 return false;
5355 }
5356
Akira Hatanaka987f1862014-08-22 06:05:21 +00005357 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005358 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005359 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005360 // Strip off constraint modifiers.
5361 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5362 Constraint = Constraint.substr(1);
5363
5364 switch (Constraint[0]) {
5365 default:
5366 return true;
5367 case 'z':
5368 case 'r': {
5369 switch (Modifier) {
5370 case 'x':
5371 case 'w':
5372 // For now assume that the person knows what they're
5373 // doing with the modifier.
5374 return true;
5375 default:
5376 // By default an 'r' constraint will be in the 'x'
5377 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005378 if (Size == 64)
5379 return true;
5380
5381 SuggestedModifier = "w";
5382 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005383 }
5384 }
5385 }
5386 }
5387
David Blaikie1cbb9712014-11-14 19:09:44 +00005388 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005389
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005390 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005391 if (RegNo == 0)
5392 return 0;
5393 if (RegNo == 1)
5394 return 1;
5395 return -1;
5396 }
5397};
5398
Tim Northover573cbee2014-05-24 12:52:07 +00005399const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005400 // 32-bit Integer registers
5401 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5402 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5403 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5404
5405 // 64-bit Integer registers
5406 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5407 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5408 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5409
5410 // 32-bit floating point regsisters
5411 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5412 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5413 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5414
5415 // 64-bit floating point regsisters
5416 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5417 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5418 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5419
5420 // Vector registers
5421 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5422 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5423 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5424};
5425
Craig Topperf054e3a2015-10-19 03:52:27 +00005426ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5427 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005428}
5429
Tim Northover573cbee2014-05-24 12:52:07 +00005430const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005431 { { "w31" }, "wsp" },
5432 { { "x29" }, "fp" },
5433 { { "x30" }, "lr" },
5434 { { "x31" }, "sp" },
5435 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5436 // don't want to substitute one of these for a different-sized one.
5437};
5438
Craig Topperf054e3a2015-10-19 03:52:27 +00005439ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5440 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005441}
5442
Tim Northover573cbee2014-05-24 12:52:07 +00005443const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005444#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005445 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005446#include "clang/Basic/BuiltinsNEON.def"
5447
5448#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005449 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005450#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005451};
James Molloy5e73df52014-04-16 15:06:20 +00005452
Tim Northover573cbee2014-05-24 12:52:07 +00005453class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005454 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005455 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005456 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005457 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005458 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005459 }
5460
5461public:
Tim Northover573cbee2014-05-24 12:52:07 +00005462 AArch64leTargetInfo(const llvm::Triple &Triple)
5463 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005464 BigEndian = false;
5465 }
5466 void getTargetDefines(const LangOptions &Opts,
5467 MacroBuilder &Builder) const override {
5468 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005469 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005470 }
5471};
5472
Tim Northover573cbee2014-05-24 12:52:07 +00005473class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005474 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005475 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005476 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005477 }
5478
5479public:
Tim Northover573cbee2014-05-24 12:52:07 +00005480 AArch64beTargetInfo(const llvm::Triple &Triple)
5481 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005482 void getTargetDefines(const LangOptions &Opts,
5483 MacroBuilder &Builder) const override {
5484 Builder.defineMacro("__AARCH64EB__");
5485 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5486 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005487 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005488 }
5489};
Tim Northovera2ee4332014-03-29 15:09:45 +00005490
Tim Northover573cbee2014-05-24 12:52:07 +00005491class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005492protected:
5493 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5494 MacroBuilder &Builder) const override {
5495 Builder.defineMacro("__AARCH64_SIMD__");
5496 Builder.defineMacro("__ARM64_ARCH_8__");
5497 Builder.defineMacro("__ARM_NEON__");
5498 Builder.defineMacro("__LITTLE_ENDIAN__");
5499 Builder.defineMacro("__REGISTER_PREFIX__", "");
5500 Builder.defineMacro("__arm64", "1");
5501 Builder.defineMacro("__arm64__", "1");
5502
5503 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5504 }
5505
Tim Northovera2ee4332014-03-29 15:09:45 +00005506public:
Tim Northover573cbee2014-05-24 12:52:07 +00005507 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5508 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005509 Int64Type = SignedLongLong;
5510 WCharType = SignedInt;
5511 UseSignedCharForObjCBool = false;
5512
Tim Northovera6a19f12015-02-06 01:25:07 +00005513 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005514 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5515
5516 TheCXXABI.set(TargetCXXABI::iOS64);
5517 }
5518
David Blaikie1cbb9712014-11-14 19:09:44 +00005519 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005520 return TargetInfo::CharPtrBuiltinVaList;
5521 }
5522};
Tim Northovera2ee4332014-03-29 15:09:45 +00005523
Tony Linthicum76329bf2011-12-12 21:14:55 +00005524// Hexagon abstract base class
5525class HexagonTargetInfo : public TargetInfo {
5526 static const Builtin::Info BuiltinInfo[];
5527 static const char * const GCCRegNames[];
5528 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5529 std::string CPU;
5530public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005531 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005532 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00005533 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005534
5535 // {} in inline assembly are packet specifiers, not assembly variant
5536 // specifiers.
5537 NoAsmVariants = true;
5538 }
5539
Craig Topper6c03a542015-10-19 04:51:35 +00005540 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5541 return llvm::makeArrayRef(BuiltinInfo,
5542 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005543 }
5544
Craig Topper3164f332014-03-11 03:39:26 +00005545 bool validateAsmConstraint(const char *&Name,
5546 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005547 return true;
5548 }
5549
Craig Topper3164f332014-03-11 03:39:26 +00005550 void getTargetDefines(const LangOptions &Opts,
5551 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005552
Craig Topper3164f332014-03-11 03:39:26 +00005553 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005554 return Feature == "hexagon";
5555 }
Craig Topper3164f332014-03-11 03:39:26 +00005556
5557 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005558 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005559 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005560 ArrayRef<const char *> getGCCRegNames() const override;
5561 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005562 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005563 return "";
5564 }
Sebastian Pop86500282012-01-13 20:37:10 +00005565
5566 static const char *getHexagonCPUSuffix(StringRef Name) {
5567 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005568 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005569 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005570 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005571 }
5572
Craig Topper3164f332014-03-11 03:39:26 +00005573 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005574 if (!getHexagonCPUSuffix(Name))
5575 return false;
5576
Tony Linthicum76329bf2011-12-12 21:14:55 +00005577 CPU = Name;
5578 return true;
5579 }
5580};
5581
5582void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5583 MacroBuilder &Builder) const {
5584 Builder.defineMacro("qdsp6");
5585 Builder.defineMacro("__qdsp6", "1");
5586 Builder.defineMacro("__qdsp6__", "1");
5587
5588 Builder.defineMacro("hexagon");
5589 Builder.defineMacro("__hexagon", "1");
5590 Builder.defineMacro("__hexagon__", "1");
5591
5592 if(CPU == "hexagonv1") {
5593 Builder.defineMacro("__HEXAGON_V1__");
5594 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5595 if(Opts.HexagonQdsp6Compat) {
5596 Builder.defineMacro("__QDSP6_V1__");
5597 Builder.defineMacro("__QDSP6_ARCH__", "1");
5598 }
5599 }
5600 else if(CPU == "hexagonv2") {
5601 Builder.defineMacro("__HEXAGON_V2__");
5602 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5603 if(Opts.HexagonQdsp6Compat) {
5604 Builder.defineMacro("__QDSP6_V2__");
5605 Builder.defineMacro("__QDSP6_ARCH__", "2");
5606 }
5607 }
5608 else if(CPU == "hexagonv3") {
5609 Builder.defineMacro("__HEXAGON_V3__");
5610 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5611 if(Opts.HexagonQdsp6Compat) {
5612 Builder.defineMacro("__QDSP6_V3__");
5613 Builder.defineMacro("__QDSP6_ARCH__", "3");
5614 }
5615 }
5616 else if(CPU == "hexagonv4") {
5617 Builder.defineMacro("__HEXAGON_V4__");
5618 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5619 if(Opts.HexagonQdsp6Compat) {
5620 Builder.defineMacro("__QDSP6_V4__");
5621 Builder.defineMacro("__QDSP6_ARCH__", "4");
5622 }
5623 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005624 else if(CPU == "hexagonv5") {
5625 Builder.defineMacro("__HEXAGON_V5__");
5626 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5627 if(Opts.HexagonQdsp6Compat) {
5628 Builder.defineMacro("__QDSP6_V5__");
5629 Builder.defineMacro("__QDSP6_ARCH__", "5");
5630 }
5631 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005632}
5633
5634const char * const HexagonTargetInfo::GCCRegNames[] = {
5635 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5636 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5637 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5638 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5639 "p0", "p1", "p2", "p3",
5640 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5641};
5642
Craig Topperf054e3a2015-10-19 03:52:27 +00005643ArrayRef<const char *> HexagonTargetInfo::getGCCRegNames() const {
5644 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005645}
5646
5647
5648const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5649 { { "sp" }, "r29" },
5650 { { "fp" }, "r30" },
5651 { { "lr" }, "r31" },
5652 };
5653
Craig Topperf054e3a2015-10-19 03:52:27 +00005654ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
5655 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005656}
5657
5658
5659const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005660#define BUILTIN(ID, TYPE, ATTRS) \
5661 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5662#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5663 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005664#include "clang/Basic/BuiltinsHexagon.def"
5665};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005666
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005667// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5668class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005669 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5670 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005671 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005672public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005673 SparcTargetInfo(const llvm::Triple &Triple)
5674 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005675
Craig Topper3164f332014-03-11 03:39:26 +00005676 bool handleTargetFeatures(std::vector<std::string> &Features,
5677 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005678 // The backend doesn't actually handle soft float yet, but in case someone
5679 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005680 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5681 if (Feature != Features.end()) {
5682 SoftFloat = true;
5683 Features.erase(Feature);
5684 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005685 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005686 }
Craig Topper3164f332014-03-11 03:39:26 +00005687 void getTargetDefines(const LangOptions &Opts,
5688 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005689 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005690 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005691
5692 if (SoftFloat)
5693 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005694 }
Craig Topper3164f332014-03-11 03:39:26 +00005695
5696 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005697 return llvm::StringSwitch<bool>(Feature)
5698 .Case("softfloat", SoftFloat)
5699 .Case("sparc", true)
5700 .Default(false);
5701 }
Craig Topper3164f332014-03-11 03:39:26 +00005702
Craig Topper6c03a542015-10-19 04:51:35 +00005703 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005704 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00005705 return None;
Gabor Greif49991682008-02-21 16:29:08 +00005706 }
Craig Topper3164f332014-03-11 03:39:26 +00005707 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005708 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005709 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005710 ArrayRef<const char *> getGCCRegNames() const override;
5711 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005712 bool validateAsmConstraint(const char *&Name,
5713 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005714 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005715 switch (*Name) {
5716 case 'I': // Signed 13-bit constant
5717 case 'J': // Zero
5718 case 'K': // 32-bit constant with the low 12 bits clear
5719 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5720 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5721 case 'N': // Same as 'K' but zext (required for SIMode)
5722 case 'O': // The constant 4096
5723 return true;
5724 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005725 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005726 }
Craig Topper3164f332014-03-11 03:39:26 +00005727 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005728 // FIXME: Implement!
5729 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005730 }
5731};
5732
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005733const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005734 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5735 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5736 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5737 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5738};
5739
Craig Topperf054e3a2015-10-19 03:52:27 +00005740ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
5741 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00005742}
5743
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005744const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005745 { { "g0" }, "r0" },
5746 { { "g1" }, "r1" },
5747 { { "g2" }, "r2" },
5748 { { "g3" }, "r3" },
5749 { { "g4" }, "r4" },
5750 { { "g5" }, "r5" },
5751 { { "g6" }, "r6" },
5752 { { "g7" }, "r7" },
5753 { { "o0" }, "r8" },
5754 { { "o1" }, "r9" },
5755 { { "o2" }, "r10" },
5756 { { "o3" }, "r11" },
5757 { { "o4" }, "r12" },
5758 { { "o5" }, "r13" },
5759 { { "o6", "sp" }, "r14" },
5760 { { "o7" }, "r15" },
5761 { { "l0" }, "r16" },
5762 { { "l1" }, "r17" },
5763 { { "l2" }, "r18" },
5764 { { "l3" }, "r19" },
5765 { { "l4" }, "r20" },
5766 { { "l5" }, "r21" },
5767 { { "l6" }, "r22" },
5768 { { "l7" }, "r23" },
5769 { { "i0" }, "r24" },
5770 { { "i1" }, "r25" },
5771 { { "i2" }, "r26" },
5772 { { "i3" }, "r27" },
5773 { { "i4" }, "r28" },
5774 { { "i5" }, "r29" },
5775 { { "i6", "fp" }, "r30" },
5776 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005777};
5778
Craig Topperf054e3a2015-10-19 03:52:27 +00005779ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
5780 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00005781}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005782
5783// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5784class SparcV8TargetInfo : public SparcTargetInfo {
5785public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005786 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005787 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00005788 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
5789 switch (getTriple().getOS()) {
5790 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00005791 SizeType = UnsignedInt;
5792 IntPtrType = SignedInt;
5793 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00005794 break;
5795 case llvm::Triple::NetBSD:
5796 case llvm::Triple::OpenBSD:
5797 SizeType = UnsignedLong;
5798 IntPtrType = SignedLong;
5799 PtrDiffType = SignedLong;
5800 break;
Brad Smith56495d52015-08-13 22:00:53 +00005801 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005802 }
5803
Craig Topper3164f332014-03-11 03:39:26 +00005804 void getTargetDefines(const LangOptions &Opts,
5805 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005806 SparcTargetInfo::getTargetDefines(Opts, Builder);
5807 Builder.defineMacro("__sparcv8");
5808 }
5809};
5810
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005811// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5812class SparcV8elTargetInfo : public SparcV8TargetInfo {
5813 public:
5814 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005815 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005816 BigEndian = false;
5817 }
5818};
5819
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005820// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5821class SparcV9TargetInfo : public SparcTargetInfo {
5822public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005823 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005824 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00005825 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005826 // This is an LP64 platform.
5827 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005828
5829 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005830 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005831 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005832 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005833 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005834 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005835
5836 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5837 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5838 LongDoubleWidth = 128;
5839 LongDoubleAlign = 128;
5840 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005841 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005842 }
5843
Craig Topper3164f332014-03-11 03:39:26 +00005844 void getTargetDefines(const LangOptions &Opts,
5845 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005846 SparcTargetInfo::getTargetDefines(Opts, Builder);
5847 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005848 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005849 // Solaris doesn't need these variants, but the BSDs do.
5850 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005851 Builder.defineMacro("__sparc64__");
5852 Builder.defineMacro("__sparc_v9__");
5853 Builder.defineMacro("__sparcv9__");
5854 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005855 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005856
Craig Topper3164f332014-03-11 03:39:26 +00005857 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005858 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5859 .Case("v9", true)
5860 .Case("ultrasparc", true)
5861 .Case("ultrasparc3", true)
5862 .Case("niagara", true)
5863 .Case("niagara2", true)
5864 .Case("niagara3", true)
5865 .Case("niagara4", true)
5866 .Default(false);
5867
5868 // No need to store the CPU yet. There aren't any CPU-specific
5869 // macros to define.
5870 return CPUKnown;
5871 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005872};
5873
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005874class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005875 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005876 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005877 std::string CPU;
5878 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005879 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005880
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005881public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005882 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00005883 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
5884 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005885 IntMaxType = SignedLong;
5886 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005887 TLSSupported = true;
5888 IntWidth = IntAlign = 32;
5889 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5890 PointerWidth = PointerAlign = 64;
5891 LongDoubleWidth = 128;
5892 LongDoubleAlign = 64;
5893 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005894 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005895 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00005896 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 +00005897 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5898 }
5899 void getTargetDefines(const LangOptions &Opts,
5900 MacroBuilder &Builder) const override {
5901 Builder.defineMacro("__s390__");
5902 Builder.defineMacro("__s390x__");
5903 Builder.defineMacro("__zarch__");
5904 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005905 if (HasTransactionalExecution)
5906 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005907 if (Opts.ZVector)
5908 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005909 }
Craig Topper6c03a542015-10-19 04:51:35 +00005910 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5911 return llvm::makeArrayRef(BuiltinInfo,
5912 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00005913 }
5914
Craig Topperf054e3a2015-10-19 03:52:27 +00005915 ArrayRef<const char *> getGCCRegNames() const override;
5916 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005917 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00005918 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00005919 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005920 bool validateAsmConstraint(const char *&Name,
5921 TargetInfo::ConstraintInfo &info) const override;
5922 const char *getClobbers() const override {
5923 // FIXME: Is this really right?
5924 return "";
5925 }
5926 BuiltinVaListKind getBuiltinVaListKind() const override {
5927 return TargetInfo::SystemZBuiltinVaList;
5928 }
5929 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005930 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005931 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5932 .Case("z10", true)
5933 .Case("z196", true)
5934 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005935 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005936 .Default(false);
5937
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005938 return CPUKnown;
5939 }
Eric Christopher8c47b422015-10-09 18:39:55 +00005940 bool
5941 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5942 StringRef CPU,
5943 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005944 if (CPU == "zEC12")
5945 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005946 if (CPU == "z13") {
5947 Features["transactional-execution"] = true;
5948 Features["vector"] = true;
5949 }
Eric Christopher007b0a02015-08-28 22:32:01 +00005950 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005951 }
5952
5953 bool handleTargetFeatures(std::vector<std::string> &Features,
5954 DiagnosticsEngine &Diags) override {
5955 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00005956 for (const auto &Feature : Features) {
5957 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005958 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00005959 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005960 HasVector = true;
5961 }
5962 // If we use the vector ABI, vector types are 64-bit aligned.
5963 if (HasVector) {
5964 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005965 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5966 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005967 }
5968 return true;
5969 }
5970
5971 bool hasFeature(StringRef Feature) const override {
5972 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005973 .Case("systemz", true)
5974 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005975 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005976 .Default(false);
5977 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005978
5979 StringRef getABI() const override {
5980 if (HasVector)
5981 return "vector";
5982 return "";
5983 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00005984
5985 bool useFloat128ManglingForLongDouble() const override {
5986 return true;
5987 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005988};
5989
5990const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5991#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005992 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005993#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005994};
5995
5996const char *const SystemZTargetInfo::GCCRegNames[] = {
5997 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5998 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5999 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6000 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6001};
6002
Craig Topperf054e3a2015-10-19 03:52:27 +00006003ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6004 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006005}
6006
6007bool SystemZTargetInfo::
6008validateAsmConstraint(const char *&Name,
6009 TargetInfo::ConstraintInfo &Info) const {
6010 switch (*Name) {
6011 default:
6012 return false;
6013
6014 case 'a': // Address register
6015 case 'd': // Data register (equivalent to 'r')
6016 case 'f': // Floating-point register
6017 Info.setAllowsRegister();
6018 return true;
6019
6020 case 'I': // Unsigned 8-bit constant
6021 case 'J': // Unsigned 12-bit constant
6022 case 'K': // Signed 16-bit constant
6023 case 'L': // Signed 20-bit displacement (on all targets we support)
6024 case 'M': // 0x7fffffff
6025 return true;
6026
6027 case 'Q': // Memory with base and unsigned 12-bit displacement
6028 case 'R': // Likewise, plus an index
6029 case 'S': // Memory with base and signed 20-bit displacement
6030 case 'T': // Likewise, plus an index
6031 Info.setAllowsMemory();
6032 return true;
6033 }
6034}
Ulrich Weigand47445072013-05-06 16:26:41 +00006035
Eric Christopherc48497a2015-09-18 21:26:24 +00006036class MSP430TargetInfo : public TargetInfo {
6037 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006038
Eric Christopherc48497a2015-09-18 21:26:24 +00006039public:
6040 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6041 BigEndian = false;
6042 TLSSupported = false;
6043 IntWidth = 16;
6044 IntAlign = 16;
6045 LongWidth = 32;
6046 LongLongWidth = 64;
6047 LongAlign = LongLongAlign = 16;
6048 PointerWidth = 16;
6049 PointerAlign = 16;
6050 SuitableAlign = 16;
6051 SizeType = UnsignedInt;
6052 IntMaxType = SignedLongLong;
6053 IntPtrType = SignedInt;
6054 PtrDiffType = SignedInt;
6055 SigAtomicType = SignedLong;
6056 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006057 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006058 void getTargetDefines(const LangOptions &Opts,
6059 MacroBuilder &Builder) const override {
6060 Builder.defineMacro("MSP430");
6061 Builder.defineMacro("__MSP430__");
6062 // FIXME: defines for different 'flavours' of MCU
6063 }
Craig Topper6c03a542015-10-19 04:51:35 +00006064 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006065 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006066 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006067 }
6068 bool hasFeature(StringRef Feature) const override {
6069 return Feature == "msp430";
6070 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006071 ArrayRef<const char *> getGCCRegNames() const override;
6072 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006073 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006074 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006075 }
6076 bool validateAsmConstraint(const char *&Name,
6077 TargetInfo::ConstraintInfo &info) const override {
6078 // FIXME: implement
6079 switch (*Name) {
6080 case 'K': // the constant 1
6081 case 'L': // constant -1^20 .. 1^19
6082 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006083 return true;
6084 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006085 // No target constraints for now.
6086 return false;
6087 }
6088 const char *getClobbers() const override {
6089 // FIXME: Is this really right?
6090 return "";
6091 }
6092 BuiltinVaListKind getBuiltinVaListKind() const override {
6093 // FIXME: implement
6094 return TargetInfo::CharPtrBuiltinVaList;
6095 }
6096};
6097
6098const char *const MSP430TargetInfo::GCCRegNames[] = {
6099 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6100 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6101
Craig Topperf054e3a2015-10-19 03:52:27 +00006102ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6103 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006104}
6105
6106// LLVM and Clang cannot be used directly to output native binaries for
6107// target, but is used to compile C code to llvm bitcode with correct
6108// type and alignment information.
6109//
6110// TCE uses the llvm bitcode as input and uses it for generating customized
6111// target processor and program binary. TCE co-design environment is
6112// publicly available in http://tce.cs.tut.fi
6113
6114static const unsigned TCEOpenCLAddrSpaceMap[] = {
6115 3, // opencl_global
6116 4, // opencl_local
6117 5, // opencl_constant
6118 // FIXME: generic has to be added to the target
6119 0, // opencl_generic
6120 0, // cuda_device
6121 0, // cuda_constant
6122 0 // cuda_shared
6123};
6124
6125class TCETargetInfo : public TargetInfo {
6126public:
6127 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6128 TLSSupported = false;
6129 IntWidth = 32;
6130 LongWidth = LongLongWidth = 32;
6131 PointerWidth = 32;
6132 IntAlign = 32;
6133 LongAlign = LongLongAlign = 32;
6134 PointerAlign = 32;
6135 SuitableAlign = 32;
6136 SizeType = UnsignedInt;
6137 IntMaxType = SignedLong;
6138 IntPtrType = SignedInt;
6139 PtrDiffType = SignedInt;
6140 FloatWidth = 32;
6141 FloatAlign = 32;
6142 DoubleWidth = 32;
6143 DoubleAlign = 32;
6144 LongDoubleWidth = 32;
6145 LongDoubleAlign = 32;
6146 FloatFormat = &llvm::APFloat::IEEEsingle;
6147 DoubleFormat = &llvm::APFloat::IEEEsingle;
6148 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6149 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6150 "-f64:32-v64:32-v128:32-a:0:32-n32";
6151 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6152 UseAddrSpaceMapMangling = true;
6153 }
6154
6155 void getTargetDefines(const LangOptions &Opts,
6156 MacroBuilder &Builder) const override {
6157 DefineStd(Builder, "tce", Opts);
6158 Builder.defineMacro("__TCE__");
6159 Builder.defineMacro("__TCE_V1__");
6160 }
6161 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6162
Craig Topper6c03a542015-10-19 04:51:35 +00006163 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006164 const char *getClobbers() const override { return ""; }
6165 BuiltinVaListKind getBuiltinVaListKind() const override {
6166 return TargetInfo::VoidPtrBuiltinVaList;
6167 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006168 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006169 bool validateAsmConstraint(const char *&Name,
6170 TargetInfo::ConstraintInfo &info) const override {
6171 return true;
6172 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006173 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6174 return None;
6175 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006176};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006177
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006178class BPFTargetInfo : public TargetInfo {
6179public:
6180 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6181 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6182 SizeType = UnsignedLong;
6183 PtrDiffType = SignedLong;
6184 IntPtrType = SignedLong;
6185 IntMaxType = SignedLong;
6186 Int64Type = SignedLong;
6187 RegParmMax = 5;
6188 if (Triple.getArch() == llvm::Triple::bpfeb) {
6189 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006190 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006191 } else {
6192 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006193 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006194 }
6195 MaxAtomicPromoteWidth = 64;
6196 MaxAtomicInlineWidth = 64;
6197 TLSSupported = false;
6198 }
6199 void getTargetDefines(const LangOptions &Opts,
6200 MacroBuilder &Builder) const override {
6201 DefineStd(Builder, "bpf", Opts);
6202 Builder.defineMacro("__BPF__");
6203 }
6204 bool hasFeature(StringRef Feature) const override {
6205 return Feature == "bpf";
6206 }
6207
Craig Topper6c03a542015-10-19 04:51:35 +00006208 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006209 const char *getClobbers() const override {
6210 return "";
6211 }
6212 BuiltinVaListKind getBuiltinVaListKind() const override {
6213 return TargetInfo::VoidPtrBuiltinVaList;
6214 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006215 ArrayRef<const char *> getGCCRegNames() const override {
6216 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006217 }
6218 bool validateAsmConstraint(const char *&Name,
6219 TargetInfo::ConstraintInfo &info) const override {
6220 return true;
6221 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006222 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6223 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006224 }
6225};
6226
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006227class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006228 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006229
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006230 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006231 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006232 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006233 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006234 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006235 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006236 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006237 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006238 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006239 enum DspRevEnum {
6240 NoDSP, DSP1, DSP2
6241 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006242 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006243
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006244protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006245 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006246 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006247
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006248public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006249 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6250 const std::string &CPUStr)
6251 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006252 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006253 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6254 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6255 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006256
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006257 bool isNaN2008Default() const {
6258 return CPU == "mips32r6" || CPU == "mips64r6";
6259 }
6260
6261 bool isFP64Default() const {
6262 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6263 }
6264
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006265 bool isNan2008() const override {
6266 return IsNan2008;
6267 }
6268
Alp Toker4925ba72014-06-07 23:30:42 +00006269 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006270 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006271 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6272 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006273 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006274 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006275 .Case("mips1", IsMips32)
6276 .Case("mips2", IsMips32)
6277 .Case("mips3", true)
6278 .Case("mips4", true)
6279 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006280 .Case("mips32", IsMips32)
6281 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006282 .Case("mips32r3", IsMips32)
6283 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006284 .Case("mips32r6", IsMips32)
6285 .Case("mips64", true)
6286 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006287 .Case("mips64r3", true)
6288 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006289 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006290 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006291 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006292 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006293 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006294 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006295 bool
6296 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6297 StringRef CPU,
6298 const std::vector<std::string> &FeaturesVec) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006299 if (CPU == "octeon")
6300 Features["mips64r2"] = Features["cnmips"] = true;
6301 else
6302 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006303 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006304 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006305
Craig Topper3164f332014-03-11 03:39:26 +00006306 void getTargetDefines(const LangOptions &Opts,
6307 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006308 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006309 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006310 if (Opts.GNUMode)
6311 Builder.defineMacro("mips");
6312
Simon Atanasyan683535b2012-08-29 19:14:58 +00006313 Builder.defineMacro("__REGISTER_PREFIX__", "");
6314
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006315 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006316 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006317 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006318 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006319 case SoftFloat:
6320 Builder.defineMacro("__mips_soft_float", Twine(1));
6321 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006322 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006323
Simon Atanasyan16071912013-04-14 14:07:30 +00006324 if (IsSingleFloat)
6325 Builder.defineMacro("__mips_single_float", Twine(1));
6326
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006327 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6328 Builder.defineMacro("_MIPS_FPSET",
6329 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6330
Simon Atanasyan72244b62012-07-05 16:06:06 +00006331 if (IsMips16)
6332 Builder.defineMacro("__mips16", Twine(1));
6333
Simon Atanasyan60777612013-04-14 14:07:51 +00006334 if (IsMicromips)
6335 Builder.defineMacro("__mips_micromips", Twine(1));
6336
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006337 if (IsNan2008)
6338 Builder.defineMacro("__mips_nan2008", Twine(1));
6339
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006340 switch (DspRev) {
6341 default:
6342 break;
6343 case DSP1:
6344 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6345 Builder.defineMacro("__mips_dsp", Twine(1));
6346 break;
6347 case DSP2:
6348 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6349 Builder.defineMacro("__mips_dspr2", Twine(1));
6350 Builder.defineMacro("__mips_dsp", Twine(1));
6351 break;
6352 }
6353
Jack Carter44ff1e52013-08-12 17:20:29 +00006354 if (HasMSA)
6355 Builder.defineMacro("__mips_msa", Twine(1));
6356
Simon Atanasyan26f19672012-04-05 19:28:31 +00006357 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6358 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6359 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006360
6361 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6362 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006363 }
6364
Craig Topper6c03a542015-10-19 04:51:35 +00006365 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6366 return llvm::makeArrayRef(BuiltinInfo,
6367 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006368 }
Craig Topper3164f332014-03-11 03:39:26 +00006369 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006370 return llvm::StringSwitch<bool>(Feature)
6371 .Case("mips", true)
6372 .Case("fp64", HasFP64)
6373 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006374 }
Craig Topper3164f332014-03-11 03:39:26 +00006375 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006376 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006377 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006378 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006379 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006380 // CPU register names
6381 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006382 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6383 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6384 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006385 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6386 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006387 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6388 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6389 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6390 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006391 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006392 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006393 "$fcc5","$fcc6","$fcc7",
6394 // MSA register names
6395 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6396 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6397 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6398 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6399 // MSA control register names
6400 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6401 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006402 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006403 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006404 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006405 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006406 bool validateAsmConstraint(const char *&Name,
6407 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006408 switch (*Name) {
6409 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006410 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006411 case 'r': // CPU registers.
6412 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006413 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006414 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006415 case 'c': // $25 for indirect jumps
6416 case 'l': // lo register
6417 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006418 Info.setAllowsRegister();
6419 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006420 case 'I': // Signed 16-bit constant
6421 case 'J': // Integer 0
6422 case 'K': // Unsigned 16-bit constant
6423 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6424 case 'M': // Constants not loadable via lui, addiu, or ori
6425 case 'N': // Constant -1 to -65535
6426 case 'O': // A signed 15-bit constant
6427 case 'P': // A constant between 1 go 65535
6428 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006429 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006430 Info.setAllowsMemory();
6431 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006432 case 'Z':
6433 if (Name[1] == 'C') { // An address usable by ll, and sc.
6434 Info.setAllowsMemory();
6435 Name++; // Skip over 'Z'.
6436 return true;
6437 }
6438 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006439 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006440 }
6441
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006442 std::string convertConstraint(const char *&Constraint) const override {
6443 std::string R;
6444 switch (*Constraint) {
6445 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6446 if (Constraint[1] == 'C') {
6447 R = std::string("^") + std::string(Constraint, 2);
6448 Constraint++;
6449 return R;
6450 }
6451 break;
6452 }
6453 return TargetInfo::convertConstraint(Constraint);
6454 }
6455
Craig Topper3164f332014-03-11 03:39:26 +00006456 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006457 // In GCC, $1 is not widely used in generated code (it's used only in a few
6458 // specific situations), so there is no real need for users to add it to
6459 // the clobbers list if they want to use it in their inline assembly code.
6460 //
6461 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6462 // code generation, so using it in inline assembly without adding it to the
6463 // clobbers list can cause conflicts between the inline assembly code and
6464 // the surrounding generated code.
6465 //
6466 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6467 // operands, which will conflict with the ".set at" assembler option (which
6468 // we use only for inline assembly, in order to maintain compatibility with
6469 // GCC) and will also conflict with the user's usage of $1.
6470 //
6471 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6472 // register for generated code is to automatically clobber $1 for all inline
6473 // assembly code.
6474 //
6475 // FIXME: We should automatically clobber $1 only for inline assembly code
6476 // which actually uses it. This would allow LLVM to use $1 for inline
6477 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006478 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006479 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006480
Craig Topper3164f332014-03-11 03:39:26 +00006481 bool handleTargetFeatures(std::vector<std::string> &Features,
6482 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006483 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006484 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006485 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006486 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006487 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006488 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006489 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006490
Eric Christopher610fe112015-08-26 08:21:55 +00006491 for (const auto &Feature : Features) {
6492 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006493 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006494 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006495 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006496 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006497 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006498 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006499 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006500 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006501 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006502 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006503 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006504 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006505 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006506 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006507 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006508 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006509 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006510 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006511 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006512 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006513 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006514 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006515
Eric Christopher964a5f32015-08-05 23:48:05 +00006516 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006517
Rafael Espindolaeb265472013-08-21 21:59:03 +00006518 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006519 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006520
Craig Topper3164f332014-03-11 03:39:26 +00006521 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006522 if (RegNo == 0) return 4;
6523 if (RegNo == 1) return 5;
6524 return -1;
6525 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006526
6527 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006528};
6529
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006530const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006531#define BUILTIN(ID, TYPE, ATTRS) \
6532 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6533#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6534 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006535#include "clang/Basic/BuiltinsMips.def"
6536};
6537
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006538class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006539public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006540 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006541 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006542 SizeType = UnsignedInt;
6543 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006544 Int64Type = SignedLongLong;
6545 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006546 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006547 }
Craig Topper3164f332014-03-11 03:39:26 +00006548 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006549 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006550 ABI = Name;
6551 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006552 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006553 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006554 }
Craig Topper3164f332014-03-11 03:39:26 +00006555 void getTargetDefines(const LangOptions &Opts,
6556 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006557 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006558
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006559 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006560 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6561
6562 const std::string& CPUStr = getCPU();
6563 if (CPUStr == "mips32")
6564 Builder.defineMacro("__mips_isa_rev", "1");
6565 else if (CPUStr == "mips32r2")
6566 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006567 else if (CPUStr == "mips32r3")
6568 Builder.defineMacro("__mips_isa_rev", "3");
6569 else if (CPUStr == "mips32r5")
6570 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006571 else if (CPUStr == "mips32r6")
6572 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006573
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006574 if (ABI == "o32") {
6575 Builder.defineMacro("__mips_o32");
6576 Builder.defineMacro("_ABIO32", "1");
6577 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6578 }
6579 else if (ABI == "eabi")
6580 Builder.defineMacro("__mips_eabi");
6581 else
David Blaikie83d382b2011-09-23 05:06:16 +00006582 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006583 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006584 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006585 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6586 { { "at" }, "$1" },
6587 { { "v0" }, "$2" },
6588 { { "v1" }, "$3" },
6589 { { "a0" }, "$4" },
6590 { { "a1" }, "$5" },
6591 { { "a2" }, "$6" },
6592 { { "a3" }, "$7" },
6593 { { "t0" }, "$8" },
6594 { { "t1" }, "$9" },
6595 { { "t2" }, "$10" },
6596 { { "t3" }, "$11" },
6597 { { "t4" }, "$12" },
6598 { { "t5" }, "$13" },
6599 { { "t6" }, "$14" },
6600 { { "t7" }, "$15" },
6601 { { "s0" }, "$16" },
6602 { { "s1" }, "$17" },
6603 { { "s2" }, "$18" },
6604 { { "s3" }, "$19" },
6605 { { "s4" }, "$20" },
6606 { { "s5" }, "$21" },
6607 { { "s6" }, "$22" },
6608 { { "s7" }, "$23" },
6609 { { "t8" }, "$24" },
6610 { { "t9" }, "$25" },
6611 { { "k0" }, "$26" },
6612 { { "k1" }, "$27" },
6613 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006614 { { "sp","$sp" }, "$29" },
6615 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006616 { { "ra" }, "$31" }
6617 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006618 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006619 }
6620};
6621
6622class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006623 void setDataLayoutString() override {
6624 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006625 }
6626
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006627public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006628 Mips32EBTargetInfo(const llvm::Triple &Triple)
6629 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006630 }
Craig Topper3164f332014-03-11 03:39:26 +00006631 void getTargetDefines(const LangOptions &Opts,
6632 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006633 DefineStd(Builder, "MIPSEB", Opts);
6634 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006635 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006636 }
6637};
6638
6639class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006640 void setDataLayoutString() override {
6641 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006642 }
6643
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006644public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006645 Mips32ELTargetInfo(const llvm::Triple &Triple)
6646 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006647 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006648 }
Craig Topper3164f332014-03-11 03:39:26 +00006649 void getTargetDefines(const LangOptions &Opts,
6650 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006651 DefineStd(Builder, "MIPSEL", Opts);
6652 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006653 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006654 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006655};
Akira Hatanakabef17452011-09-20 19:21:49 +00006656
6657class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006658public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006659 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006660 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006661 LongDoubleWidth = LongDoubleAlign = 128;
6662 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006663 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6664 LongDoubleWidth = LongDoubleAlign = 64;
6665 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6666 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006667 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006668 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006669 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006670 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006671
6672 void setN64ABITypes() {
6673 LongWidth = LongAlign = 64;
6674 PointerWidth = PointerAlign = 64;
6675 SizeType = UnsignedLong;
6676 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006677 Int64Type = SignedLong;
6678 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006679 }
6680
6681 void setN32ABITypes() {
6682 LongWidth = LongAlign = 32;
6683 PointerWidth = PointerAlign = 32;
6684 SizeType = UnsignedInt;
6685 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006686 Int64Type = SignedLongLong;
6687 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006688 }
6689
Craig Topper3164f332014-03-11 03:39:26 +00006690 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006691 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006692 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006693 ABI = Name;
6694 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006695 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006696 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006697 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006698 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006699 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006700 }
6701 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006702 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006703
Craig Topper3164f332014-03-11 03:39:26 +00006704 void getTargetDefines(const LangOptions &Opts,
6705 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006706 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006707
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006708 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006709 Builder.defineMacro("__mips64");
6710 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006711 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6712
6713 const std::string& CPUStr = getCPU();
6714 if (CPUStr == "mips64")
6715 Builder.defineMacro("__mips_isa_rev", "1");
6716 else if (CPUStr == "mips64r2")
6717 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006718 else if (CPUStr == "mips64r3")
6719 Builder.defineMacro("__mips_isa_rev", "3");
6720 else if (CPUStr == "mips64r5")
6721 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006722 else if (CPUStr == "mips64r6")
6723 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006724
Akira Hatanakabef17452011-09-20 19:21:49 +00006725 if (ABI == "n32") {
6726 Builder.defineMacro("__mips_n32");
6727 Builder.defineMacro("_ABIN32", "2");
6728 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6729 }
6730 else if (ABI == "n64") {
6731 Builder.defineMacro("__mips_n64");
6732 Builder.defineMacro("_ABI64", "3");
6733 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6734 }
6735 else
David Blaikie83d382b2011-09-23 05:06:16 +00006736 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006737 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006738 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006739 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6740 { { "at" }, "$1" },
6741 { { "v0" }, "$2" },
6742 { { "v1" }, "$3" },
6743 { { "a0" }, "$4" },
6744 { { "a1" }, "$5" },
6745 { { "a2" }, "$6" },
6746 { { "a3" }, "$7" },
6747 { { "a4" }, "$8" },
6748 { { "a5" }, "$9" },
6749 { { "a6" }, "$10" },
6750 { { "a7" }, "$11" },
6751 { { "t0" }, "$12" },
6752 { { "t1" }, "$13" },
6753 { { "t2" }, "$14" },
6754 { { "t3" }, "$15" },
6755 { { "s0" }, "$16" },
6756 { { "s1" }, "$17" },
6757 { { "s2" }, "$18" },
6758 { { "s3" }, "$19" },
6759 { { "s4" }, "$20" },
6760 { { "s5" }, "$21" },
6761 { { "s6" }, "$22" },
6762 { { "s7" }, "$23" },
6763 { { "t8" }, "$24" },
6764 { { "t9" }, "$25" },
6765 { { "k0" }, "$26" },
6766 { { "k1" }, "$27" },
6767 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006768 { { "sp","$sp" }, "$29" },
6769 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006770 { { "ra" }, "$31" }
6771 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006772 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00006773 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006774
6775 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006776};
6777
6778class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006779 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006780 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006781 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 +00006782 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006783 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006784
Akira Hatanakabef17452011-09-20 19:21:49 +00006785 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006786
Akira Hatanakabef17452011-09-20 19:21:49 +00006787public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006788 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006789 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006790 void getTargetDefines(const LangOptions &Opts,
6791 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006792 DefineStd(Builder, "MIPSEB", Opts);
6793 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006794 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006795 }
6796};
6797
6798class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006799 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006800 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006801 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 +00006802 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006803 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006804 }
6805public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006806 Mips64ELTargetInfo(const llvm::Triple &Triple)
6807 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006808 // Default ABI is n64.
6809 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006810 }
Craig Topper3164f332014-03-11 03:39:26 +00006811 void getTargetDefines(const LangOptions &Opts,
6812 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006813 DefineStd(Builder, "MIPSEL", Opts);
6814 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006815 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006816 }
6817};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006818
Ivan Krasindd7403e2011-08-24 20:22:22 +00006819class PNaClTargetInfo : public TargetInfo {
6820public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006821 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006822 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006823 this->UserLabelPrefix = "";
6824 this->LongAlign = 32;
6825 this->LongWidth = 32;
6826 this->PointerAlign = 32;
6827 this->PointerWidth = 32;
6828 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006829 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006830 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006831 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006832 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006833 this->SizeType = TargetInfo::UnsignedInt;
6834 this->PtrDiffType = TargetInfo::SignedInt;
6835 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006836 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006837 }
6838
Craig Toppere6f17d02014-03-11 04:07:52 +00006839 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006840 Builder.defineMacro("__le32__");
6841 Builder.defineMacro("__pnacl__");
6842 }
Craig Topper3164f332014-03-11 03:39:26 +00006843 void getTargetDefines(const LangOptions &Opts,
6844 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006845 getArchDefines(Opts, Builder);
6846 }
Craig Topper3164f332014-03-11 03:39:26 +00006847 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006848 return Feature == "pnacl";
6849 }
Craig Topper6c03a542015-10-19 04:51:35 +00006850 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00006851 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006852 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006853 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006854 ArrayRef<const char *> getGCCRegNames() const override;
6855 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006856 bool validateAsmConstraint(const char *&Name,
6857 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006858 return false;
6859 }
6860
Craig Topper3164f332014-03-11 03:39:26 +00006861 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006862 return "";
6863 }
6864};
6865
Craig Topperf054e3a2015-10-19 03:52:27 +00006866ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
6867 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006868}
6869
Craig Topperf054e3a2015-10-19 03:52:27 +00006870ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
6871 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006872}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006873
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006874// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6875class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6876public:
6877 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00006878 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006879 }
6880
6881 BuiltinVaListKind getBuiltinVaListKind() const override {
6882 return TargetInfo::PNaClABIBuiltinVaList;
6883 }
6884};
6885
JF Bastien643817d2014-09-12 17:52:47 +00006886class Le64TargetInfo : public TargetInfo {
6887 static const Builtin::Info BuiltinInfo[];
6888
6889public:
6890 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6891 BigEndian = false;
6892 NoAsmVariants = true;
6893 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6894 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006895 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006896 }
6897
6898 void getTargetDefines(const LangOptions &Opts,
6899 MacroBuilder &Builder) const override {
6900 DefineStd(Builder, "unix", Opts);
6901 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6902 Builder.defineMacro("__ELF__");
6903 }
Craig Topper6c03a542015-10-19 04:51:35 +00006904 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6905 return llvm::makeArrayRef(BuiltinInfo,
6906 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00006907 }
6908 BuiltinVaListKind getBuiltinVaListKind() const override {
6909 return TargetInfo::PNaClABIBuiltinVaList;
6910 }
6911 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00006912 ArrayRef<const char *> getGCCRegNames() const override {
6913 return None;
JF Bastien643817d2014-09-12 17:52:47 +00006914 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006915 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6916 return None;
JF Bastien643817d2014-09-12 17:52:47 +00006917 }
6918 bool validateAsmConstraint(const char *&Name,
6919 TargetInfo::ConstraintInfo &Info) const override {
6920 return false;
6921 }
6922
6923 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006924};
Dan Gohmanc2853072015-09-03 22:51:53 +00006925
6926class WebAssemblyTargetInfo : public TargetInfo {
6927 static const Builtin::Info BuiltinInfo[];
6928
6929 enum SIMDEnum {
6930 NoSIMD,
6931 SIMD128,
6932 } SIMDLevel;
6933
6934public:
6935 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
6936 : TargetInfo(T), SIMDLevel(NoSIMD) {
6937 BigEndian = false;
6938 NoAsmVariants = true;
6939 SuitableAlign = 128;
6940 LargeArrayMinWidth = 128;
6941 LargeArrayAlign = 128;
6942 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00006943 SigAtomicType = SignedLong;
Dan Gohmanc2853072015-09-03 22:51:53 +00006944 }
6945
6946protected:
6947 void getTargetDefines(const LangOptions &Opts,
6948 MacroBuilder &Builder) const override {
6949 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
6950 if (SIMDLevel >= SIMD128)
6951 Builder.defineMacro("__wasm_simd128__");
6952 }
6953
6954private:
Eric Christopher8c47b422015-10-09 18:39:55 +00006955 bool
6956 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6957 StringRef CPU,
6958 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00006959 if (CPU == "bleeding-edge")
6960 Features["simd128"] = true;
6961 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6962 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00006963 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00006964 return llvm::StringSwitch<bool>(Feature)
6965 .Case("simd128", SIMDLevel >= SIMD128)
6966 .Default(false);
6967 }
6968 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00006969 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00006970 for (const auto &Feature : Features) {
6971 if (Feature == "+simd128") {
6972 SIMDLevel = std::max(SIMDLevel, SIMD128);
6973 continue;
6974 }
6975 if (Feature == "-simd128") {
6976 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
6977 continue;
6978 }
6979
6980 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
6981 << "-target-feature";
6982 return false;
6983 }
6984 return true;
6985 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00006986 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00006987 return llvm::StringSwitch<bool>(Name)
6988 .Case("mvp", true)
6989 .Case("bleeding-edge", true)
6990 .Case("generic", true)
6991 .Default(false);
6992 }
Craig Topper6c03a542015-10-19 04:51:35 +00006993 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
6994 return llvm::makeArrayRef(BuiltinInfo,
6995 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00006996 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00006997 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00006998 // TODO: Implement va_list properly.
6999 return VoidPtrBuiltinVaList;
7000 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007001 ArrayRef<const char *> getGCCRegNames() const final {
7002 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007003 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007004 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7005 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007006 }
7007 bool
7008 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007009 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007010 return false;
7011 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007012 const char *getClobbers() const final { return ""; }
7013 bool isCLZForZeroUndef() const final { return false; }
7014 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007015 IntType getIntTypeByWidth(unsigned BitWidth,
7016 bool IsSigned) const final {
7017 // WebAssembly prefers long long for explicitly 64-bit integers.
7018 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7019 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7020 }
7021 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7022 bool IsSigned) const final {
7023 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7024 return BitWidth == 64
7025 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7026 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7027 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007028};
7029
7030const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7031#define BUILTIN(ID, TYPE, ATTRS) \
7032 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7033#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7034 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7035#include "clang/Basic/BuiltinsWebAssembly.def"
7036};
7037
7038class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7039public:
7040 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7041 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007042 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohmanc2853072015-09-03 22:51:53 +00007043 DataLayoutString = "e-p:32:32-i64:64-n32:64-S128";
7044 }
7045
7046protected:
7047 void getTargetDefines(const LangOptions &Opts,
7048 MacroBuilder &Builder) const override {
7049 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7050 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7051 }
7052};
7053
7054class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7055public:
7056 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7057 : WebAssemblyTargetInfo(T) {
7058 LongAlign = LongWidth = 64;
7059 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007060 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohmanc2853072015-09-03 22:51:53 +00007061 DataLayoutString = "e-p:64:64-i64:64-n32:64-S128";
7062 }
7063
7064protected:
7065 void getTargetDefines(const LangOptions &Opts,
7066 MacroBuilder &Builder) const override {
7067 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7068 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7069 }
7070};
7071
JF Bastien643817d2014-09-12 17:52:47 +00007072const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7073#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007074 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007075#include "clang/Basic/BuiltinsLe64.def"
7076};
7077
Eric Christopherc48497a2015-09-18 21:26:24 +00007078static const unsigned SPIRAddrSpaceMap[] = {
7079 1, // opencl_global
7080 3, // opencl_local
7081 2, // opencl_constant
7082 4, // opencl_generic
7083 0, // cuda_device
7084 0, // cuda_constant
7085 0 // cuda_shared
7086};
7087class SPIRTargetInfo : public TargetInfo {
7088public:
7089 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7090 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7091 "SPIR target must use unknown OS");
7092 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7093 "SPIR target must use unknown environment type");
7094 BigEndian = false;
7095 TLSSupported = false;
7096 LongWidth = LongAlign = 64;
7097 AddrSpaceMap = &SPIRAddrSpaceMap;
7098 UseAddrSpaceMapMangling = true;
7099 // Define available target features
7100 // These must be defined in sorted order!
7101 NoAsmVariants = true;
7102 }
7103 void getTargetDefines(const LangOptions &Opts,
7104 MacroBuilder &Builder) const override {
7105 DefineStd(Builder, "SPIR", Opts);
7106 }
7107 bool hasFeature(StringRef Feature) const override {
7108 return Feature == "spir";
7109 }
Craig Topper3164f332014-03-11 03:39:26 +00007110
Craig Topper6c03a542015-10-19 04:51:35 +00007111 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007112 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007113 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007114 bool validateAsmConstraint(const char *&Name,
7115 TargetInfo::ConstraintInfo &info) const override {
7116 return true;
7117 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007118 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7119 return None;
7120 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007121 BuiltinVaListKind getBuiltinVaListKind() const override {
7122 return TargetInfo::VoidPtrBuiltinVaList;
7123 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007124
Eric Christopherc48497a2015-09-18 21:26:24 +00007125 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7126 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7127 : CCCR_Warning;
7128 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007129
Eric Christopherc48497a2015-09-18 21:26:24 +00007130 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7131 return CC_SpirFunction;
7132 }
7133};
Guy Benyeib798fc92012-12-11 21:38:14 +00007134
Eric Christopherc48497a2015-09-18 21:26:24 +00007135class SPIR32TargetInfo : public SPIRTargetInfo {
7136public:
7137 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7138 PointerWidth = PointerAlign = 32;
7139 SizeType = TargetInfo::UnsignedInt;
7140 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7141 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7142 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7143 }
7144 void getTargetDefines(const LangOptions &Opts,
7145 MacroBuilder &Builder) const override {
7146 DefineStd(Builder, "SPIR32", Opts);
7147 }
7148};
Guy Benyeib798fc92012-12-11 21:38:14 +00007149
Eric Christopherc48497a2015-09-18 21:26:24 +00007150class SPIR64TargetInfo : public SPIRTargetInfo {
7151public:
7152 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7153 PointerWidth = PointerAlign = 64;
7154 SizeType = TargetInfo::UnsignedLong;
7155 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7156 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7157 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7158 }
7159 void getTargetDefines(const LangOptions &Opts,
7160 MacroBuilder &Builder) const override {
7161 DefineStd(Builder, "SPIR64", Opts);
7162 }
7163};
Guy Benyeib798fc92012-12-11 21:38:14 +00007164
Robert Lytton0e076492013-08-13 09:43:10 +00007165class XCoreTargetInfo : public TargetInfo {
7166 static const Builtin::Info BuiltinInfo[];
7167public:
7168 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7169 BigEndian = false;
7170 NoAsmVariants = true;
7171 LongLongAlign = 32;
7172 SuitableAlign = 32;
7173 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007174 SizeType = UnsignedInt;
7175 PtrDiffType = SignedInt;
7176 IntPtrType = SignedInt;
7177 WCharType = UnsignedChar;
7178 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007179 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007180 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7181 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007182 }
Craig Topper3164f332014-03-11 03:39:26 +00007183 void getTargetDefines(const LangOptions &Opts,
7184 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007185 Builder.defineMacro("__XS1B__");
7186 }
Craig Topper6c03a542015-10-19 04:51:35 +00007187 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7188 return llvm::makeArrayRef(BuiltinInfo,
7189 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007190 }
Craig Topper3164f332014-03-11 03:39:26 +00007191 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007192 return TargetInfo::VoidPtrBuiltinVaList;
7193 }
Craig Topper3164f332014-03-11 03:39:26 +00007194 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007195 return "";
7196 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007197 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007198 static const char * const GCCRegNames[] = {
7199 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7200 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7201 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007202 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007203 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007204 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7205 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007206 }
Craig Topper3164f332014-03-11 03:39:26 +00007207 bool validateAsmConstraint(const char *&Name,
7208 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007209 return false;
7210 }
Craig Topper3164f332014-03-11 03:39:26 +00007211 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007212 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7213 return (RegNo < 2)? RegNo : -1;
7214 }
Robert Lytton0e076492013-08-13 09:43:10 +00007215};
7216
7217const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007218#define BUILTIN(ID, TYPE, ATTRS) \
7219 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7220#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7221 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007222#include "clang/Basic/BuiltinsXCore.def"
7223};
Robert Lytton0e076492013-08-13 09:43:10 +00007224
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007225// x86_32 Android target
7226class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7227public:
7228 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7229 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7230 SuitableAlign = 32;
7231 LongDoubleWidth = 64;
7232 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7233 }
7234};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007235
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007236// x86_64 Android target
7237class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7238public:
7239 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7240 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7241 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7242 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007243
7244 bool useFloat128ManglingForLongDouble() const override {
7245 return true;
7246 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007247};
7248} // end anonymous namespace
7249
Chris Lattner5ba61f02006-10-14 07:39:34 +00007250//===----------------------------------------------------------------------===//
7251// Driver code
7252//===----------------------------------------------------------------------===//
7253
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007254static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007255 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007256
Daniel Dunbar52322032009-08-18 05:47:58 +00007257 switch (Triple.getArch()) {
7258 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007259 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007260
Tim Northover2a0783d2014-05-30 14:14:07 +00007261 case llvm::Triple::xcore:
7262 return new XCoreTargetInfo(Triple);
7263
7264 case llvm::Triple::hexagon:
7265 return new HexagonTargetInfo(Triple);
7266
7267 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007268 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007269 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007270
7271 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007272 case llvm::Triple::CloudABI:
7273 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple);
Ed Maste6a9eda52014-11-13 16:55:42 +00007274 case llvm::Triple::FreeBSD:
7275 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007276 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007277 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007278 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007279 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007280 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007281 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007282 }
7283
Christian Pirker9b019ae2014-02-25 13:51:00 +00007284 case llvm::Triple::aarch64_be:
7285 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007286 case llvm::Triple::FreeBSD:
7287 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007288 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007289 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007290 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007291 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007292 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007293 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007294 }
7295
Daniel Dunbar52322032009-08-18 05:47:58 +00007296 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007297 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007298 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007299 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007300
Daniel Dunbar52322032009-08-18 05:47:58 +00007301 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007302 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007303 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007304 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007305 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007306 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007307 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007308 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007309 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007310 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007311 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007312 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007313 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007314 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007315 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007316 case llvm::Triple::Win32:
7317 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007318 case llvm::Triple::Cygnus:
7319 return new CygwinARMTargetInfo(Triple);
7320 case llvm::Triple::GNU:
7321 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007322 case llvm::Triple::Itanium:
7323 return new ItaniumWindowsARMleTargetInfo(Triple);
7324 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007325 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007326 return new MicrosoftARMleTargetInfo(Triple);
7327 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007328 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007329 return new ARMleTargetInfo(Triple);
7330 }
7331
7332 case llvm::Triple::armeb:
7333 case llvm::Triple::thumbeb:
7334 if (Triple.isOSDarwin())
7335 return new DarwinARMTargetInfo(Triple);
7336
7337 switch (os) {
7338 case llvm::Triple::Linux:
7339 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7340 case llvm::Triple::FreeBSD:
7341 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7342 case llvm::Triple::NetBSD:
7343 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7344 case llvm::Triple::OpenBSD:
7345 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7346 case llvm::Triple::Bitrig:
7347 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7348 case llvm::Triple::RTEMS:
7349 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7350 case llvm::Triple::NaCl:
7351 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7352 default:
7353 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007354 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007355
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007356 case llvm::Triple::bpfeb:
7357 case llvm::Triple::bpfel:
7358 return new BPFTargetInfo(Triple);
7359
Daniel Dunbar52322032009-08-18 05:47:58 +00007360 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007361 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007362
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007363 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007364 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007365 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007366 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007367 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007368 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007369 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007370 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007371 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007372 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007373 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007374 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007375 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007376
7377 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007378 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007379 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007380 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007381 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007382 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007383 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007384 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007385 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007386 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007387 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007388 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007389 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007390 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007391 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007392
Akira Hatanakabef17452011-09-20 19:21:49 +00007393 case llvm::Triple::mips64:
7394 switch (os) {
7395 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007396 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007397 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007398 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007399 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007400 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007401 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007402 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007403 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007404 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007405 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007406 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007407 }
7408
7409 case llvm::Triple::mips64el:
7410 switch (os) {
7411 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007412 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007413 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007414 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007415 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007416 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007417 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007418 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007419 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007420 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007421 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007422 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007423 }
7424
Ivan Krasindd7403e2011-08-24 20:22:22 +00007425 case llvm::Triple::le32:
7426 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007427 case llvm::Triple::NaCl:
7428 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7429 default:
7430 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007431 }
7432
JF Bastien643817d2014-09-12 17:52:47 +00007433 case llvm::Triple::le64:
7434 return new Le64TargetInfo(Triple);
7435
Daniel Dunbar52322032009-08-18 05:47:58 +00007436 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007437 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007438 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007439 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007440 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007441 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007442 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007443 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007444 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007445 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007446 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007447 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007448 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007449 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007450 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007451 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007452 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007453
7454 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007455 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007456 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007457 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007458 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007459 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007460 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007461 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007462 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007463 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007464 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007465 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007466 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007467 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007468 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007469
Bill Schmidt778d3872013-07-26 01:36:11 +00007470 case llvm::Triple::ppc64le:
7471 switch (os) {
7472 case llvm::Triple::Linux:
7473 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007474 case llvm::Triple::NetBSD:
7475 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007476 default:
7477 return new PPC64TargetInfo(Triple);
7478 }
7479
Peter Collingbournec947aae2012-05-20 23:28:41 +00007480 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007481 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007482 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007483 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007484
Tom Stellardd8e38a32015-01-06 20:34:47 +00007485 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007486 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007487 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007488
Daniel Dunbar52322032009-08-18 05:47:58 +00007489 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007490 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007491 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007492 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007493 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007494 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007495 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007496 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007497 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007498 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007499 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007500 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007501 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007502 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007503 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007504
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007505 // The 'sparcel' architecture copies all the above cases except for Solaris.
7506 case llvm::Triple::sparcel:
7507 switch (os) {
7508 case llvm::Triple::Linux:
7509 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7510 case llvm::Triple::NetBSD:
7511 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7512 case llvm::Triple::OpenBSD:
7513 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7514 case llvm::Triple::RTEMS:
7515 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7516 default:
7517 return new SparcV8elTargetInfo(Triple);
7518 }
7519
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007520 case llvm::Triple::sparcv9:
7521 switch (os) {
7522 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007523 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007524 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007525 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007526 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007527 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007528 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007529 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007530 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007531 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007532 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007533 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007534 }
7535
Ulrich Weigand47445072013-05-06 16:26:41 +00007536 case llvm::Triple::systemz:
7537 switch (os) {
7538 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007539 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007540 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007541 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007542 }
7543
Eli Friedmana9c3d712009-08-19 20:47:07 +00007544 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007545 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007546
Daniel Dunbar52322032009-08-18 05:47:58 +00007547 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007548 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007549 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007550
Daniel Dunbar52322032009-08-18 05:47:58 +00007551 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007552 case llvm::Triple::CloudABI:
7553 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007554 case llvm::Triple::Linux: {
7555 switch (Triple.getEnvironment()) {
7556 default:
7557 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7558 case llvm::Triple::Android:
7559 return new AndroidX86_32TargetInfo(Triple);
7560 }
7561 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007562 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007563 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007564 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007565 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007566 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007567 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007568 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007569 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007570 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007571 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007572 case llvm::Triple::KFreeBSD:
7573 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007574 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007575 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007576 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007577 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007578 case llvm::Triple::Win32: {
7579 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007580 case llvm::Triple::Cygnus:
7581 return new CygwinX86_32TargetInfo(Triple);
7582 case llvm::Triple::GNU:
7583 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007584 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007585 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007586 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007587 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007588 }
7589 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007590 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007591 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007592 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007593 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007594 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007595 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007596 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007597 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007598 }
7599
7600 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007601 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007602 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007603
Daniel Dunbar52322032009-08-18 05:47:58 +00007604 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007605 case llvm::Triple::CloudABI:
7606 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007607 case llvm::Triple::Linux: {
7608 switch (Triple.getEnvironment()) {
7609 default:
7610 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7611 case llvm::Triple::Android:
7612 return new AndroidX86_64TargetInfo(Triple);
7613 }
7614 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007615 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007616 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007617 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007618 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007619 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007620 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007621 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007622 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007623 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007624 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007625 case llvm::Triple::KFreeBSD:
7626 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007627 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007628 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007629 case llvm::Triple::Win32: {
7630 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007631 case llvm::Triple::Cygnus:
7632 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007633 case llvm::Triple::GNU:
7634 return new MinGWX86_64TargetInfo(Triple);
7635 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007636 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007637 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007638 }
7639 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007640 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007641 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007642 case llvm::Triple::PS4:
7643 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007644 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007645 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007646 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007647
Douglas Katzman78d7c542015-05-12 21:18:10 +00007648 case llvm::Triple::spir: {
7649 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7650 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7651 return nullptr;
7652 return new SPIR32TargetInfo(Triple);
7653 }
7654 case llvm::Triple::spir64: {
7655 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7656 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7657 return nullptr;
7658 return new SPIR64TargetInfo(Triple);
7659 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007660 case llvm::Triple::wasm32:
7661 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7662 return nullptr;
7663 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7664 case llvm::Triple::wasm64:
7665 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7666 return nullptr;
7667 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007668 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007669}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007670
7671/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007672/// options.
Alp Toker80758082014-07-06 05:26:44 +00007673TargetInfo *
7674TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7675 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007676 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007677
7678 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007679 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007680 if (!Target) {
7681 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007682 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007683 }
Alp Toker80758082014-07-06 05:26:44 +00007684 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007685
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007686 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007687 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7688 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007689 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007690 }
7691
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007692 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007693 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7694 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007695 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007696 }
7697
Rafael Espindolaeb265472013-08-21 21:59:03 +00007698 // Set the fp math unit.
7699 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7700 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007701 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007702 }
7703
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007704 // Compute the default target features, we need the target to handle this
7705 // because features may have dependencies on one another.
7706 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00007707 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
7708 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00007709 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007710
7711 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007712 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007713 for (const auto &F : Features)
7714 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7715
Eric Christopher3ff21b32013-10-16 21:26:26 +00007716 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007717 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007718
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007719 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007720}