blob: 65ae7be11078be73dfd422a162f7d9b95d82c85c [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 McCall5d36a8c2011-06-16 00:03:19 +0000121 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000122 // __weak is always defined, for use in blocks and with objc pointers.
123 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000124
John McCall31168b02011-06-15 23:02:42 +0000125 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000126 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000127 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
128 else
129 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000130
John McCall31168b02011-06-15 23:02:42 +0000131 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
132 // allow this in C, since one might have block pointers in structs that
133 // are used in pure C code and in Objective-C ARC.
134 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000135 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000136
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000137 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000138 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000139 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000141
142 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000143 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000144
Daniel Dunbarecf13562011-04-19 21:40:34 +0000145 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000146 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000147 if (Triple.isMacOSX()) {
148 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000149 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000151 Triple.getOSVersion(Maj, Min, Rev);
152 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000153 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000154
Sebastian Pop422377c2012-01-20 22:01:23 +0000155 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000156 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000157 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
158 if (PlatformName == "win32") {
159 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
160 return;
161 }
162
Evan Cheng31dd9a62014-01-26 23:12:43 +0000163 // Set the appropriate OS version define.
164 if (Triple.isiOS()) {
165 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
166 char Str[6];
167 Str[0] = '0' + Maj;
168 Str[1] = '0' + (Min / 10);
169 Str[2] = '0' + (Min % 10);
170 Str[3] = '0' + (Rev / 10);
171 Str[4] = '0' + (Rev % 10);
172 Str[5] = '\0';
Eric Christopher7d0c7252015-09-24 21:17:04 +0000173 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000174 } else if (Triple.isMacOSX()) {
175 // Note that the Driver allows versions which aren't representable in the
176 // define (because we only get a single digit for the minor and micro
177 // revision numbers). So, we limit them to the maximum representable
178 // version.
179 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000180 char Str[7];
181 if (Maj < 10 || (Maj == 10 && Min < 10)) {
182 Str[0] = '0' + (Maj / 10);
183 Str[1] = '0' + (Maj % 10);
184 Str[2] = '0' + std::min(Min, 9U);
185 Str[3] = '0' + std::min(Rev, 9U);
186 Str[4] = '\0';
187 } else {
188 // Handle versions > 10.9.
189 Str[0] = '0' + (Maj / 10);
190 Str[1] = '0' + (Maj % 10);
191 Str[2] = '0' + (Min / 10);
192 Str[3] = '0' + (Min % 10);
193 Str[4] = '0' + (Rev / 10);
194 Str[5] = '0' + (Rev % 10);
195 Str[6] = '\0';
196 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000198 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000199
Tim Northover157d9112014-01-16 08:48:16 +0000200 // Tell users about the kernel if there is one.
201 if (Triple.isOSDarwin())
202 Builder.defineMacro("__MACH__");
203
Daniel Dunbarecf13562011-04-19 21:40:34 +0000204 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000205}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000206
Torok Edwinb2b37c62009-06-30 17:10:35 +0000207template<typename Target>
208class DarwinTargetInfo : public OSTargetInfo<Target> {
209protected:
Craig Topper3164f332014-03-11 03:39:26 +0000210 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
211 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000212 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000213 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000214 }
Mike Stump11289f42009-09-09 15:08:12 +0000215
Torok Edwinb2b37c62009-06-30 17:10:35 +0000216public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000217 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
218 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
219 this->MCountName = "\01mcount";
220 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000221
Craig Topper3164f332014-03-11 03:39:26 +0000222 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000223 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000224 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000225 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000226 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000227 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000228 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000229 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000230
Craig Topper3164f332014-03-11 03:39:26 +0000231 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000232 // FIXME: We should return 0 when building kexts.
233 return "__TEXT,__StaticInit,regular,pure_instructions";
234 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000235
John McCalleed64c72012-01-29 01:20:30 +0000236 /// Darwin does not support protected visibility. Darwin's "default"
237 /// is very similar to ELF's "protected"; Darwin requires a "weak"
238 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000239 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000240 return false;
241 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000242};
243
Chris Lattner30ba6742009-08-10 19:03:04 +0000244
Torok Edwinb2b37c62009-06-30 17:10:35 +0000245// DragonFlyBSD Target
246template<typename Target>
247class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
248protected:
Craig Topper3164f332014-03-11 03:39:26 +0000249 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
250 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000251 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000252 Builder.defineMacro("__DragonFly__");
253 Builder.defineMacro("__DragonFly_cc_version", "100001");
254 Builder.defineMacro("__ELF__");
255 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
256 Builder.defineMacro("__tune_i386__");
257 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000258 }
259public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000260 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
261 : OSTargetInfo<Target>(Triple) {
262 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 switch (Triple.getArch()) {
265 default:
266 case llvm::Triple::x86:
267 case llvm::Triple::x86_64:
268 this->MCountName = ".mcount";
269 break;
270 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000271 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000272};
273
274// FreeBSD Target
275template<typename Target>
276class FreeBSDTargetInfo : public OSTargetInfo<Target> {
277protected:
Craig Topper3164f332014-03-11 03:39:26 +0000278 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
279 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000280 // FreeBSD defines; list based off of gcc output
281
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000282 unsigned Release = Triple.getOSMajorVersion();
283 if (Release == 0U)
284 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000285
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000286 Builder.defineMacro("__FreeBSD__", Twine(Release));
287 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000288 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
289 DefineStd(Builder, "unix", Opts);
290 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000291
292 // On FreeBSD, wchar_t contains the number of the code point as
293 // used by the character set of the locale. These character sets are
294 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000295 //
296 // FIXME: This is wrong; the macro refers to the numerical values
297 // of wchar_t *literals*, which are not locale-dependent. However,
298 // FreeBSD systems apparently depend on us getting this wrong, and
299 // setting this to 1 is conforming even if all the basic source
300 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000301 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000302 }
303public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000304 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
305 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000306
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000307 switch (Triple.getArch()) {
308 default:
309 case llvm::Triple::x86:
310 case llvm::Triple::x86_64:
311 this->MCountName = ".mcount";
312 break;
313 case llvm::Triple::mips:
314 case llvm::Triple::mipsel:
315 case llvm::Triple::ppc:
316 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000317 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000318 this->MCountName = "_mcount";
319 break;
320 case llvm::Triple::arm:
321 this->MCountName = "__mcount";
322 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000323 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000324 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000325};
326
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000327// GNU/kFreeBSD Target
328template<typename Target>
329class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
330protected:
Craig Topper3164f332014-03-11 03:39:26 +0000331 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
332 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000333 // GNU/kFreeBSD defines; list based off of gcc output
334
335 DefineStd(Builder, "unix", Opts);
336 Builder.defineMacro("__FreeBSD_kernel__");
337 Builder.defineMacro("__GLIBC__");
338 Builder.defineMacro("__ELF__");
339 if (Opts.POSIXThreads)
340 Builder.defineMacro("_REENTRANT");
341 if (Opts.CPlusPlus)
342 Builder.defineMacro("_GNU_SOURCE");
343 }
344public:
Eric Christopher917e9522014-11-18 22:36:15 +0000345 KFreeBSDTargetInfo(const llvm::Triple &Triple)
346 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000347 this->UserLabelPrefix = "";
348 }
349};
350
Chris Lattner3e2ee142010-07-07 16:01:42 +0000351// Minix Target
352template<typename Target>
353class MinixTargetInfo : public OSTargetInfo<Target> {
354protected:
Craig Topper3164f332014-03-11 03:39:26 +0000355 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
356 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000357 // Minix defines
358
359 Builder.defineMacro("__minix", "3");
360 Builder.defineMacro("_EM_WSIZE", "4");
361 Builder.defineMacro("_EM_PSIZE", "4");
362 Builder.defineMacro("_EM_SSIZE", "2");
363 Builder.defineMacro("_EM_LSIZE", "4");
364 Builder.defineMacro("_EM_FSIZE", "4");
365 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000366 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000367 DefineStd(Builder, "unix", Opts);
368 }
369public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000370 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
371 this->UserLabelPrefix = "";
372 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000373};
374
Torok Edwinb2b37c62009-06-30 17:10:35 +0000375// Linux target
376template<typename Target>
377class LinuxTargetInfo : public OSTargetInfo<Target> {
378protected:
Craig Topper3164f332014-03-11 03:39:26 +0000379 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
380 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000382 DefineStd(Builder, "unix", Opts);
383 DefineStd(Builder, "linux", Opts);
384 Builder.defineMacro("__gnu_linux__");
385 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000386 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000387 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000388 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000389 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000390 this->PlatformName = "android";
391 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
392 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000393 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000394 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000395 if (Opts.CPlusPlus)
396 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000397 }
398public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000399 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000400 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000401 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000402
403 switch (Triple.getArch()) {
404 default:
405 break;
406 case llvm::Triple::ppc:
407 case llvm::Triple::ppc64:
408 case llvm::Triple::ppc64le:
409 this->MCountName = "_mcount";
410 break;
411 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000412 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000413
Craig Topper3164f332014-03-11 03:39:26 +0000414 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000415 return ".text.startup";
416 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000417};
418
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000419// NetBSD Target
420template<typename Target>
421class NetBSDTargetInfo : public OSTargetInfo<Target> {
422protected:
Craig Topper3164f332014-03-11 03:39:26 +0000423 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
424 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000425 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000426 Builder.defineMacro("__NetBSD__");
427 Builder.defineMacro("__unix__");
428 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000429 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000430 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000431
432 switch (Triple.getArch()) {
433 default:
434 break;
435 case llvm::Triple::arm:
436 case llvm::Triple::armeb:
437 case llvm::Triple::thumb:
438 case llvm::Triple::thumbeb:
439 Builder.defineMacro("__ARM_DWARF_EH__");
440 break;
441 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000442 }
443public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000444 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
445 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000446 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000447 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000448};
449
Torok Edwinb2b37c62009-06-30 17:10:35 +0000450// OpenBSD Target
451template<typename Target>
452class OpenBSDTargetInfo : public OSTargetInfo<Target> {
453protected:
Craig Topper3164f332014-03-11 03:39:26 +0000454 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
455 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000456 // OpenBSD defines; list based off of gcc output
457
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 Builder.defineMacro("__OpenBSD__");
459 DefineStd(Builder, "unix", Opts);
460 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000461 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000462 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000463 }
464public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000465 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
466 this->UserLabelPrefix = "";
467 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000468
Eli Friedman3715d1f2011-12-15 02:15:56 +0000469 switch (Triple.getArch()) {
470 default:
471 case llvm::Triple::x86:
472 case llvm::Triple::x86_64:
473 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000474 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000475 this->MCountName = "__mcount";
476 break;
477 case llvm::Triple::mips64:
478 case llvm::Triple::mips64el:
479 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000480 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000481 this->MCountName = "_mcount";
482 break;
483 }
484 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000485};
486
Eli Friedman9fa28852012-08-08 23:57:20 +0000487// Bitrig Target
488template<typename Target>
489class BitrigTargetInfo : public OSTargetInfo<Target> {
490protected:
Craig Topper3164f332014-03-11 03:39:26 +0000491 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
492 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000493 // Bitrig defines; list based off of gcc output
494
495 Builder.defineMacro("__Bitrig__");
496 DefineStd(Builder, "unix", Opts);
497 Builder.defineMacro("__ELF__");
498 if (Opts.POSIXThreads)
499 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000500
501 switch (Triple.getArch()) {
502 default:
503 break;
504 case llvm::Triple::arm:
505 case llvm::Triple::armeb:
506 case llvm::Triple::thumb:
507 case llvm::Triple::thumbeb:
508 Builder.defineMacro("__ARM_DWARF_EH__");
509 break;
510 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000511 }
512public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000513 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
514 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000515 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000516 }
517};
518
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000519// PSP Target
520template<typename Target>
521class PSPTargetInfo : public OSTargetInfo<Target> {
522protected:
Craig Topper3164f332014-03-11 03:39:26 +0000523 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
524 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000525 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000526 Builder.defineMacro("PSP");
527 Builder.defineMacro("_PSP");
528 Builder.defineMacro("__psp__");
529 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000530 }
531public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000532 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000533 this->UserLabelPrefix = "";
534 }
535};
536
John Thompsone467e192009-11-19 17:18:50 +0000537// PS3 PPU Target
538template<typename Target>
539class PS3PPUTargetInfo : public OSTargetInfo<Target> {
540protected:
Craig Topper3164f332014-03-11 03:39:26 +0000541 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
542 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000543 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000544 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000545 Builder.defineMacro("__PPU__");
546 Builder.defineMacro("__CELLOS_LV2__");
547 Builder.defineMacro("__ELF__");
548 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000549 Builder.defineMacro("_ARCH_PPC64");
550 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000551 }
552public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000553 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000554 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000555 this->LongWidth = this->LongAlign = 32;
556 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000557 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000558 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000559 this->SizeType = TargetInfo::UnsignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +0000560 this->DataLayoutString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000561 }
562};
563
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000564template <typename Target>
565class PS4OSTargetInfo : public OSTargetInfo<Target> {
566protected:
567 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
568 MacroBuilder &Builder) const override {
569 Builder.defineMacro("__FreeBSD__", "9");
570 Builder.defineMacro("__FreeBSD_cc_version", "900001");
571 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
572 DefineStd(Builder, "unix", Opts);
573 Builder.defineMacro("__ELF__");
574 Builder.defineMacro("__PS4__");
575 }
576public:
577 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
578 this->WCharType = this->UnsignedShort;
579
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000580 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
581 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000582 this->UserLabelPrefix = "";
583
584 switch (Triple.getArch()) {
585 default:
586 case llvm::Triple::x86_64:
587 this->MCountName = ".mcount";
588 break;
589 }
590 }
591};
592
Torok Edwinb2b37c62009-06-30 17:10:35 +0000593// Solaris target
594template<typename Target>
595class SolarisTargetInfo : public OSTargetInfo<Target> {
596protected:
Craig Topper3164f332014-03-11 03:39:26 +0000597 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
598 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000599 DefineStd(Builder, "sun", Opts);
600 DefineStd(Builder, "unix", Opts);
601 Builder.defineMacro("__ELF__");
602 Builder.defineMacro("__svr4__");
603 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000604 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
605 // newer, but to 500 for everything else. feature_test.h has a check to
606 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000607 // with a new version.
608 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000609 Builder.defineMacro("_XOPEN_SOURCE", "600");
610 else
611 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000612 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000613 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000614 Builder.defineMacro("_LARGEFILE_SOURCE");
615 Builder.defineMacro("_LARGEFILE64_SOURCE");
616 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000617 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000618 }
619public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000620 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000621 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000622 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000623 // FIXME: WIntType should be SignedLong
624 }
625};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000626
627// Windows target
628template<typename Target>
629class WindowsTargetInfo : public OSTargetInfo<Target> {
630protected:
Craig Topper3164f332014-03-11 03:39:26 +0000631 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
632 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000633 Builder.defineMacro("_WIN32");
634 }
635 void getVisualStudioDefines(const LangOptions &Opts,
636 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000637 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000638 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000639 Builder.defineMacro("_CPPRTTI");
640
Reid Kleckner16514352015-01-30 21:42:55 +0000641 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000642 Builder.defineMacro("_CPPUNWIND");
643 }
644
David Majnemer6a658902015-07-22 22:36:26 +0000645 if (Opts.Bool)
646 Builder.defineMacro("__BOOL_DEFINED");
647
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000648 if (!Opts.CharIsSigned)
649 Builder.defineMacro("_CHAR_UNSIGNED");
650
651 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
652 // but it works for now.
653 if (Opts.POSIXThreads)
654 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000655
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000656 if (Opts.MSCompatibilityVersion) {
657 Builder.defineMacro("_MSC_VER",
658 Twine(Opts.MSCompatibilityVersion / 100000));
659 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000660 // FIXME We cannot encode the revision information into 32-bits
661 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000662
David Majnemerb710a932015-05-11 03:57:49 +0000663 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000664 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000665 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000666
667 if (Opts.MicrosoftExt) {
668 Builder.defineMacro("_MSC_EXTENSIONS");
669
670 if (Opts.CPlusPlus11) {
671 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
672 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
673 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
674 }
675 }
676
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000677 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000678 }
679
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000680public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000681 WindowsTargetInfo(const llvm::Triple &Triple)
682 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000683};
684
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000685template <typename Target>
686class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000687protected:
Craig Topper3164f332014-03-11 03:39:26 +0000688 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
689 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000690 if (Opts.POSIXThreads)
691 Builder.defineMacro("_REENTRANT");
692 if (Opts.CPlusPlus)
693 Builder.defineMacro("_GNU_SOURCE");
694
695 DefineStd(Builder, "unix", Opts);
696 Builder.defineMacro("__ELF__");
697 Builder.defineMacro("__native_client__");
698 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000699
700public:
701 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000702 this->UserLabelPrefix = "";
703 this->LongAlign = 32;
704 this->LongWidth = 32;
705 this->PointerAlign = 32;
706 this->PointerWidth = 32;
707 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000708 this->Int64Type = TargetInfo::SignedLongLong;
709 this->DoubleAlign = 64;
710 this->LongDoubleWidth = 64;
711 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000712 this->LongLongWidth = 64;
713 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000714 this->SizeType = TargetInfo::UnsignedInt;
715 this->PtrDiffType = TargetInfo::SignedInt;
716 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000717 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000718 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000719 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000720 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000721 } else if (Triple.getArch() == llvm::Triple::x86) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000722 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000723 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000724 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000725 } else if (Triple.getArch() == llvm::Triple::mipsel) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000726 // Handled on mips' setDataLayoutString.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000727 } else {
728 assert(Triple.getArch() == llvm::Triple::le32);
Eric Christopher964a5f32015-08-05 23:48:05 +0000729 this->DataLayoutString = "e-p:32:32-i64:64";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000730 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000731 }
732};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000733
Dan Gohmanc2853072015-09-03 22:51:53 +0000734// WebAssembly target
735template <typename Target>
736class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
737 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000738 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000739 // A common platform macro.
740 if (Opts.POSIXThreads)
741 Builder.defineMacro("_REENTRANT");
742 // Follow g++ convention and predefine _GNU_SOURCE for C++.
743 if (Opts.CPlusPlus)
744 Builder.defineMacro("_GNU_SOURCE");
745 }
746
747 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000748 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000749 return ".text.__startup";
750 }
751
752public:
753 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
754 : OSTargetInfo<Target>(Triple) {
755 this->MCountName = "__mcount";
756 this->UserLabelPrefix = "";
757 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
758 }
759};
Dan Gohmanc2853072015-09-03 22:51:53 +0000760
Chris Lattner09d98f52008-10-05 21:50:58 +0000761//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000762// Specific target implementations.
763//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000764
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000765// PPC abstract base class
766class PPCTargetInfo : public TargetInfo {
767 static const Builtin::Info BuiltinInfo[];
768 static const char * const GCCRegNames[];
769 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000770 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000771
772 // Target cpu features.
773 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000774 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000775 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000776 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000777 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000778 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000779 bool HasBPERMD;
780 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000781
Ulrich Weigand8afad612014-07-28 13:17:52 +0000782protected:
783 std::string ABI;
784
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000785public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000786 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000787 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000788 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000789 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000790 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000791 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000792 LongDoubleWidth = LongDoubleAlign = 128;
793 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
794 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000795
Hal Finkel6b984f02012-07-03 16:51:04 +0000796 /// \brief Flags for architecture specific defines.
797 typedef enum {
798 ArchDefineNone = 0,
799 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
800 ArchDefinePpcgr = 1 << 1,
801 ArchDefinePpcsq = 1 << 2,
802 ArchDefine440 = 1 << 3,
803 ArchDefine603 = 1 << 4,
804 ArchDefine604 = 1 << 5,
805 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000806 ArchDefinePwr5 = 1 << 7,
807 ArchDefinePwr5x = 1 << 8,
808 ArchDefinePwr6 = 1 << 9,
809 ArchDefinePwr6x = 1 << 10,
810 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000811 ArchDefinePwr8 = 1 << 12,
812 ArchDefineA2 = 1 << 13,
813 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000814 } ArchDefineTypes;
815
Bill Schmidt38378a02013-02-01 20:23:10 +0000816 // Note: GCC recognizes the following additional cpus:
817 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
818 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
819 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000820 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000821 bool CPUKnown = llvm::StringSwitch<bool>(Name)
822 .Case("generic", true)
823 .Case("440", true)
824 .Case("450", true)
825 .Case("601", true)
826 .Case("602", true)
827 .Case("603", true)
828 .Case("603e", true)
829 .Case("603ev", true)
830 .Case("604", true)
831 .Case("604e", true)
832 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000833 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000834 .Case("g3", true)
835 .Case("7400", true)
836 .Case("g4", true)
837 .Case("7450", true)
838 .Case("g4+", true)
839 .Case("750", true)
840 .Case("970", true)
841 .Case("g5", true)
842 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000843 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000844 .Case("e500mc", true)
845 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000846 .Case("power3", true)
847 .Case("pwr3", true)
848 .Case("power4", true)
849 .Case("pwr4", true)
850 .Case("power5", true)
851 .Case("pwr5", true)
852 .Case("power5x", true)
853 .Case("pwr5x", true)
854 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000855 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000856 .Case("power6x", true)
857 .Case("pwr6x", true)
858 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000859 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000860 .Case("power8", true)
861 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000862 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000863 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000864 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000865 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000866 .Case("powerpc64le", true)
867 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000868 .Default(false);
869
870 if (CPUKnown)
871 CPU = Name;
872
873 return CPUKnown;
874 }
875
Ulrich Weigand8afad612014-07-28 13:17:52 +0000876
877 StringRef getABI() const override { return ABI; }
878
Craig Topper3164f332014-03-11 03:39:26 +0000879 void getTargetBuiltins(const Builtin::Info *&Records,
880 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000881 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000882 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000883 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000884
Craig Topper3164f332014-03-11 03:39:26 +0000885 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000886
Craig Topper3164f332014-03-11 03:39:26 +0000887 void getTargetDefines(const LangOptions &Opts,
888 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000889
Eric Christopher8c47b422015-10-09 18:39:55 +0000890 bool
891 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
892 StringRef CPU,
893 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000894
Craig Topper3164f332014-03-11 03:39:26 +0000895 bool handleTargetFeatures(std::vector<std::string> &Features,
896 DiagnosticsEngine &Diags) override;
897 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000898 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
899 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000900
Craig Topperf054e3a2015-10-19 03:52:27 +0000901 ArrayRef<const char *> getGCCRegNames() const override;
902 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000903 bool validateAsmConstraint(const char *&Name,
904 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000905 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000906 default: return false;
907 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000908 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000909 case 'b': // Base register
910 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000911 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000912 break;
913 // FIXME: The following are added to allow parsing.
914 // I just took a guess at what the actions should be.
915 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000916 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000917 case 'v': // Altivec vector register
918 Info.setAllowsRegister();
919 break;
920 case 'w':
921 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000922 case 'd':// VSX vector register to hold vector double data
923 case 'f':// VSX vector register to hold vector float data
924 case 's':// VSX vector register to hold scalar float data
925 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000926 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000927 break;
928 default:
929 return false;
930 }
931 Info.setAllowsRegister();
932 Name++; // Skip over 'w'.
933 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000934 case 'h': // `MQ', `CTR', or `LINK' register
935 case 'q': // `MQ' register
936 case 'c': // `CTR' register
937 case 'l': // `LINK' register
938 case 'x': // `CR' register (condition register) number 0
939 case 'y': // `CR' register (condition register)
940 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000941 Info.setAllowsRegister();
942 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000943 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000944 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000945 // (use `L' instead for SImode constants)
946 case 'K': // Unsigned 16-bit constant
947 case 'L': // Signed 16-bit constant shifted left 16 bits
948 case 'M': // Constant larger than 31
949 case 'N': // Exact power of 2
950 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000951 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000952 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000953 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000954 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000955 break;
956 case 'm': // Memory operand. Note that on PowerPC targets, m can
957 // include addresses that update the base register. It
958 // is therefore only safe to use `m' in an asm statement
959 // if that asm statement accesses the operand exactly once.
960 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000961 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000962 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000963 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000964 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000965 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
966 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000967 // register to be updated.
968 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000969 if (Name[1] != 's')
970 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000971 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000972 // include any automodification of the base register. Unlike
973 // `m', this constraint can be used in asm statements that
974 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000975 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000976 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000977 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000978 break;
979 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000980 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000981 case 'Z': // Memory operand that is an indexed or indirect from a
982 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000983 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000984 Info.setAllowsMemory();
985 Info.setAllowsRegister();
986 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000987 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000988 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000989 // register (`p' is preferable for asm statements)
990 case 'S': // Constant suitable as a 64-bit mask operand
991 case 'T': // Constant suitable as a 32-bit mask operand
992 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000993 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000994 // instructions
995 case 'W': // Vector constant that does not require memory
996 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000997 break;
998 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000999 }
John Thompson07a61a42010-06-24 22:44:13 +00001000 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001001 }
Craig Topper3164f332014-03-11 03:39:26 +00001002 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001003 std::string R;
1004 switch (*Constraint) {
1005 case 'e':
1006 case 'w':
1007 // Two-character constraint; add "^" hint for later parsing.
1008 R = std::string("^") + std::string(Constraint, 2);
1009 Constraint++;
1010 break;
1011 default:
1012 return TargetInfo::convertConstraint(Constraint);
1013 }
1014 return R;
1015 }
Craig Topper3164f332014-03-11 03:39:26 +00001016 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001017 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001018 }
Craig Topper3164f332014-03-11 03:39:26 +00001019 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001020 if (RegNo == 0) return 3;
1021 if (RegNo == 1) return 4;
1022 return -1;
1023 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001024
1025 bool hasSjLjLowering() const override {
1026 return true;
1027 }
David Majnemer2617ea62015-06-09 18:05:33 +00001028
1029 bool useFloat128ManglingForLongDouble() const override {
1030 return LongDoubleWidth == 128 &&
1031 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1032 getTriple().isOSBinFormatELF();
1033 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001034};
Anders Carlssonf511f642007-11-27 04:11:28 +00001035
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001036const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001037#define BUILTIN(ID, TYPE, ATTRS) \
1038 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1039#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1040 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001041#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001042};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001043
Eric Christopher917e9522014-11-18 22:36:15 +00001044/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001045/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001046bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001047 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001048 for (const auto &Feature : Features) {
1049 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001050 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001051 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001052 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001053 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001054 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001055 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001056 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001057 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001058 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001059 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001060 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001061 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001062 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001063 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001064 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001065 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001066 // TODO: Finish this list and add an assert that we've handled them
1067 // all.
1068 }
Eric Christopher02c33352015-08-25 00:59:11 +00001069
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001070 return true;
1071}
1072
Chris Lattnerecd49032009-03-02 22:27:17 +00001073/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1074/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001075void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001076 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001077 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001078 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001079 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001080 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001081 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001082 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001083 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001084 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001085 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001086 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001087 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001088 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001089
Chris Lattnerecd49032009-03-02 22:27:17 +00001090 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001091 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1092 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001093 } else {
1094 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1095 getTriple().getOS() != llvm::Triple::OpenBSD)
1096 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001097 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001098
Ulrich Weigand8afad612014-07-28 13:17:52 +00001099 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001100 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001101 Builder.defineMacro("_CALL_ELF", "1");
1102 if (ABI == "elfv2")
1103 Builder.defineMacro("_CALL_ELF", "2");
1104
Chris Lattnerecd49032009-03-02 22:27:17 +00001105 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001106 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1107 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001108
Chris Lattnerecd49032009-03-02 22:27:17 +00001109 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001110 if (LongDoubleWidth == 128)
1111 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001112
John Thompsone467e192009-11-19 17:18:50 +00001113 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001114 Builder.defineMacro("__VEC__", "10206");
1115 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001116 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001117
1118 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001119 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1120 .Case("440", ArchDefineName)
1121 .Case("450", ArchDefineName | ArchDefine440)
1122 .Case("601", ArchDefineName)
1123 .Case("602", ArchDefineName | ArchDefinePpcgr)
1124 .Case("603", ArchDefineName | ArchDefinePpcgr)
1125 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1126 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1127 .Case("604", ArchDefineName | ArchDefinePpcgr)
1128 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1129 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001130 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001131 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1132 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1133 .Case("750", ArchDefineName | ArchDefinePpcgr)
1134 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1135 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001136 .Case("a2", ArchDefineA2)
1137 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001138 .Case("pwr3", ArchDefinePpcgr)
1139 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1140 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1141 | ArchDefinePpcsq)
1142 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1143 | ArchDefinePpcgr | ArchDefinePpcsq)
1144 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1145 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1146 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1147 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1148 | ArchDefinePpcsq)
1149 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1150 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001151 | ArchDefinePpcgr | ArchDefinePpcsq)
1152 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1153 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1154 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001155 .Case("power3", ArchDefinePpcgr)
1156 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1157 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1158 | ArchDefinePpcsq)
1159 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1160 | ArchDefinePpcgr | ArchDefinePpcsq)
1161 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1162 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1163 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1164 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1165 | ArchDefinePpcsq)
1166 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1167 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001168 | ArchDefinePpcgr | ArchDefinePpcsq)
1169 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1170 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1171 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001172 .Default(ArchDefineNone);
1173
1174 if (defs & ArchDefineName)
1175 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1176 if (defs & ArchDefinePpcgr)
1177 Builder.defineMacro("_ARCH_PPCGR");
1178 if (defs & ArchDefinePpcsq)
1179 Builder.defineMacro("_ARCH_PPCSQ");
1180 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001181 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001182 if (defs & ArchDefine603)
1183 Builder.defineMacro("_ARCH_603");
1184 if (defs & ArchDefine604)
1185 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001186 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001187 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001188 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001189 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001190 if (defs & ArchDefinePwr5x)
1191 Builder.defineMacro("_ARCH_PWR5X");
1192 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001193 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001194 if (defs & ArchDefinePwr6x)
1195 Builder.defineMacro("_ARCH_PWR6X");
1196 if (defs & ArchDefinePwr7)
1197 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001198 if (defs & ArchDefinePwr8)
1199 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001200 if (defs & ArchDefineA2)
1201 Builder.defineMacro("_ARCH_A2");
1202 if (defs & ArchDefineA2q) {
1203 Builder.defineMacro("_ARCH_A2Q");
1204 Builder.defineMacro("_ARCH_QP");
1205 }
1206
1207 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1208 Builder.defineMacro("__bg__");
1209 Builder.defineMacro("__THW_BLUEGENE__");
1210 Builder.defineMacro("__bgq__");
1211 Builder.defineMacro("__TOS_BGQ__");
1212 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001213
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001214 if (HasVSX)
1215 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001216 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001217 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001218 if (HasP8Crypto)
1219 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001220 if (HasHTM)
1221 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001222
1223 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1224 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1225 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1226 if (PointerWidth == 64)
1227 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001228
Bill Schmidt38378a02013-02-01 20:23:10 +00001229 // FIXME: The following are not yet generated here by Clang, but are
1230 // generated by GCC:
1231 //
1232 // _SOFT_FLOAT_
1233 // __RECIP_PRECISION__
1234 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001235 // __RECIP__
1236 // __RECIPF__
1237 // __RSQRTE__
1238 // __RSQRTEF__
1239 // _SOFT_DOUBLE_
1240 // __NO_LWSYNC__
1241 // __HAVE_BSWAP__
1242 // __LONGDOUBLE128
1243 // __CMODEL_MEDIUM__
1244 // __CMODEL_LARGE__
1245 // _CALL_SYSV
1246 // _CALL_DARWIN
1247 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001248}
1249
Eric Christophera8a14c32015-08-31 18:39:16 +00001250// Handle explicit options being passed to the compiler here: if we've
1251// explicitly turned off vsx and turned on power8-vector or direct-move then
1252// go ahead and error since the customer has expressed a somewhat incompatible
1253// set of options.
1254static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001255 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001256
1257 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1258 FeaturesVec.end()) {
1259 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1260 FeaturesVec.end()) {
1261 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1262 << "-mno-vsx";
1263 return false;
1264 }
1265
1266 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1267 FeaturesVec.end()) {
1268 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1269 << "-mno-vsx";
1270 return false;
1271 }
1272 }
1273
1274 return true;
1275}
1276
Eric Christopher8c47b422015-10-09 18:39:55 +00001277bool PPCTargetInfo::initFeatureMap(
1278 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1279 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001280 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1281 .Case("7400", true)
1282 .Case("g4", true)
1283 .Case("7450", true)
1284 .Case("g4+", true)
1285 .Case("970", true)
1286 .Case("g5", true)
1287 .Case("pwr6", true)
1288 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001289 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001290 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001291 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001292 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001293
1294 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001295 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1296 .Case("ppc64le", true)
1297 .Case("pwr8", true)
1298 .Default(false);
1299 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1300 .Case("ppc64le", true)
1301 .Case("pwr8", true)
1302 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001303 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1304 .Case("ppc64le", true)
1305 .Case("pwr8", true)
1306 .Case("pwr7", true)
1307 .Default(false);
1308 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1309 .Case("ppc64le", true)
1310 .Case("pwr8", true)
1311 .Case("pwr7", true)
1312 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001313 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1314 .Case("ppc64le", true)
1315 .Case("pwr8", true)
1316 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001317 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1318 .Case("ppc64le", true)
1319 .Case("pwr8", true)
1320 .Case("pwr7", true)
1321 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001322
Eric Christophera8a14c32015-08-31 18:39:16 +00001323 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1324 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001325
Eric Christopher007b0a02015-08-28 22:32:01 +00001326 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001327}
1328
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001329bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001330 return llvm::StringSwitch<bool>(Feature)
1331 .Case("powerpc", true)
1332 .Case("vsx", HasVSX)
1333 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001334 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001335 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001336 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001337 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001338 .Case("bpermd", HasBPERMD)
1339 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001340 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001341}
Chris Lattner17df24e2008-04-21 18:56:49 +00001342
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001343void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1344 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001345 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1346 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1347 // incompatible options.
1348 if (Enabled) {
1349 if (Name == "vsx") {
1350 Features[Name] = true;
1351 } else if (Name == "direct-move") {
1352 Features[Name] = Features["vsx"] = true;
1353 } else if (Name == "power8-vector") {
1354 Features[Name] = Features["vsx"] = true;
1355 } else {
1356 Features[Name] = true;
1357 }
1358 } else {
1359 if (Name == "vsx") {
1360 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1361 false;
1362 } else {
1363 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001364 }
1365 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001366}
1367
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001368const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001369 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1370 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1371 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1372 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1373 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1374 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1375 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1376 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001377 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001378 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001379 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001380 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1381 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1382 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1383 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001384 "vrsave", "vscr",
1385 "spe_acc", "spefscr",
1386 "sfp"
1387};
Chris Lattner10a5b382007-01-29 05:24:35 +00001388
Craig Topperf054e3a2015-10-19 03:52:27 +00001389ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1390 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001391}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001392
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001393const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1394 // While some of these aliases do map to different registers
1395 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001396 { { "0" }, "r0" },
1397 { { "1"}, "r1" },
1398 { { "2" }, "r2" },
1399 { { "3" }, "r3" },
1400 { { "4" }, "r4" },
1401 { { "5" }, "r5" },
1402 { { "6" }, "r6" },
1403 { { "7" }, "r7" },
1404 { { "8" }, "r8" },
1405 { { "9" }, "r9" },
1406 { { "10" }, "r10" },
1407 { { "11" }, "r11" },
1408 { { "12" }, "r12" },
1409 { { "13" }, "r13" },
1410 { { "14" }, "r14" },
1411 { { "15" }, "r15" },
1412 { { "16" }, "r16" },
1413 { { "17" }, "r17" },
1414 { { "18" }, "r18" },
1415 { { "19" }, "r19" },
1416 { { "20" }, "r20" },
1417 { { "21" }, "r21" },
1418 { { "22" }, "r22" },
1419 { { "23" }, "r23" },
1420 { { "24" }, "r24" },
1421 { { "25" }, "r25" },
1422 { { "26" }, "r26" },
1423 { { "27" }, "r27" },
1424 { { "28" }, "r28" },
1425 { { "29" }, "r29" },
1426 { { "30" }, "r30" },
1427 { { "31" }, "r31" },
1428 { { "fr0" }, "f0" },
1429 { { "fr1" }, "f1" },
1430 { { "fr2" }, "f2" },
1431 { { "fr3" }, "f3" },
1432 { { "fr4" }, "f4" },
1433 { { "fr5" }, "f5" },
1434 { { "fr6" }, "f6" },
1435 { { "fr7" }, "f7" },
1436 { { "fr8" }, "f8" },
1437 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001438 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001439 { { "fr11" }, "f11" },
1440 { { "fr12" }, "f12" },
1441 { { "fr13" }, "f13" },
1442 { { "fr14" }, "f14" },
1443 { { "fr15" }, "f15" },
1444 { { "fr16" }, "f16" },
1445 { { "fr17" }, "f17" },
1446 { { "fr18" }, "f18" },
1447 { { "fr19" }, "f19" },
1448 { { "fr20" }, "f20" },
1449 { { "fr21" }, "f21" },
1450 { { "fr22" }, "f22" },
1451 { { "fr23" }, "f23" },
1452 { { "fr24" }, "f24" },
1453 { { "fr25" }, "f25" },
1454 { { "fr26" }, "f26" },
1455 { { "fr27" }, "f27" },
1456 { { "fr28" }, "f28" },
1457 { { "fr29" }, "f29" },
1458 { { "fr30" }, "f30" },
1459 { { "fr31" }, "f31" },
1460 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001461};
1462
Craig Topperf054e3a2015-10-19 03:52:27 +00001463ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1464 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001465}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001466
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001467class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001468public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001469 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001470 DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001471
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001472 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001473 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001474 case llvm::Triple::FreeBSD:
1475 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001476 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001477 PtrDiffType = SignedInt;
1478 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001479 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001480 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001481 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001482 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001483
Roman Divacky3ffe7462012-03-13 19:20:17 +00001484 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1485 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001486 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001487 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001488
1489 // PPC32 supports atomics up to 4 bytes.
1490 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001491 }
1492
Craig Topper3164f332014-03-11 03:39:26 +00001493 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001494 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001495 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001496 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001497};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001498
Bill Schmidt778d3872013-07-26 01:36:11 +00001499// Note: ABI differences may eventually require us to have a separate
1500// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001501class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001502public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001503 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001504 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001505 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001506 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001507
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001508 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001509 DataLayoutString = "e-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001510 ABI = "elfv2";
1511 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001512 DataLayoutString = "E-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001513 ABI = "elfv1";
1514 }
1515
1516 switch (getTriple().getOS()) {
1517 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001518 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001519 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001520 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001521 case llvm::Triple::NetBSD:
1522 IntMaxType = SignedLongLong;
1523 Int64Type = SignedLongLong;
1524 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001525 default:
1526 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001527 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001528
1529 // PPC64 supports atomics up to 8 bytes.
1530 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001531 }
Craig Topper3164f332014-03-11 03:39:26 +00001532 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001533 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001534 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001535 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001536 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001537 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001538 ABI = Name;
1539 return true;
1540 }
1541 return false;
1542 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001543};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001544
Roman Divacky965b0b72011-01-06 08:27:10 +00001545class DarwinPPC32TargetInfo :
1546 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001547public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001548 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1549 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001550 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001551 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001552 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001553 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001554 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001555 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001556 }
Craig Topper3164f332014-03-11 03:39:26 +00001557 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001558 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001559 }
1560};
1561
1562class DarwinPPC64TargetInfo :
1563 public DarwinTargetInfo<PPC64TargetInfo> {
1564public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001565 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1566 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001567 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001568 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001569 DataLayoutString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001570 }
1571};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001572
Eric Christopherc48497a2015-09-18 21:26:24 +00001573static const unsigned NVPTXAddrSpaceMap[] = {
1574 1, // opencl_global
1575 3, // opencl_local
1576 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001577 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001578 0, // opencl_generic
1579 1, // cuda_device
1580 4, // cuda_constant
1581 3, // cuda_shared
1582};
1583
1584class NVPTXTargetInfo : public TargetInfo {
1585 static const char *const GCCRegNames[];
1586 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001587
1588 // The GPU profiles supported by the NVPTX backend
1589 enum GPUKind {
1590 GK_NONE,
1591 GK_SM20,
1592 GK_SM21,
1593 GK_SM30,
1594 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001595 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001596 } GPU;
1597
Eric Christopherc48497a2015-09-18 21:26:24 +00001598public:
1599 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1600 BigEndian = false;
1601 TLSSupported = false;
1602 LongWidth = LongAlign = 64;
1603 AddrSpaceMap = &NVPTXAddrSpaceMap;
1604 UseAddrSpaceMapMangling = true;
1605 // Define available target features
1606 // These must be defined in sorted order!
1607 NoAsmVariants = true;
1608 // Set the default GPU to sm20
1609 GPU = GK_SM20;
1610 }
1611 void getTargetDefines(const LangOptions &Opts,
1612 MacroBuilder &Builder) const override {
1613 Builder.defineMacro("__PTX__");
1614 Builder.defineMacro("__NVPTX__");
1615 if (Opts.CUDAIsDevice) {
1616 // Set __CUDA_ARCH__ for the GPU specified.
1617 std::string CUDAArchCode;
1618 switch (GPU) {
1619 case GK_SM20:
1620 CUDAArchCode = "200";
1621 break;
1622 case GK_SM21:
1623 CUDAArchCode = "210";
1624 break;
1625 case GK_SM30:
1626 CUDAArchCode = "300";
1627 break;
1628 case GK_SM35:
1629 CUDAArchCode = "350";
1630 break;
1631 case GK_SM37:
1632 CUDAArchCode = "370";
1633 break;
1634 default:
1635 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001636 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001637 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001638 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001639 }
1640 void getTargetBuiltins(const Builtin::Info *&Records,
1641 unsigned &NumRecords) const override {
1642 Records = BuiltinInfo;
1643 NumRecords = clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin;
1644 }
1645 bool hasFeature(StringRef Feature) const override {
1646 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001647 }
1648
Craig Topperf054e3a2015-10-19 03:52:27 +00001649 ArrayRef<const char *> getGCCRegNames() const override;
1650 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001651 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001652 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001653 }
1654 bool validateAsmConstraint(const char *&Name,
1655 TargetInfo::ConstraintInfo &Info) const override {
1656 switch (*Name) {
1657 default:
1658 return false;
1659 case 'c':
1660 case 'h':
1661 case 'r':
1662 case 'l':
1663 case 'f':
1664 case 'd':
1665 Info.setAllowsRegister();
1666 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001667 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001668 }
1669 const char *getClobbers() const override {
1670 // FIXME: Is this really right?
1671 return "";
1672 }
1673 BuiltinVaListKind getBuiltinVaListKind() const override {
1674 // FIXME: implement
1675 return TargetInfo::CharPtrBuiltinVaList;
1676 }
1677 bool setCPU(const std::string &Name) override {
1678 GPU = llvm::StringSwitch<GPUKind>(Name)
1679 .Case("sm_20", GK_SM20)
1680 .Case("sm_21", GK_SM21)
1681 .Case("sm_30", GK_SM30)
1682 .Case("sm_35", GK_SM35)
1683 .Case("sm_37", GK_SM37)
1684 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001685
Eric Christopherc48497a2015-09-18 21:26:24 +00001686 return GPU != GK_NONE;
1687 }
1688};
1689
1690const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1691#define BUILTIN(ID, TYPE, ATTRS) \
1692 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1693#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1694 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1695#include "clang/Basic/BuiltinsNVPTX.def"
1696};
1697
1698const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1699
Craig Topperf054e3a2015-10-19 03:52:27 +00001700ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1701 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001702}
1703
1704class NVPTX32TargetInfo : public NVPTXTargetInfo {
1705public:
1706 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001707 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001708 PointerWidth = PointerAlign = 32;
1709 SizeType = TargetInfo::UnsignedInt;
1710 PtrDiffType = TargetInfo::SignedInt;
1711 IntPtrType = TargetInfo::SignedInt;
1712 DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
1713 }
1714};
1715
1716class NVPTX64TargetInfo : public NVPTXTargetInfo {
1717public:
1718 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1719 PointerWidth = PointerAlign = 64;
1720 SizeType = TargetInfo::UnsignedLong;
1721 PtrDiffType = TargetInfo::SignedLong;
1722 IntPtrType = TargetInfo::SignedLong;
1723 DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64";
1724 }
1725};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001726
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001727static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001728 1, // opencl_global
1729 3, // opencl_local
1730 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001731 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001732 1, // cuda_device
1733 2, // cuda_constant
1734 3 // cuda_shared
1735};
1736
Tom Stellarda96344b2014-08-21 13:58:40 +00001737// If you edit the description strings, make sure you update
1738// getPointerWidthV().
1739
Craig Topper273dbc62015-10-18 05:29:26 +00001740static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001741 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1742 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001743
Craig Topper273dbc62015-10-18 05:29:26 +00001744static const char *const DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001745 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1746 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001747
Craig Topper273dbc62015-10-18 05:29:26 +00001748static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001749 "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 +00001750 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1751 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001752
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001753class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001754 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001755 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001756
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001757 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001758 enum GPUKind {
1759 GK_NONE,
1760 GK_R600,
1761 GK_R600_DOUBLE_OPS,
1762 GK_R700,
1763 GK_R700_DOUBLE_OPS,
1764 GK_EVERGREEN,
1765 GK_EVERGREEN_DOUBLE_OPS,
1766 GK_NORTHERN_ISLANDS,
1767 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001768 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001769 GK_SEA_ISLANDS,
1770 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001771 } GPU;
1772
Jan Veselyeebeaea2015-05-04 19:53:36 +00001773 bool hasFP64:1;
1774 bool hasFMAF:1;
1775 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001776
Eli Friedmand13b41e2012-10-12 23:32:00 +00001777public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001778 AMDGPUTargetInfo(const llvm::Triple &Triple)
1779 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001780
1781 if (Triple.getArch() == llvm::Triple::amdgcn) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001782 DataLayoutString = DataLayoutStringSI;
Tom Stellardd99fb952015-01-28 15:38:44 +00001783 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001784 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001785 hasFMAF = true;
1786 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001787 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001788 DataLayoutString = DataLayoutStringR600;
Tom Stellardd99fb952015-01-28 15:38:44 +00001789 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001790 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001791 hasFMAF = false;
1792 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001793 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001794 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001795 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001796 }
1797
Tom Stellarda96344b2014-08-21 13:58:40 +00001798 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1799 if (GPU <= GK_CAYMAN)
1800 return 32;
1801
1802 switch(AddrSpace) {
1803 default:
1804 return 64;
1805 case 0:
1806 case 3:
1807 case 5:
1808 return 32;
1809 }
1810 }
1811
Craig Topper3164f332014-03-11 03:39:26 +00001812 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001813 return "";
1814 }
1815
Craig Topperf054e3a2015-10-19 03:52:27 +00001816 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001817
Craig Topperf054e3a2015-10-19 03:52:27 +00001818 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1819 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001820 }
1821
Craig Topper3164f332014-03-11 03:39:26 +00001822 bool validateAsmConstraint(const char *&Name,
1823 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001824 return true;
1825 }
1826
Craig Topper3164f332014-03-11 03:39:26 +00001827 void getTargetBuiltins(const Builtin::Info *&Records,
1828 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001829 Records = BuiltinInfo;
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001830 NumRecords = clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001831 }
1832
Craig Topper3164f332014-03-11 03:39:26 +00001833 void getTargetDefines(const LangOptions &Opts,
1834 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001835 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001836 if (hasFMAF)
1837 Builder.defineMacro("__HAS_FMAF__");
1838 if (hasLDEXPF)
1839 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001840 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001841 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001842 if (Opts.OpenCL) {
1843 if (GPU >= GK_NORTHERN_ISLANDS) {
1844 Builder.defineMacro("cl_khr_byte_addressable_store");
1845 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1846 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1847 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1848 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1849 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001850 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001851 }
1852
Craig Topper3164f332014-03-11 03:39:26 +00001853 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001854 return TargetInfo::CharPtrBuiltinVaList;
1855 }
1856
Craig Topper3164f332014-03-11 03:39:26 +00001857 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001858 GPU = llvm::StringSwitch<GPUKind>(Name)
1859 .Case("r600" , GK_R600)
1860 .Case("rv610", GK_R600)
1861 .Case("rv620", GK_R600)
1862 .Case("rv630", GK_R600)
1863 .Case("rv635", GK_R600)
1864 .Case("rs780", GK_R600)
1865 .Case("rs880", GK_R600)
1866 .Case("rv670", GK_R600_DOUBLE_OPS)
1867 .Case("rv710", GK_R700)
1868 .Case("rv730", GK_R700)
1869 .Case("rv740", GK_R700_DOUBLE_OPS)
1870 .Case("rv770", GK_R700_DOUBLE_OPS)
1871 .Case("palm", GK_EVERGREEN)
1872 .Case("cedar", GK_EVERGREEN)
1873 .Case("sumo", GK_EVERGREEN)
1874 .Case("sumo2", GK_EVERGREEN)
1875 .Case("redwood", GK_EVERGREEN)
1876 .Case("juniper", GK_EVERGREEN)
1877 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1878 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1879 .Case("barts", GK_NORTHERN_ISLANDS)
1880 .Case("turks", GK_NORTHERN_ISLANDS)
1881 .Case("caicos", GK_NORTHERN_ISLANDS)
1882 .Case("cayman", GK_CAYMAN)
1883 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001884 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001885 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1886 .Case("verde", GK_SOUTHERN_ISLANDS)
1887 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001888 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001889 .Case("bonaire", GK_SEA_ISLANDS)
1890 .Case("kabini", GK_SEA_ISLANDS)
1891 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001892 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001893 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001894 .Case("tonga", GK_VOLCANIC_ISLANDS)
1895 .Case("iceland", GK_VOLCANIC_ISLANDS)
1896 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001897 .Default(GK_NONE);
1898
1899 if (GPU == GK_NONE) {
1900 return false;
1901 }
1902
1903 // Set the correct data layout
1904 switch (GPU) {
1905 case GK_NONE:
1906 case GK_R600:
1907 case GK_R700:
1908 case GK_EVERGREEN:
1909 case GK_NORTHERN_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001910 DataLayoutString = DataLayoutStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001911 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001912 hasFMAF = false;
1913 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001914 break;
1915 case GK_R600_DOUBLE_OPS:
1916 case GK_R700_DOUBLE_OPS:
1917 case GK_EVERGREEN_DOUBLE_OPS:
1918 case GK_CAYMAN:
Eric Christopher964a5f32015-08-05 23:48:05 +00001919 DataLayoutString = DataLayoutStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001920 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001921 hasFMAF = true;
1922 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001923 break;
1924 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001925 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001926 case GK_VOLCANIC_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001927 DataLayoutString = DataLayoutStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001928 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001929 hasFMAF = true;
1930 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001931 break;
1932 }
1933
1934 return true;
1935 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001936};
1937
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001938const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001939#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001940 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001941#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001942};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001943const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001944 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1945 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1946 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1947 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1948 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1949 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1950 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1951 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1952 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1953 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1954 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1955 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1956 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1957 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1958 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1959 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1960 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1961 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1962 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1963 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1964 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1965 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1966 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1967 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1968 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1969 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1970 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1971 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1972 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1973 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1974 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1975 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1976 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1977 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1978 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1979 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1980 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1981 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1982 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1983 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1984 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1985 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
1986 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
1987 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
1988 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
1989 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
1990 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
1991 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
1992 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
1993 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
1994};
1995
Craig Topperf054e3a2015-10-19 03:52:27 +00001996ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
1997 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00001998}
Matt Arsenault56f008d2014-06-24 20:45:01 +00001999
Eli Friedman3fd920a2008-08-20 02:34:37 +00002000// Namespace for x86 abstract base class
2001const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002002#define BUILTIN(ID, TYPE, ATTRS) \
2003 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002004#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002005 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002006#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002007 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002008#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002009};
Eli Friedmanb5366062008-05-20 14:21:01 +00002010
Nuno Lopescfca1f02009-12-23 17:49:57 +00002011static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002012 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2013 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002014 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002015 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2016 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2017 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002018 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002019 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2020 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002021};
2022
Eric Christophercdd36352011-06-21 00:05:20 +00002023const TargetInfo::AddlRegName AddlRegNames[] = {
2024 { { "al", "ah", "eax", "rax" }, 0 },
2025 { { "bl", "bh", "ebx", "rbx" }, 3 },
2026 { { "cl", "ch", "ecx", "rcx" }, 2 },
2027 { { "dl", "dh", "edx", "rdx" }, 1 },
2028 { { "esi", "rsi" }, 4 },
2029 { { "edi", "rdi" }, 5 },
2030 { { "esp", "rsp" }, 7 },
2031 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002032 { { "r8d", "r8w", "r8b" }, 38 },
2033 { { "r9d", "r9w", "r9b" }, 39 },
2034 { { "r10d", "r10w", "r10b" }, 40 },
2035 { { "r11d", "r11w", "r11b" }, 41 },
2036 { { "r12d", "r12w", "r12b" }, 42 },
2037 { { "r13d", "r13w", "r13b" }, 43 },
2038 { { "r14d", "r14w", "r14b" }, 44 },
2039 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002040};
2041
2042// X86 target abstract base class; x86-32 and x86-64 are very close, so
2043// most of the implementation can be shared.
2044class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002045 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002046 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002047 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002048 enum MMX3DNowEnum {
2049 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002050 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002051 enum XOPEnum {
2052 NoXOP,
2053 SSE4A,
2054 FMA4,
2055 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002056 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002057
Craig Topper543f3bd2015-10-14 23:47:57 +00002058 bool HasAES = false;
2059 bool HasPCLMUL = false;
2060 bool HasLZCNT = false;
2061 bool HasRDRND = false;
2062 bool HasFSGSBASE = false;
2063 bool HasBMI = false;
2064 bool HasBMI2 = false;
2065 bool HasPOPCNT = false;
2066 bool HasRTM = false;
2067 bool HasPRFCHW = false;
2068 bool HasRDSEED = false;
2069 bool HasADX = false;
2070 bool HasTBM = false;
2071 bool HasFMA = false;
2072 bool HasF16C = false;
2073 bool HasAVX512CD = false;
2074 bool HasAVX512ER = false;
2075 bool HasAVX512PF = false;
2076 bool HasAVX512DQ = false;
2077 bool HasAVX512BW = false;
2078 bool HasAVX512VL = false;
2079 bool HasSHA = false;
2080 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002081 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002082 bool HasXSAVE = false;
2083 bool HasXSAVEOPT = false;
2084 bool HasXSAVEC = false;
2085 bool HasXSAVES = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002086
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002087 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2088 ///
2089 /// Each enumeration represents a particular CPU supported by Clang. These
2090 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2091 enum CPUKind {
2092 CK_Generic,
2093
2094 /// \name i386
2095 /// i386-generation processors.
2096 //@{
2097 CK_i386,
2098 //@}
2099
2100 /// \name i486
2101 /// i486-generation processors.
2102 //@{
2103 CK_i486,
2104 CK_WinChipC6,
2105 CK_WinChip2,
2106 CK_C3,
2107 //@}
2108
2109 /// \name i586
2110 /// i586-generation processors, P5 microarchitecture based.
2111 //@{
2112 CK_i586,
2113 CK_Pentium,
2114 CK_PentiumMMX,
2115 //@}
2116
2117 /// \name i686
2118 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2119 //@{
2120 CK_i686,
2121 CK_PentiumPro,
2122 CK_Pentium2,
2123 CK_Pentium3,
2124 CK_Pentium3M,
2125 CK_PentiumM,
2126 CK_C3_2,
2127
2128 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2129 /// Clang however has some logic to suport this.
2130 // FIXME: Warn, deprecate, and potentially remove this.
2131 CK_Yonah,
2132 //@}
2133
2134 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002135 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002136 //@{
2137 CK_Pentium4,
2138 CK_Pentium4M,
2139 CK_Prescott,
2140 CK_Nocona,
2141 //@}
2142
2143 /// \name Core
2144 /// Core microarchitecture based processors.
2145 //@{
2146 CK_Core2,
2147
2148 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2149 /// codename which GCC no longer accepts as an option to -march, but Clang
2150 /// has some logic for recognizing it.
2151 // FIXME: Warn, deprecate, and potentially remove this.
2152 CK_Penryn,
2153 //@}
2154
2155 /// \name Atom
2156 /// Atom processors
2157 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002158 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002159 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002160 //@}
2161
2162 /// \name Nehalem
2163 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002164 CK_Nehalem,
2165
2166 /// \name Westmere
2167 /// Westmere microarchitecture based processors.
2168 CK_Westmere,
2169
2170 /// \name Sandy Bridge
2171 /// Sandy Bridge microarchitecture based processors.
2172 CK_SandyBridge,
2173
2174 /// \name Ivy Bridge
2175 /// Ivy Bridge microarchitecture based processors.
2176 CK_IvyBridge,
2177
2178 /// \name Haswell
2179 /// Haswell microarchitecture based processors.
2180 CK_Haswell,
2181
2182 /// \name Broadwell
2183 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002184 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002185
2186 /// \name Skylake
2187 /// Skylake microarchitecture based processors.
2188 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002189
Craig Topper449314e2013-08-20 07:09:39 +00002190 /// \name Knights Landing
2191 /// Knights Landing processor.
2192 CK_KNL,
2193
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002194 /// \name K6
2195 /// K6 architecture processors.
2196 //@{
2197 CK_K6,
2198 CK_K6_2,
2199 CK_K6_3,
2200 //@}
2201
2202 /// \name K7
2203 /// K7 architecture processors.
2204 //@{
2205 CK_Athlon,
2206 CK_AthlonThunderbird,
2207 CK_Athlon4,
2208 CK_AthlonXP,
2209 CK_AthlonMP,
2210 //@}
2211
2212 /// \name K8
2213 /// K8 architecture processors.
2214 //@{
2215 CK_Athlon64,
2216 CK_Athlon64SSE3,
2217 CK_AthlonFX,
2218 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002219 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002220 CK_Opteron,
2221 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002222 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002223 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002224
Benjamin Kramer569f2152012-01-10 11:50:18 +00002225 /// \name Bobcat
2226 /// Bobcat architecture processors.
2227 //@{
2228 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002229 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002230 //@}
2231
2232 /// \name Bulldozer
2233 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002234 //@{
2235 CK_BDVER1,
2236 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002237 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002238 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002239 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002240
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002241 /// This specification is deprecated and will be removed in the future.
2242 /// Users should prefer \see CK_K8.
2243 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002244 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002245 CK_x86_64,
2246 //@}
2247
2248 /// \name Geode
2249 /// Geode processors.
2250 //@{
2251 CK_Geode
2252 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002253 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002254
Eric Christopherc50738f2015-08-27 00:05:50 +00002255 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002256 return llvm::StringSwitch<CPUKind>(CPU)
2257 .Case("i386", CK_i386)
2258 .Case("i486", CK_i486)
2259 .Case("winchip-c6", CK_WinChipC6)
2260 .Case("winchip2", CK_WinChip2)
2261 .Case("c3", CK_C3)
2262 .Case("i586", CK_i586)
2263 .Case("pentium", CK_Pentium)
2264 .Case("pentium-mmx", CK_PentiumMMX)
2265 .Case("i686", CK_i686)
2266 .Case("pentiumpro", CK_PentiumPro)
2267 .Case("pentium2", CK_Pentium2)
2268 .Case("pentium3", CK_Pentium3)
2269 .Case("pentium3m", CK_Pentium3M)
2270 .Case("pentium-m", CK_PentiumM)
2271 .Case("c3-2", CK_C3_2)
2272 .Case("yonah", CK_Yonah)
2273 .Case("pentium4", CK_Pentium4)
2274 .Case("pentium4m", CK_Pentium4M)
2275 .Case("prescott", CK_Prescott)
2276 .Case("nocona", CK_Nocona)
2277 .Case("core2", CK_Core2)
2278 .Case("penryn", CK_Penryn)
2279 .Case("bonnell", CK_Bonnell)
2280 .Case("atom", CK_Bonnell) // Legacy name.
2281 .Case("silvermont", CK_Silvermont)
2282 .Case("slm", CK_Silvermont) // Legacy name.
2283 .Case("nehalem", CK_Nehalem)
2284 .Case("corei7", CK_Nehalem) // Legacy name.
2285 .Case("westmere", CK_Westmere)
2286 .Case("sandybridge", CK_SandyBridge)
2287 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2288 .Case("ivybridge", CK_IvyBridge)
2289 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2290 .Case("haswell", CK_Haswell)
2291 .Case("core-avx2", CK_Haswell) // Legacy name.
2292 .Case("broadwell", CK_Broadwell)
2293 .Case("skylake", CK_Skylake)
2294 .Case("skx", CK_Skylake) // Legacy name.
2295 .Case("knl", CK_KNL)
2296 .Case("k6", CK_K6)
2297 .Case("k6-2", CK_K6_2)
2298 .Case("k6-3", CK_K6_3)
2299 .Case("athlon", CK_Athlon)
2300 .Case("athlon-tbird", CK_AthlonThunderbird)
2301 .Case("athlon-4", CK_Athlon4)
2302 .Case("athlon-xp", CK_AthlonXP)
2303 .Case("athlon-mp", CK_AthlonMP)
2304 .Case("athlon64", CK_Athlon64)
2305 .Case("athlon64-sse3", CK_Athlon64SSE3)
2306 .Case("athlon-fx", CK_AthlonFX)
2307 .Case("k8", CK_K8)
2308 .Case("k8-sse3", CK_K8SSE3)
2309 .Case("opteron", CK_Opteron)
2310 .Case("opteron-sse3", CK_OpteronSSE3)
2311 .Case("barcelona", CK_AMDFAM10)
2312 .Case("amdfam10", CK_AMDFAM10)
2313 .Case("btver1", CK_BTVER1)
2314 .Case("btver2", CK_BTVER2)
2315 .Case("bdver1", CK_BDVER1)
2316 .Case("bdver2", CK_BDVER2)
2317 .Case("bdver3", CK_BDVER3)
2318 .Case("bdver4", CK_BDVER4)
2319 .Case("x86-64", CK_x86_64)
2320 .Case("geode", CK_Geode)
2321 .Default(CK_Generic);
2322 }
2323
Rafael Espindolaeb265472013-08-21 21:59:03 +00002324 enum FPMathKind {
2325 FP_Default,
2326 FP_SSE,
2327 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002328 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002329
Eli Friedman3fd920a2008-08-20 02:34:37 +00002330public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002331 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002332 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002333 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002334 }
Craig Topper3164f332014-03-11 03:39:26 +00002335 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002336 // X87 evaluates with 80 bits "long double" precision.
2337 return SSELevel == NoSSE ? 2 : 0;
2338 }
Craig Topper3164f332014-03-11 03:39:26 +00002339 void getTargetBuiltins(const Builtin::Info *&Records,
2340 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002341 Records = BuiltinInfo;
2342 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002343 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002344 ArrayRef<const char *> getGCCRegNames() const override {
2345 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002346 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002347 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2348 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002349 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002350 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2351 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002352 }
Eric Christopherd9832702015-06-29 21:00:05 +00002353 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002354 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002355 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002356
Akira Hatanaka974131e2014-09-18 18:17:18 +00002357 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2358
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002359 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2360
Akira Hatanaka974131e2014-09-18 18:17:18 +00002361 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2362
Craig Topper3164f332014-03-11 03:39:26 +00002363 std::string convertConstraint(const char *&Constraint) const override;
2364 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002365 return "~{dirflag},~{fpsr},~{flags}";
2366 }
Craig Topper3164f332014-03-11 03:39:26 +00002367 void getTargetDefines(const LangOptions &Opts,
2368 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002369 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2370 bool Enabled);
2371 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2372 bool Enabled);
2373 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2374 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002375 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2376 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002377 setFeatureEnabledImpl(Features, Name, Enabled);
2378 }
2379 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002380 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002381 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2382 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002383 bool
2384 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2385 StringRef CPU,
2386 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002387 bool hasFeature(StringRef Feature) const override;
2388 bool handleTargetFeatures(std::vector<std::string> &Features,
2389 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002390 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002391 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2392 return "avx512";
2393 else if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002394 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002395 else if (getTriple().getArch() == llvm::Triple::x86 &&
2396 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002397 return "no-mmx";
2398 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002399 }
Craig Topper3164f332014-03-11 03:39:26 +00002400 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002401 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002402
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002403 // Perform any per-CPU checks necessary to determine if this CPU is
2404 // acceptable.
2405 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2406 // invalid without explaining *why*.
2407 switch (CPU) {
2408 case CK_Generic:
2409 // No processor selected!
2410 return false;
2411
2412 case CK_i386:
2413 case CK_i486:
2414 case CK_WinChipC6:
2415 case CK_WinChip2:
2416 case CK_C3:
2417 case CK_i586:
2418 case CK_Pentium:
2419 case CK_PentiumMMX:
2420 case CK_i686:
2421 case CK_PentiumPro:
2422 case CK_Pentium2:
2423 case CK_Pentium3:
2424 case CK_Pentium3M:
2425 case CK_PentiumM:
2426 case CK_Yonah:
2427 case CK_C3_2:
2428 case CK_Pentium4:
2429 case CK_Pentium4M:
2430 case CK_Prescott:
2431 case CK_K6:
2432 case CK_K6_2:
2433 case CK_K6_3:
2434 case CK_Athlon:
2435 case CK_AthlonThunderbird:
2436 case CK_Athlon4:
2437 case CK_AthlonXP:
2438 case CK_AthlonMP:
2439 case CK_Geode:
2440 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002441 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002442 return false;
2443
2444 // Fallthrough
2445 case CK_Nocona:
2446 case CK_Core2:
2447 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002448 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002449 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002450 case CK_Nehalem:
2451 case CK_Westmere:
2452 case CK_SandyBridge:
2453 case CK_IvyBridge:
2454 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002455 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002456 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002457 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002458 case CK_Athlon64:
2459 case CK_Athlon64SSE3:
2460 case CK_AthlonFX:
2461 case CK_K8:
2462 case CK_K8SSE3:
2463 case CK_Opteron:
2464 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002465 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002466 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002467 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002468 case CK_BDVER1:
2469 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002470 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002471 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002472 case CK_x86_64:
2473 return true;
2474 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002475 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002476 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002477
Craig Topper3164f332014-03-11 03:39:26 +00002478 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002479
Craig Topper3164f332014-03-11 03:39:26 +00002480 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002481 // We accept all non-ARM calling conventions
2482 return (CC == CC_X86ThisCall ||
2483 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002484 CC == CC_X86StdCall ||
2485 CC == CC_X86VectorCall ||
2486 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002487 CC == CC_X86Pascal ||
2488 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002489 }
2490
Craig Topper3164f332014-03-11 03:39:26 +00002491 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002492 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002493 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002494
2495 bool hasSjLjLowering() const override {
2496 return true;
2497 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002498};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002499
Rafael Espindolaeb265472013-08-21 21:59:03 +00002500bool X86TargetInfo::setFPMath(StringRef Name) {
2501 if (Name == "387") {
2502 FPMath = FP_387;
2503 return true;
2504 }
2505 if (Name == "sse") {
2506 FPMath = FP_SSE;
2507 return true;
2508 }
2509 return false;
2510}
2511
Eric Christopher007b0a02015-08-28 22:32:01 +00002512bool X86TargetInfo::initFeatureMap(
2513 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002514 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002515 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002516 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002517 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002518 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002519
Eric Christopher2b4a7252015-08-27 00:05:52 +00002520 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002521 case CK_Generic:
2522 case CK_i386:
2523 case CK_i486:
2524 case CK_i586:
2525 case CK_Pentium:
2526 case CK_i686:
2527 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002528 break;
2529 case CK_PentiumMMX:
2530 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002531 case CK_K6:
2532 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002533 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002534 break;
2535 case CK_Pentium3:
2536 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002537 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002538 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002539 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002540 break;
2541 case CK_PentiumM:
2542 case CK_Pentium4:
2543 case CK_Pentium4M:
2544 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002545 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002546 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002547 break;
2548 case CK_Yonah:
2549 case CK_Prescott:
2550 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002551 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002552 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002553 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002554 break;
2555 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002556 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002557 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002558 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002559 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002560 break;
2561 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002562 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002563 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002564 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002565 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002566 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002567 setFeatureEnabledImpl(Features, "avx512f", true);
2568 setFeatureEnabledImpl(Features, "avx512cd", true);
2569 setFeatureEnabledImpl(Features, "avx512dq", true);
2570 setFeatureEnabledImpl(Features, "avx512bw", true);
2571 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002572 setFeatureEnabledImpl(Features, "xsavec", true);
2573 setFeatureEnabledImpl(Features, "xsaves", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002574 // FALLTHROUGH
2575 case CK_Broadwell:
2576 setFeatureEnabledImpl(Features, "rdseed", true);
2577 setFeatureEnabledImpl(Features, "adx", true);
2578 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002579 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002580 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002581 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002582 setFeatureEnabledImpl(Features, "bmi", true);
2583 setFeatureEnabledImpl(Features, "bmi2", true);
2584 setFeatureEnabledImpl(Features, "rtm", true);
2585 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002586 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002587 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002588 setFeatureEnabledImpl(Features, "rdrnd", true);
2589 setFeatureEnabledImpl(Features, "f16c", true);
2590 setFeatureEnabledImpl(Features, "fsgsbase", true);
2591 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002592 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002593 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002594 setFeatureEnabledImpl(Features, "xsave", true);
2595 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002596 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002597 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002598 case CK_Silvermont:
2599 setFeatureEnabledImpl(Features, "aes", true);
2600 setFeatureEnabledImpl(Features, "pclmul", true);
2601 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002602 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002603 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002604 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002605 setFeatureEnabledImpl(Features, "cx16", true);
2606 break;
2607 case CK_KNL:
2608 setFeatureEnabledImpl(Features, "avx512f", true);
2609 setFeatureEnabledImpl(Features, "avx512cd", true);
2610 setFeatureEnabledImpl(Features, "avx512er", true);
2611 setFeatureEnabledImpl(Features, "avx512pf", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002612 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002613 setFeatureEnabledImpl(Features, "rdseed", true);
2614 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002615 setFeatureEnabledImpl(Features, "lzcnt", true);
2616 setFeatureEnabledImpl(Features, "bmi", true);
2617 setFeatureEnabledImpl(Features, "bmi2", true);
2618 setFeatureEnabledImpl(Features, "rtm", true);
2619 setFeatureEnabledImpl(Features, "fma", true);
2620 setFeatureEnabledImpl(Features, "rdrnd", true);
2621 setFeatureEnabledImpl(Features, "f16c", true);
2622 setFeatureEnabledImpl(Features, "fsgsbase", true);
2623 setFeatureEnabledImpl(Features, "aes", true);
2624 setFeatureEnabledImpl(Features, "pclmul", true);
2625 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002626 setFeatureEnabledImpl(Features, "xsaveopt", true);
2627 setFeatureEnabledImpl(Features, "xsave", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002628 break;
2629 case CK_K6_2:
2630 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002631 case CK_WinChip2:
2632 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002633 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002634 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002635 case CK_Athlon:
2636 case CK_AthlonThunderbird:
2637 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002638 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002639 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002640 case CK_Athlon4:
2641 case CK_AthlonXP:
2642 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002643 setFeatureEnabledImpl(Features, "sse", true);
2644 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002645 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002646 break;
2647 case CK_K8:
2648 case CK_Opteron:
2649 case CK_Athlon64:
2650 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002651 setFeatureEnabledImpl(Features, "sse2", true);
2652 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002653 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002654 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002655 case CK_AMDFAM10:
2656 setFeatureEnabledImpl(Features, "sse4a", true);
2657 setFeatureEnabledImpl(Features, "lzcnt", true);
2658 setFeatureEnabledImpl(Features, "popcnt", true);
2659 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002660 case CK_K8SSE3:
2661 case CK_OpteronSSE3:
2662 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002663 setFeatureEnabledImpl(Features, "sse3", true);
2664 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002665 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002666 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002667 case CK_BTVER2:
2668 setFeatureEnabledImpl(Features, "avx", true);
2669 setFeatureEnabledImpl(Features, "aes", true);
2670 setFeatureEnabledImpl(Features, "pclmul", true);
2671 setFeatureEnabledImpl(Features, "bmi", true);
2672 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002673 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002674 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002675 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002676 setFeatureEnabledImpl(Features, "ssse3", true);
2677 setFeatureEnabledImpl(Features, "sse4a", true);
2678 setFeatureEnabledImpl(Features, "lzcnt", true);
2679 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002680 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002681 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002682 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002683 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002684 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002685 case CK_BDVER4:
2686 setFeatureEnabledImpl(Features, "avx2", true);
2687 setFeatureEnabledImpl(Features, "bmi2", true);
2688 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002689 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002690 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002691 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002692 // FALLTHROUGH
2693 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002694 setFeatureEnabledImpl(Features, "bmi", true);
2695 setFeatureEnabledImpl(Features, "fma", true);
2696 setFeatureEnabledImpl(Features, "f16c", true);
2697 setFeatureEnabledImpl(Features, "tbm", true);
2698 // FALLTHROUGH
2699 case CK_BDVER1:
2700 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002701 setFeatureEnabledImpl(Features, "xop", true);
2702 setFeatureEnabledImpl(Features, "lzcnt", true);
2703 setFeatureEnabledImpl(Features, "aes", true);
2704 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002705 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002706 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002707 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002708 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002709 break;
Eli Friedman33465822011-07-08 23:31:17 +00002710 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002711 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2712 return false;
2713
2714 // Can't do this earlier because we need to be able to explicitly enable
2715 // or disable these features and the things that they depend upon.
2716
2717 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2718 auto I = Features.find("sse4.2");
2719 if (I != Features.end() && I->getValue() == true &&
2720 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2721 FeaturesVec.end())
2722 Features["popcnt"] = true;
2723
2724 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2725 I = Features.find("3dnow");
2726 if (I != Features.end() && I->getValue() == true &&
2727 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2728 FeaturesVec.end())
2729 Features["prfchw"] = true;
2730
Eric Christophera7260af2015-10-08 20:10:18 +00002731 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2732 // then enable MMX.
2733 I = Features.find("sse");
2734 if (I != Features.end() && I->getValue() == true &&
2735 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2736 FeaturesVec.end())
2737 Features["mmx"] = true;
2738
Eric Christopherbbd746d2015-10-08 20:10:14 +00002739 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002740}
2741
Rafael Espindolae62e2792013-08-20 13:44:29 +00002742void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002743 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002744 if (Enabled) {
2745 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002746 case AVX512F:
2747 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002748 case AVX2:
2749 Features["avx2"] = true;
2750 case AVX:
2751 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002752 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002753 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002754 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002755 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002756 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002757 case SSSE3:
2758 Features["ssse3"] = true;
2759 case SSE3:
2760 Features["sse3"] = true;
2761 case SSE2:
2762 Features["sse2"] = true;
2763 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002764 Features["sse"] = true;
2765 case NoSSE:
2766 break;
2767 }
2768 return;
2769 }
2770
2771 switch (Level) {
2772 case NoSSE:
2773 case SSE1:
2774 Features["sse"] = false;
2775 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002776 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2777 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002778 case SSE3:
2779 Features["sse3"] = false;
2780 setXOPLevel(Features, NoXOP, false);
2781 case SSSE3:
2782 Features["ssse3"] = false;
2783 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002784 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002785 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002786 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002787 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002788 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2789 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002790 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002791 case AVX2:
2792 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002793 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002794 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002795 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2796 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002797 }
2798}
2799
2800void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002801 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002802 if (Enabled) {
2803 switch (Level) {
2804 case AMD3DNowAthlon:
2805 Features["3dnowa"] = true;
2806 case AMD3DNow:
2807 Features["3dnow"] = true;
2808 case MMX:
2809 Features["mmx"] = true;
2810 case NoMMX3DNow:
2811 break;
2812 }
2813 return;
2814 }
2815
2816 switch (Level) {
2817 case NoMMX3DNow:
2818 case MMX:
2819 Features["mmx"] = false;
2820 case AMD3DNow:
2821 Features["3dnow"] = false;
2822 case AMD3DNowAthlon:
2823 Features["3dnowa"] = false;
2824 }
2825}
2826
2827void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002828 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002829 if (Enabled) {
2830 switch (Level) {
2831 case XOP:
2832 Features["xop"] = true;
2833 case FMA4:
2834 Features["fma4"] = true;
2835 setSSELevel(Features, AVX, true);
2836 case SSE4A:
2837 Features["sse4a"] = true;
2838 setSSELevel(Features, SSE3, true);
2839 case NoXOP:
2840 break;
2841 }
2842 return;
2843 }
2844
2845 switch (Level) {
2846 case NoXOP:
2847 case SSE4A:
2848 Features["sse4a"] = false;
2849 case FMA4:
2850 Features["fma4"] = false;
2851 case XOP:
2852 Features["xop"] = false;
2853 }
2854}
2855
Craig Topper86d79ef2013-09-17 04:51:29 +00002856void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2857 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002858 // This is a bit of a hack to deal with the sse4 target feature when used
2859 // as part of the target attribute. We handle sse4 correctly everywhere
2860 // else. See below for more information on how we handle the sse4 options.
2861 if (Name != "sse4")
2862 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002863
Craig Topper29561122013-09-19 01:13:07 +00002864 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002865 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002866 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002867 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002868 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002869 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002870 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002871 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002872 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002873 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002874 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002875 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002876 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002877 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002878 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002879 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002880 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002881 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002882 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002883 if (Enabled)
2884 setSSELevel(Features, SSE2, Enabled);
2885 } else if (Name == "pclmul") {
2886 if (Enabled)
2887 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002888 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002889 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002890 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002891 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002892 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002893 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002894 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2895 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002896 if (Enabled)
2897 setSSELevel(Features, AVX512F, Enabled);
2898 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002899 if (Enabled)
2900 setSSELevel(Features, AVX, Enabled);
2901 } else if (Name == "fma4") {
2902 setXOPLevel(Features, FMA4, Enabled);
2903 } else if (Name == "xop") {
2904 setXOPLevel(Features, XOP, Enabled);
2905 } else if (Name == "sse4a") {
2906 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002907 } else if (Name == "f16c") {
2908 if (Enabled)
2909 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002910 } else if (Name == "sha") {
2911 if (Enabled)
2912 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002913 } else if (Name == "sse4") {
2914 // We can get here via the __target__ attribute since that's not controlled
2915 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2916 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2917 // disabled.
2918 if (Enabled)
2919 setSSELevel(Features, SSE42, Enabled);
2920 else
2921 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00002922 } else if (Name == "xsave") {
2923 if (Enabled)
2924 setSSELevel(Features, AVX, Enabled);
2925 else
2926 Features["xsaveopt"] = false;
2927 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
2928 if (Enabled) {
2929 Features["xsave"] = true;
2930 setSSELevel(Features, AVX, Enabled);
2931 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002932 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002933}
2934
Eric Christopher3ff21b32013-10-16 21:26:26 +00002935/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002936/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002937bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002938 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00002939 for (const auto &Feature : Features) {
2940 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00002941 continue;
2942
Eric Christopher610fe112015-08-26 08:21:55 +00002943 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002944 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002945 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00002946 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002947 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002948 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002949 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002950 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002951 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00002952 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002953 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002954 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002955 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002956 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002957 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002958 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002959 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00002960 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002961 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00002962 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002963 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00002964 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002965 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00002966 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002967 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002968 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002969 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00002970 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002971 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00002972 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002973 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00002974 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002975 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00002976 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002977 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002978 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002979 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002980 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002981 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002982 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002983 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002984 HasAVX512VL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002985 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00002986 HasSHA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002987 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00002988 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00002989 } else if (Feature == "+fxsr") {
2990 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002991 } else if (Feature == "+xsave") {
2992 HasXSAVE = true;
2993 } else if (Feature == "+xsaveopt") {
2994 HasXSAVEOPT = true;
2995 } else if (Feature == "+xsavec") {
2996 HasXSAVEC = true;
2997 } else if (Feature == "+xsaves") {
2998 HasXSAVES = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002999 }
3000
Benjamin Kramer27402c62012-03-05 15:10:44 +00003001 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003002 .Case("+avx512f", AVX512F)
3003 .Case("+avx2", AVX2)
3004 .Case("+avx", AVX)
3005 .Case("+sse4.2", SSE42)
3006 .Case("+sse4.1", SSE41)
3007 .Case("+ssse3", SSSE3)
3008 .Case("+sse3", SSE3)
3009 .Case("+sse2", SSE2)
3010 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003011 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003012 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003013
Eli Friedman33465822011-07-08 23:31:17 +00003014 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003015 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003016 .Case("+3dnowa", AMD3DNowAthlon)
3017 .Case("+3dnow", AMD3DNow)
3018 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003019 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003020 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003021
3022 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003023 .Case("+xop", XOP)
3024 .Case("+fma4", FMA4)
3025 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003026 .Default(NoXOP);
3027 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003028 }
Eli Friedman33465822011-07-08 23:31:17 +00003029
Rafael Espindolaeb265472013-08-21 21:59:03 +00003030 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3031 // matches the selected sse level.
3032 if (FPMath == FP_SSE && SSELevel < SSE1) {
3033 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
3034 return false;
3035 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
3036 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
3037 return false;
3038 }
3039
Alexey Bataev00396512015-07-02 03:40:19 +00003040 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003041 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003042 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003043}
Chris Lattnerecd49032009-03-02 22:27:17 +00003044
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003045/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3046/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003047void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003048 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003049 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003050 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003051 Builder.defineMacro("__amd64__");
3052 Builder.defineMacro("__amd64");
3053 Builder.defineMacro("__x86_64");
3054 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003055 if (getTriple().getArchName() == "x86_64h") {
3056 Builder.defineMacro("__x86_64h");
3057 Builder.defineMacro("__x86_64h__");
3058 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003059 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003060 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003061 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003062
Chris Lattnerecd49032009-03-02 22:27:17 +00003063 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003064 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3065 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003066 switch (CPU) {
3067 case CK_Generic:
3068 break;
3069 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003070 // The rest are coming from the i386 define above.
3071 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003072 break;
3073 case CK_i486:
3074 case CK_WinChipC6:
3075 case CK_WinChip2:
3076 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003077 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003078 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003079 case CK_PentiumMMX:
3080 Builder.defineMacro("__pentium_mmx__");
3081 Builder.defineMacro("__tune_pentium_mmx__");
3082 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003083 case CK_i586:
3084 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003085 defineCPUMacros(Builder, "i586");
3086 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003087 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003088 case CK_Pentium3:
3089 case CK_Pentium3M:
3090 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003091 Builder.defineMacro("__tune_pentium3__");
3092 // Fallthrough
3093 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003094 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003095 Builder.defineMacro("__tune_pentium2__");
3096 // Fallthrough
3097 case CK_PentiumPro:
3098 Builder.defineMacro("__tune_i686__");
3099 Builder.defineMacro("__tune_pentiumpro__");
3100 // Fallthrough
3101 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003102 Builder.defineMacro("__i686");
3103 Builder.defineMacro("__i686__");
3104 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3105 Builder.defineMacro("__pentiumpro");
3106 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003107 break;
3108 case CK_Pentium4:
3109 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003110 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003111 break;
3112 case CK_Yonah:
3113 case CK_Prescott:
3114 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003115 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003116 break;
3117 case CK_Core2:
3118 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003119 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003120 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003121 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003122 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003123 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003124 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003125 defineCPUMacros(Builder, "slm");
3126 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003127 case CK_Nehalem:
3128 case CK_Westmere:
3129 case CK_SandyBridge:
3130 case CK_IvyBridge:
3131 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003132 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003133 // FIXME: Historically, we defined this legacy name, it would be nice to
3134 // remove it at some point. We've never exposed fine-grained names for
3135 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003136 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003137 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003138 case CK_Skylake:
3139 // FIXME: Historically, we defined this legacy name, it would be nice to
3140 // remove it at some point. This is the only fine-grained CPU macro in the
3141 // main intel CPU line, and it would be better to not have these and force
3142 // people to use ISA macros.
3143 defineCPUMacros(Builder, "skx");
3144 break;
Craig Topper449314e2013-08-20 07:09:39 +00003145 case CK_KNL:
3146 defineCPUMacros(Builder, "knl");
3147 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003148 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003149 Builder.defineMacro("__k6_2__");
3150 Builder.defineMacro("__tune_k6_2__");
3151 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003152 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003153 if (CPU != CK_K6_2) { // In case of fallthrough
3154 // FIXME: GCC may be enabling these in cases where some other k6
3155 // architecture is specified but -m3dnow is explicitly provided. The
3156 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003157 Builder.defineMacro("__k6_3__");
3158 Builder.defineMacro("__tune_k6_3__");
3159 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003160 // Fallthrough
3161 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003162 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003163 break;
3164 case CK_Athlon:
3165 case CK_AthlonThunderbird:
3166 case CK_Athlon4:
3167 case CK_AthlonXP:
3168 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003169 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003170 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003171 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003172 Builder.defineMacro("__tune_athlon_sse__");
3173 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003174 break;
3175 case CK_K8:
3176 case CK_K8SSE3:
3177 case CK_x86_64:
3178 case CK_Opteron:
3179 case CK_OpteronSSE3:
3180 case CK_Athlon64:
3181 case CK_Athlon64SSE3:
3182 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003183 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003184 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003185 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003186 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003187 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003188 case CK_BTVER1:
3189 defineCPUMacros(Builder, "btver1");
3190 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003191 case CK_BTVER2:
3192 defineCPUMacros(Builder, "btver2");
3193 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003194 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003195 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003196 break;
3197 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003198 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003199 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003200 case CK_BDVER3:
3201 defineCPUMacros(Builder, "bdver3");
3202 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003203 case CK_BDVER4:
3204 defineCPUMacros(Builder, "bdver4");
3205 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003206 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003207 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003208 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003209 }
Chris Lattner96e43572009-03-02 22:40:39 +00003210
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003211 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003212 Builder.defineMacro("__REGISTER_PREFIX__", "");
3213
Chris Lattner6df41af2009-04-19 17:32:33 +00003214 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3215 // functions in glibc header files that use FP Stack inline asm which the
3216 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003217 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003218
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003219 if (HasAES)
3220 Builder.defineMacro("__AES__");
3221
Craig Topper3f122a72012-05-31 05:18:48 +00003222 if (HasPCLMUL)
3223 Builder.defineMacro("__PCLMUL__");
3224
Craig Topper22967d42011-12-25 05:06:45 +00003225 if (HasLZCNT)
3226 Builder.defineMacro("__LZCNT__");
3227
Benjamin Kramer1e250392012-07-07 09:39:18 +00003228 if (HasRDRND)
3229 Builder.defineMacro("__RDRND__");
3230
Craig Topper8c7f2512014-11-03 06:51:41 +00003231 if (HasFSGSBASE)
3232 Builder.defineMacro("__FSGSBASE__");
3233
Craig Topper22967d42011-12-25 05:06:45 +00003234 if (HasBMI)
3235 Builder.defineMacro("__BMI__");
3236
3237 if (HasBMI2)
3238 Builder.defineMacro("__BMI2__");
3239
Craig Topper1de83482011-12-29 16:10:46 +00003240 if (HasPOPCNT)
3241 Builder.defineMacro("__POPCNT__");
3242
Michael Liao625a8752012-11-10 05:17:46 +00003243 if (HasRTM)
3244 Builder.defineMacro("__RTM__");
3245
Michael Liao74f4eaf2013-03-26 17:52:08 +00003246 if (HasPRFCHW)
3247 Builder.defineMacro("__PRFCHW__");
3248
Michael Liaoffaae352013-03-29 05:17:55 +00003249 if (HasRDSEED)
3250 Builder.defineMacro("__RDSEED__");
3251
Robert Khasanov50e6f582014-09-19 09:53:48 +00003252 if (HasADX)
3253 Builder.defineMacro("__ADX__");
3254
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003255 if (HasTBM)
3256 Builder.defineMacro("__TBM__");
3257
Rafael Espindolae62e2792013-08-20 13:44:29 +00003258 switch (XOPLevel) {
3259 case XOP:
3260 Builder.defineMacro("__XOP__");
3261 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003262 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003263 case SSE4A:
3264 Builder.defineMacro("__SSE4A__");
3265 case NoXOP:
3266 break;
3267 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003268
Craig Topperbba778b2012-06-03 21:46:30 +00003269 if (HasFMA)
3270 Builder.defineMacro("__FMA__");
3271
Manman Rena45358c2012-10-11 00:59:55 +00003272 if (HasF16C)
3273 Builder.defineMacro("__F16C__");
3274
Craig Topper679b53a2013-08-21 05:29:10 +00003275 if (HasAVX512CD)
3276 Builder.defineMacro("__AVX512CD__");
3277 if (HasAVX512ER)
3278 Builder.defineMacro("__AVX512ER__");
3279 if (HasAVX512PF)
3280 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003281 if (HasAVX512DQ)
3282 Builder.defineMacro("__AVX512DQ__");
3283 if (HasAVX512BW)
3284 Builder.defineMacro("__AVX512BW__");
3285 if (HasAVX512VL)
3286 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003287
Ben Langmuir58078d02013-09-19 13:22:04 +00003288 if (HasSHA)
3289 Builder.defineMacro("__SHA__");
3290
Craig Toppere33f51f2015-10-16 06:22:36 +00003291 if (HasFXSR)
3292 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003293 if (HasXSAVE)
3294 Builder.defineMacro("__XSAVE__");
3295 if (HasXSAVEOPT)
3296 Builder.defineMacro("__XSAVEOPT__");
3297 if (HasXSAVEC)
3298 Builder.defineMacro("__XSAVEC__");
3299 if (HasXSAVES)
3300 Builder.defineMacro("__XSAVES__");
3301
Nick Lewycky50e8f482013-10-05 20:14:27 +00003302 if (HasCX16)
3303 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3304
Chris Lattner96e43572009-03-02 22:40:39 +00003305 // Each case falls through to the previous one here.
3306 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003307 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003308 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003309 case AVX2:
3310 Builder.defineMacro("__AVX2__");
3311 case AVX:
3312 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003313 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003314 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003315 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003316 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003317 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003318 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003319 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003320 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003321 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003322 Builder.defineMacro("__SSE2__");
3323 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003324 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003325 Builder.defineMacro("__SSE__");
3326 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003327 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003328 break;
3329 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003330
Derek Schuffc7dd7222012-10-11 15:52:22 +00003331 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003332 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003333 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003334 case AVX2:
3335 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003336 case SSE42:
3337 case SSE41:
3338 case SSSE3:
3339 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003340 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003341 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003342 break;
3343 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003344 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003345 break;
3346 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003347 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003348 }
3349 }
3350
Anders Carlssone437c682010-01-27 03:47:49 +00003351 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003352 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003353 case AMD3DNowAthlon:
3354 Builder.defineMacro("__3dNOW_A__");
3355 case AMD3DNow:
3356 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003357 case MMX:
3358 Builder.defineMacro("__MMX__");
3359 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003360 break;
3361 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003362
3363 if (CPU >= CK_i486) {
3364 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3365 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3366 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3367 }
3368 if (CPU >= CK_i586)
3369 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003370}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003371
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003372bool X86TargetInfo::hasFeature(StringRef Feature) const {
3373 return llvm::StringSwitch<bool>(Feature)
3374 .Case("aes", HasAES)
3375 .Case("avx", SSELevel >= AVX)
3376 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003377 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003378 .Case("avx512cd", HasAVX512CD)
3379 .Case("avx512er", HasAVX512ER)
3380 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003381 .Case("avx512dq", HasAVX512DQ)
3382 .Case("avx512bw", HasAVX512BW)
3383 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003384 .Case("bmi", HasBMI)
3385 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003386 .Case("cx16", HasCX16)
3387 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003388 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003389 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003390 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003391 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003392 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003393 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3394 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3395 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003396 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003397 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003398 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003399 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003400 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003401 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003402 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003403 .Case("sse", SSELevel >= SSE1)
3404 .Case("sse2", SSELevel >= SSE2)
3405 .Case("sse3", SSELevel >= SSE3)
3406 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003407 .Case("sse4.1", SSELevel >= SSE41)
3408 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003409 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003410 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003411 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003412 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3413 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003414 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003415 .Case("xsave", HasXSAVE)
3416 .Case("xsavec", HasXSAVEC)
3417 .Case("xsaves", HasXSAVES)
3418 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003419 .Default(false);
3420}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003421
Eric Christopherd9832702015-06-29 21:00:05 +00003422// We can't use a generic validation scheme for the features accepted here
3423// versus subtarget features accepted in the target attribute because the
3424// bitfield structure that's initialized in the runtime only supports the
3425// below currently rather than the full range of subtarget features. (See
3426// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3427bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3428 return llvm::StringSwitch<bool>(FeatureStr)
3429 .Case("cmov", true)
3430 .Case("mmx", true)
3431 .Case("popcnt", true)
3432 .Case("sse", true)
3433 .Case("sse2", true)
3434 .Case("sse3", true)
3435 .Case("sse4.1", true)
3436 .Case("sse4.2", true)
3437 .Case("avx", true)
3438 .Case("avx2", true)
3439 .Case("sse4a", true)
3440 .Case("fma4", true)
3441 .Case("xop", true)
3442 .Case("fma", true)
3443 .Case("avx512f", true)
3444 .Case("bmi", true)
3445 .Case("bmi2", true)
3446 .Default(false);
3447}
3448
Eli Friedman3fd920a2008-08-20 02:34:37 +00003449bool
Anders Carlsson58436352009-02-28 17:11:49 +00003450X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003451 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003452 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003453 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003454 // Constant constraints.
3455 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3456 // instructions.
3457 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3458 // x86_64 instructions.
3459 case 's':
3460 Info.setRequiresImmediate();
3461 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003462 case 'I':
3463 Info.setRequiresImmediate(0, 31);
3464 return true;
3465 case 'J':
3466 Info.setRequiresImmediate(0, 63);
3467 return true;
3468 case 'K':
3469 Info.setRequiresImmediate(-128, 127);
3470 return true;
3471 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003472 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003473 return true;
3474 case 'M':
3475 Info.setRequiresImmediate(0, 3);
3476 return true;
3477 case 'N':
3478 Info.setRequiresImmediate(0, 255);
3479 return true;
3480 case 'O':
3481 Info.setRequiresImmediate(0, 127);
3482 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003483 // Register constraints.
3484 case 'Y': // 'Y' is the first character for several 2-character constraints.
3485 // Shift the pointer to the second character of the constraint.
3486 Name++;
3487 switch (*Name) {
3488 default:
3489 return false;
3490 case '0': // First SSE register.
3491 case 't': // Any SSE register, when SSE2 is enabled.
3492 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3493 case 'm': // Any MMX register, when inter-unit moves enabled.
3494 Info.setAllowsRegister();
3495 return true;
3496 }
3497 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003498 // Constraint 'f' cannot be used for output operands.
3499 if (Info.ConstraintStr[0] == '=')
3500 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003501 Info.setAllowsRegister();
3502 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003503 case 'a': // eax.
3504 case 'b': // ebx.
3505 case 'c': // ecx.
3506 case 'd': // edx.
3507 case 'S': // esi.
3508 case 'D': // edi.
3509 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003510 case 't': // Top of floating point stack.
3511 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003512 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003513 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003514 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003515 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003516 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3517 case 'l': // "Index" registers: any general register that can be used as an
3518 // index in a base+index memory access.
3519 Info.setAllowsRegister();
3520 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003521 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003522 case 'C': // SSE floating point constant.
3523 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003524 return true;
3525 }
3526}
3527
Akira Hatanaka974131e2014-09-18 18:17:18 +00003528bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3529 unsigned Size) const {
3530 // Strip off constraint modifiers.
3531 while (Constraint[0] == '=' ||
3532 Constraint[0] == '+' ||
3533 Constraint[0] == '&')
3534 Constraint = Constraint.substr(1);
3535
3536 return validateOperandSize(Constraint, Size);
3537}
3538
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003539bool X86TargetInfo::validateInputSize(StringRef Constraint,
3540 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003541 return validateOperandSize(Constraint, Size);
3542}
3543
3544bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3545 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003546 switch (Constraint[0]) {
3547 default: break;
3548 case 'y':
3549 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003550 case 'f':
3551 case 't':
3552 case 'u':
3553 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003554 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003555 if (SSELevel >= AVX512F)
3556 // 512-bit zmm registers can be used if target supports AVX512F.
3557 return Size <= 512U;
3558 else if (SSELevel >= AVX)
3559 // 256-bit ymm registers can be used if target supports AVX.
3560 return Size <= 256U;
3561 return Size <= 128U;
3562 case 'Y':
3563 // 'Y' is the first character for several 2-character constraints.
3564 switch (Constraint[1]) {
3565 default: break;
3566 case 'm':
3567 // 'Ym' is synonymous with 'y'.
3568 return Size <= 64;
3569 case 'i':
3570 case 't':
3571 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3572 if (SSELevel >= AVX512F)
3573 return Size <= 512U;
3574 else if (SSELevel >= AVX)
3575 return Size <= 256U;
3576 return SSELevel >= SSE2 && Size <= 128U;
3577 }
3578
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003579 }
3580
3581 return true;
3582}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003583
Eli Friedman3fd920a2008-08-20 02:34:37 +00003584std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003585X86TargetInfo::convertConstraint(const char *&Constraint) const {
3586 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003587 case 'a': return std::string("{ax}");
3588 case 'b': return std::string("{bx}");
3589 case 'c': return std::string("{cx}");
3590 case 'd': return std::string("{dx}");
3591 case 'S': return std::string("{si}");
3592 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003593 case 'p': // address
3594 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003595 case 't': // top of floating point stack.
3596 return std::string("{st}");
3597 case 'u': // second from top of floating point stack.
3598 return std::string("{st(1)}"); // second from top of floating point stack.
3599 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003600 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003601 }
3602}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003603
Eli Friedman3fd920a2008-08-20 02:34:37 +00003604// X86-32 generic target
3605class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003606public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003607 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003608 DoubleAlign = LongLongAlign = 32;
3609 LongDoubleWidth = 96;
3610 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003611 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003612 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003613 SizeType = UnsignedInt;
3614 PtrDiffType = SignedInt;
3615 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003616 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003617
3618 // Use fpret for all types.
3619 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3620 (1 << TargetInfo::Double) |
3621 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003622
3623 // x86-32 has atomics up to 8 bytes
3624 // FIXME: Check that we actually have cmpxchg8b before setting
3625 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3626 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003627 }
Craig Topper3164f332014-03-11 03:39:26 +00003628 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003629 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003630 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003631
Craig Topper3164f332014-03-11 03:39:26 +00003632 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003633 if (RegNo == 0) return 0;
3634 if (RegNo == 1) return 2;
3635 return -1;
3636 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003637 bool validateOperandSize(StringRef Constraint,
3638 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003639 switch (Constraint[0]) {
3640 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003641 case 'R':
3642 case 'q':
3643 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003644 case 'a':
3645 case 'b':
3646 case 'c':
3647 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003648 case 'S':
3649 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003650 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003651 case 'A':
3652 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003653 }
3654
Akira Hatanaka974131e2014-09-18 18:17:18 +00003655 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003656 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003657};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003658
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003659class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3660public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003661 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3662 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003663
Craig Topper3164f332014-03-11 03:39:26 +00003664 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003665 unsigned Major, Minor, Micro;
3666 getTriple().getOSVersion(Major, Minor, Micro);
3667 // New NetBSD uses the default rounding mode.
3668 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3669 return X86_32TargetInfo::getFloatEvalMethod();
3670 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003671 return 1;
3672 }
3673};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003674
Eli Friedmane3aa4542009-07-05 18:47:56 +00003675class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3676public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003677 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3678 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003679 SizeType = UnsignedLong;
3680 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003681 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003682 }
3683};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003684
Eli Friedman9fa28852012-08-08 23:57:20 +00003685class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3686public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003687 BitrigI386TargetInfo(const llvm::Triple &Triple)
3688 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003689 SizeType = UnsignedLong;
3690 IntPtrType = SignedLong;
3691 PtrDiffType = SignedLong;
3692 }
3693};
Eli Friedman9fa28852012-08-08 23:57:20 +00003694
Torok Edwinb2b37c62009-06-30 17:10:35 +00003695class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003696public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003697 DarwinI386TargetInfo(const llvm::Triple &Triple)
3698 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003699 LongDoubleWidth = 128;
3700 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003701 SuitableAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003702 SizeType = UnsignedLong;
3703 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003704 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003705 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003706 }
3707
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003708 bool handleTargetFeatures(std::vector<std::string> &Features,
3709 DiagnosticsEngine &Diags) override {
3710 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3711 Diags))
3712 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003713 // We now know the features we have: we can decide how to align vectors.
3714 MaxVectorAlign =
3715 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003716 return true;
3717 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003718};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003719
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003720// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003721class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003722public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003723 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3724 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003725 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003726 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003727 bool IsWinCOFF =
3728 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003729 DataLayoutString = IsWinCOFF
3730 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3731 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003732 }
Craig Topper3164f332014-03-11 03:39:26 +00003733 void getTargetDefines(const LangOptions &Opts,
3734 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003735 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3736 }
3737};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003738
3739// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003740class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003741public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003742 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003743 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003744 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003745 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3746 }
Craig Topper3164f332014-03-11 03:39:26 +00003747 void getTargetDefines(const LangOptions &Opts,
3748 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003749 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3750 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3751 // The value of the following reflects processor type.
3752 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3753 // We lost the original triple, so we use the default.
3754 Builder.defineMacro("_M_IX86", "600");
3755 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003756};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003757
David Majnemerae1ed0e2015-05-28 04:36:18 +00003758static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003759 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3760 // supports __declspec natively under -fms-extensions, but we define a no-op
3761 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003762 if (Opts.MicrosoftExt)
3763 Builder.defineMacro("__declspec", "__declspec");
3764 else
3765 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3766
3767 if (!Opts.MicrosoftExt) {
3768 // Provide macros for all the calling convention keywords. Provide both
3769 // single and double underscore prefixed variants. These are available on
3770 // x64 as well as x86, even though they have no effect.
3771 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3772 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003773 std::string GCCSpelling = "__attribute__((__";
3774 GCCSpelling += CC;
3775 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003776 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3777 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3778 }
3779 }
3780}
3781
David Majnemerae1ed0e2015-05-28 04:36:18 +00003782static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3783 Builder.defineMacro("__MSVCRT__");
3784 Builder.defineMacro("__MINGW32__");
3785 addCygMingDefines(Opts, Builder);
3786}
3787
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003788// x86-32 MinGW target
3789class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3790public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003791 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003792 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003793 void getTargetDefines(const LangOptions &Opts,
3794 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003795 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003796 DefineStd(Builder, "WIN32", Opts);
3797 DefineStd(Builder, "WINNT", Opts);
3798 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003799 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003800 }
3801};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003802
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003803// x86-32 Cygwin target
3804class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3805public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003806 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3807 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003808 TLSSupported = false;
3809 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003810 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003811 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 +00003812 }
Craig Topper3164f332014-03-11 03:39:26 +00003813 void getTargetDefines(const LangOptions &Opts,
3814 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003815 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003816 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003817 Builder.defineMacro("__CYGWIN__");
3818 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003819 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003820 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003821 if (Opts.CPlusPlus)
3822 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003823 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003824};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003825
Chris Lattnerb986aba2010-04-11 19:29:39 +00003826// x86-32 Haiku target
3827class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3828public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003829 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003830 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003831 IntPtrType = SignedLong;
3832 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003833 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003834 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003835 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003836 }
Craig Topper3164f332014-03-11 03:39:26 +00003837 void getTargetDefines(const LangOptions &Opts,
3838 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003839 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3840 Builder.defineMacro("__INTEL__");
3841 Builder.defineMacro("__HAIKU__");
3842 }
3843};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003844
Douglas Gregor9fabd852011-07-01 22:41:14 +00003845// RTEMS Target
3846template<typename Target>
3847class RTEMSTargetInfo : public OSTargetInfo<Target> {
3848protected:
Craig Topper3164f332014-03-11 03:39:26 +00003849 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3850 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003851 // RTEMS defines; list based off of gcc output
3852
Douglas Gregor9fabd852011-07-01 22:41:14 +00003853 Builder.defineMacro("__rtems__");
3854 Builder.defineMacro("__ELF__");
3855 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003856
Douglas Gregor9fabd852011-07-01 22:41:14 +00003857public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003858 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3859 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003860
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003861 switch (Triple.getArch()) {
3862 default:
3863 case llvm::Triple::x86:
3864 // this->MCountName = ".mcount";
3865 break;
3866 case llvm::Triple::mips:
3867 case llvm::Triple::mipsel:
3868 case llvm::Triple::ppc:
3869 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003870 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003871 // this->MCountName = "_mcount";
3872 break;
3873 case llvm::Triple::arm:
3874 // this->MCountName = "__mcount";
3875 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003876 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003877 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003878};
3879
Douglas Gregor9fabd852011-07-01 22:41:14 +00003880// x86-32 RTEMS target
3881class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3882public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003883 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003884 SizeType = UnsignedLong;
3885 IntPtrType = SignedLong;
3886 PtrDiffType = SignedLong;
3887 this->UserLabelPrefix = "";
3888 }
Craig Topper3164f332014-03-11 03:39:26 +00003889 void getTargetDefines(const LangOptions &Opts,
3890 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003891 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3892 Builder.defineMacro("__INTEL__");
3893 Builder.defineMacro("__rtems__");
3894 }
3895};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003896
Eli Friedman3fd920a2008-08-20 02:34:37 +00003897// x86-64 generic target
3898class X86_64TargetInfo : public X86TargetInfo {
3899public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003900 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003901 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003902 bool IsWinCOFF =
3903 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003904 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003905 LongDoubleWidth = 128;
3906 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003907 LargeArrayMinWidth = 128;
3908 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003909 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003910 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3911 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3912 IntPtrType = IsX32 ? SignedInt : SignedLong;
3913 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003914 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003915 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003916
Eric Christopher917e9522014-11-18 22:36:15 +00003917 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003918 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3919 : IsWinCOFF
3920 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3921 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003922
3923 // Use fpret only for long double.
3924 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003925
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003926 // Use fp2ret for _Complex long double.
3927 ComplexLongDoubleUsesFP2Ret = true;
3928
Charles Davisc7d5c942015-09-17 20:55:33 +00003929 // Make __builtin_ms_va_list available.
3930 HasBuiltinMSVaList = true;
3931
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003932 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003933 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003934 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003935 }
Craig Topper3164f332014-03-11 03:39:26 +00003936 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003937 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003938 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003939
Craig Topper3164f332014-03-11 03:39:26 +00003940 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003941 if (RegNo == 0) return 0;
3942 if (RegNo == 1) return 1;
3943 return -1;
3944 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003945
Craig Topper3164f332014-03-11 03:39:26 +00003946 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003947 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003948 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003949 CC == CC_IntelOclBicc ||
3950 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003951 }
3952
Craig Topper3164f332014-03-11 03:39:26 +00003953 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003954 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003955 }
3956
Pavel Chupinfd223e12014-08-04 12:39:43 +00003957 // for x32 we need it here explicitly
3958 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003959};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003960
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003961// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003962class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003963public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003964 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3965 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003966 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003967 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003968 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003969 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003970 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003971 SizeType = UnsignedLongLong;
3972 PtrDiffType = SignedLongLong;
3973 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003974 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003975 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003976
Craig Topper3164f332014-03-11 03:39:26 +00003977 void getTargetDefines(const LangOptions &Opts,
3978 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003979 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003980 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003981 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003982
Craig Topper3164f332014-03-11 03:39:26 +00003983 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003984 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003985 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003986
Craig Topper3164f332014-03-11 03:39:26 +00003987 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003988 switch (CC) {
3989 case CC_X86StdCall:
3990 case CC_X86ThisCall:
3991 case CC_X86FastCall:
3992 return CCCR_Ignore;
3993 case CC_C:
3994 case CC_X86VectorCall:
3995 case CC_IntelOclBicc:
3996 case CC_X86_64SysV:
3997 return CCCR_OK;
3998 default:
3999 return CCCR_Warning;
4000 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004001 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004002};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004003
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004004// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004005class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004006public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004007 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004008 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00004009 LongDoubleWidth = LongDoubleAlign = 64;
4010 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004011 }
Craig Topper3164f332014-03-11 03:39:26 +00004012 void getTargetDefines(const LangOptions &Opts,
4013 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004014 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4015 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004016 Builder.defineMacro("_M_X64", "100");
4017 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004018 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004019};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004020
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004021// x86-64 MinGW target
4022class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4023public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004024 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Yaron Keren480bc9f2015-08-20 21:51:46 +00004025 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00004026 void getTargetDefines(const LangOptions &Opts,
4027 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004028 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004029 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004030 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004031 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004032
4033 // GCC defines this macro when it is using __gxx_personality_seh0.
4034 if (!Opts.SjLjExceptions)
4035 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004036 }
4037};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004038
Yaron Kerend030d112015-07-22 17:38:19 +00004039// x86-64 Cygwin target
4040class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4041public:
4042 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4043 : X86_64TargetInfo(Triple) {
4044 TLSSupported = false;
4045 WCharType = UnsignedShort;
4046 }
4047 void getTargetDefines(const LangOptions &Opts,
4048 MacroBuilder &Builder) const override {
4049 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4050 Builder.defineMacro("__x86_64__");
4051 Builder.defineMacro("__CYGWIN__");
4052 Builder.defineMacro("__CYGWIN64__");
4053 addCygMingDefines(Opts, Builder);
4054 DefineStd(Builder, "unix", Opts);
4055 if (Opts.CPlusPlus)
4056 Builder.defineMacro("_GNU_SOURCE");
4057
4058 // GCC defines this macro when it is using __gxx_personality_seh0.
4059 if (!Opts.SjLjExceptions)
4060 Builder.defineMacro("__SEH__");
4061 }
4062};
4063
Eli Friedman2857ccb2009-07-01 03:36:11 +00004064class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4065public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004066 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4067 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004068 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004069 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4070 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004071 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004072 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004073 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004074 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004075
4076 bool handleTargetFeatures(std::vector<std::string> &Features,
4077 DiagnosticsEngine &Diags) override {
4078 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4079 Diags))
4080 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004081 // We now know the features we have: we can decide how to align vectors.
4082 MaxVectorAlign =
4083 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004084 return true;
4085 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004086};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004087
Eli Friedman245f2292009-07-05 22:31:18 +00004088class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4089public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004090 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4091 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004092 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004093 Int64Type = SignedLongLong;
4094 }
4095};
Eli Friedman245f2292009-07-05 22:31:18 +00004096
Eli Friedman9fa28852012-08-08 23:57:20 +00004097class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4098public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004099 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4100 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4101 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004102 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004103 }
4104};
Tim Northover9bb857a2013-01-31 12:13:10 +00004105
Eli Friedmanf05b7722008-08-20 07:44:10 +00004106class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004107 // Possible FPU choices.
4108 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004109 VFP2FPU = (1 << 0),
4110 VFP3FPU = (1 << 1),
4111 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004112 NeonFPU = (1 << 3),
4113 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004114 };
4115
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004116 // Possible HWDiv features.
4117 enum HWDivMode {
4118 HWDivThumb = (1 << 0),
4119 HWDivARM = (1 << 1)
4120 };
4121
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004122 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004123 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004124 }
4125
4126 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4127 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004128
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004129 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004130
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004131 StringRef CPUProfile;
4132 StringRef CPUAttr;
4133
Rafael Espindolaeb265472013-08-21 21:59:03 +00004134 enum {
4135 FP_Default,
4136 FP_VFP,
4137 FP_Neon
4138 } FPMath;
4139
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004140 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004141 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004142 unsigned ArchProfile;
4143 unsigned ArchVersion;
4144
Bernard Ogdenda13af32013-10-24 18:32:51 +00004145 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004146
Logan Chien57086ce2012-10-10 06:56:20 +00004147 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004148 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004149
4150 // Initialized via features.
4151 unsigned SoftFloat : 1;
4152 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004153
Bernard Ogden18b57012013-10-29 09:47:51 +00004154 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004155 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004156 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004157 unsigned Unaligned : 1;
4158
4159 enum {
4160 LDREX_B = (1 << 0), /// byte (8-bit)
4161 LDREX_H = (1 << 1), /// half (16-bit)
4162 LDREX_W = (1 << 2), /// word (32-bit)
4163 LDREX_D = (1 << 3), /// double (64-bit)
4164 };
4165
4166 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004167
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004168 // ACLE 6.5.1 Hardware floating point
4169 enum {
4170 HW_FP_HP = (1 << 1), /// half (16-bit)
4171 HW_FP_SP = (1 << 2), /// single (32-bit)
4172 HW_FP_DP = (1 << 3), /// double (64-bit)
4173 };
4174 uint32_t HW_FP;
4175
Chris Lattner5cc15e02010-03-03 19:03:45 +00004176 static const Builtin::Info BuiltinInfo[];
4177
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004178 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004179 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004180
4181 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004182 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004183
Renato Golin9ba39232015-02-27 16:35:48 +00004184 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4185 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4186 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004187 SizeType = UnsignedLong;
4188 else
4189 SizeType = UnsignedInt;
4190
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004191 switch (T.getOS()) {
4192 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004193 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004194 break;
4195 case llvm::Triple::Win32:
4196 WCharType = UnsignedShort;
4197 break;
4198 case llvm::Triple::Linux:
4199 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004200 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4201 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004202 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004203 }
4204
4205 UseBitFieldTypeAlignment = true;
4206
4207 ZeroLengthBitfieldBoundary = 0;
4208
Tim Northover147cd2f2014-10-14 22:12:21 +00004209 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4210 // so set preferred for small types to 32.
4211 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004212 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004213 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4214 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4215 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004216 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004217 DataLayoutString = "e"
4218 "-m:w"
4219 "-p:32:32"
4220 "-i64:64"
4221 "-v128:64:128"
4222 "-a:0:32"
4223 "-n32"
4224 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004225 } else if (T.isOSNaCl()) {
4226 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004227 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004228 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004229 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004230 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4231 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004232 }
4233
4234 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004235 }
4236
4237 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004238 const llvm::Triple &T = getTriple();
4239
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004240 IsAAPCS = false;
4241
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004242 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004243
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004244 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004245 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004246 SizeType = UnsignedInt;
4247 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004248 SizeType = UnsignedLong;
4249
4250 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4251 WCharType = SignedInt;
4252
4253 // Do not respect the alignment of bit-field types when laying out
4254 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4255 UseBitFieldTypeAlignment = false;
4256
4257 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4258 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4259 /// gcc.
4260 ZeroLengthBitfieldBoundary = 32;
4261
Tim Northover147cd2f2014-10-14 22:12:21 +00004262 if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004263 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004264 BigEndian
4265 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4266 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4267 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004268 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004269 BigEndian
4270 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4271 : "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 +00004272
4273 // FIXME: Override "preferred align" for double and long long.
4274 }
4275
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004276 void setArchInfo() {
4277 StringRef ArchName = getTriple().getArchName();
4278
Renato Goline84b0002015-10-08 16:43:26 +00004279 ArchISA = llvm::ARM::parseArchISA(ArchName);
4280 CPU = llvm::ARM::getDefaultCPU(ArchName);
4281 unsigned AK = llvm::ARM::parseArch(ArchName);
4282 if (AK != llvm::ARM::AK_INVALID)
4283 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004284 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004285 }
4286
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004287 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004288 StringRef SubArch;
4289
4290 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004291 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004292 SubArch = llvm::ARM::getSubArch(ArchKind);
4293 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4294 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004295
4296 // cache CPU related strings
4297 CPUAttr = getCPUAttr();
4298 CPUProfile = getCPUProfile();
4299 }
4300
4301 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004302 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004303 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004304 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004305 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4306 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004307 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004308 if (ArchProfile == llvm::ARM::PK_M) {
4309 MaxAtomicPromoteWidth = 32;
4310 if (ShouldUseInlineAtomic)
4311 MaxAtomicInlineWidth = 32;
4312 }
4313 else {
4314 MaxAtomicPromoteWidth = 64;
4315 if (ShouldUseInlineAtomic)
4316 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004317 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004318 }
4319
4320 bool isThumb() const {
4321 return (ArchISA == llvm::ARM::IK_THUMB);
4322 }
4323
4324 bool supportsThumb() const {
4325 return CPUAttr.count('T') || ArchVersion >= 6;
4326 }
4327
4328 bool supportsThumb2() const {
4329 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4330 }
4331
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004332 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004333 // For most sub-arches, the build attribute CPU name is enough.
4334 // For Cortex variants, it's slightly different.
4335 switch(ArchKind) {
4336 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004337 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004338 case llvm::ARM::AK_ARMV6M:
4339 case llvm::ARM::AK_ARMV6SM:
4340 case llvm::ARM::AK_ARMV6HL:
4341 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004342 case llvm::ARM::AK_ARMV7S:
4343 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004344 case llvm::ARM::AK_ARMV7:
4345 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004346 case llvm::ARM::AK_ARMV7L:
4347 case llvm::ARM::AK_ARMV7HL:
4348 return "7A";
4349 case llvm::ARM::AK_ARMV7R:
4350 return "7R";
4351 case llvm::ARM::AK_ARMV7M:
4352 return "7M";
4353 case llvm::ARM::AK_ARMV7EM:
4354 return "7EM";
4355 case llvm::ARM::AK_ARMV8A:
4356 return "8A";
4357 case llvm::ARM::AK_ARMV8_1A:
4358 return "8_1A";
4359 }
4360 }
4361
4362 StringRef getCPUProfile() const {
4363 switch(ArchProfile) {
4364 case llvm::ARM::PK_A:
4365 return "A";
4366 case llvm::ARM::PK_R:
4367 return "R";
4368 case llvm::ARM::PK_M:
4369 return "M";
4370 default:
4371 return "";
4372 }
4373 }
4374
Chris Lattner17df24e2008-04-21 18:56:49 +00004375public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004376 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004377 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004378 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004379 BigEndian = IsBigEndian;
4380
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004381 switch (getTriple().getOS()) {
4382 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004383 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004384 break;
4385 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004386 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004387 break;
4388 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004389
Renato Goline84b0002015-10-08 16:43:26 +00004390 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004391 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004392
Chris Lattner1a8f3942010-04-23 16:29:58 +00004393 // {} in inline assembly are neon specifiers, not assembly variant
4394 // specifiers.
4395 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004396
Eric Christopher0e261882014-12-05 01:06:59 +00004397 // FIXME: This duplicates code from the driver that sets the -target-abi
4398 // option - this code is used if -target-abi isn't passed and should
4399 // be unified in some way.
4400 if (Triple.isOSBinFormatMachO()) {
4401 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4402 // the frontend matches that.
4403 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4404 Triple.getOS() == llvm::Triple::UnknownOS ||
4405 StringRef(CPU).startswith("cortex-m")) {
4406 setABI("aapcs");
4407 } else {
4408 setABI("apcs-gnu");
4409 }
4410 } else if (Triple.isOSWindows()) {
4411 // FIXME: this is invalid for WindowsCE
4412 setABI("aapcs");
4413 } else {
4414 // Select the default based on the platform.
4415 switch (Triple.getEnvironment()) {
4416 case llvm::Triple::Android:
4417 case llvm::Triple::GNUEABI:
4418 case llvm::Triple::GNUEABIHF:
4419 setABI("aapcs-linux");
4420 break;
4421 case llvm::Triple::EABIHF:
4422 case llvm::Triple::EABI:
4423 setABI("aapcs");
4424 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004425 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004426 setABI("apcs-gnu");
4427 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004428 default:
4429 if (Triple.getOS() == llvm::Triple::NetBSD)
4430 setABI("apcs-gnu");
4431 else
4432 setABI("aapcs");
4433 break;
4434 }
4435 }
John McCall86353412010-08-21 22:46:04 +00004436
4437 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004438 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004439
Renato Golin15b86152015-07-03 16:41:13 +00004440 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004441 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004442
James Molloya7139222012-03-12 09:14:10 +00004443 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004444 // the alignment of the zero-length bitfield is greater than the member
4445 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004446 // zero length bitfield.
4447 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004448 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004449
Alp Toker4925ba72014-06-07 23:30:42 +00004450 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004451
Craig Topper3164f332014-03-11 03:39:26 +00004452 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004453 ABI = Name;
4454
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004455 // The defaults (above) are for AAPCS, check if we need to change them.
4456 //
4457 // FIXME: We need support for -meabi... we could just mangle it into the
4458 // name.
4459 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004460 setABIAPCS();
4461 return true;
4462 }
4463 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4464 setABIAAPCS();
4465 return true;
4466 }
4467 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004468 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004469
Renato Golinf5c4dec2015-05-27 13:33:00 +00004470 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004471 bool
4472 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4473 StringRef CPU,
4474 const std::vector<std::string> &FeaturesVec) const override {
4475
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004476 std::vector<const char*> TargetFeatures;
4477
4478 // get default FPU features
4479 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU);
4480 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4481
4482 // get default Extension features
4483 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU);
4484 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4485
4486 for (const char *Feature : TargetFeatures)
4487 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004488 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004489
Eric Christopher007b0a02015-08-28 22:32:01 +00004490 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004491 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004492
Craig Topper3164f332014-03-11 03:39:26 +00004493 bool handleTargetFeatures(std::vector<std::string> &Features,
4494 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004495 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004496 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004497 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004498 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004499 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004500 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004501 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004502
Ranjeet Singhac08e532015-06-24 23:39:25 +00004503 // This does not diagnose illegal cases like having both
4504 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4505 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004506 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004507 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004508 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004509 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004510 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004511 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004512 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004513 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004514 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004515 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004516 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004517 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004518 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004519 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004520 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004521 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004522 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004523 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004524 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004525 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004526 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004527 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004528 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004529 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004530 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004531 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004532 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004533 Crypto = 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004534 } else if (Feature == "+t2dsp") {
4535 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004536 } else if (Feature == "+fp-only-sp") {
Ranjeet Singhac08e532015-06-24 23:39:25 +00004537 HW_FP_remove |= HW_FP_DP | HW_FP_HP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004538 } else if (Feature == "+strict-align") {
4539 Unaligned = 0;
4540 } else if (Feature == "+fp16") {
4541 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004542 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004543 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004544 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004545
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004546 switch (ArchVersion) {
4547 case 6:
4548 if (ArchProfile == llvm::ARM::PK_M)
4549 LDREX = 0;
4550 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4551 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4552 else
4553 LDREX = LDREX_W;
4554 break;
4555 case 7:
4556 if (ArchProfile == llvm::ARM::PK_M)
4557 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4558 else
4559 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4560 break;
4561 case 8:
4562 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4563 }
4564
Rafael Espindolaeb265472013-08-21 21:59:03 +00004565 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4566 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4567 return false;
4568 }
4569
4570 if (FPMath == FP_Neon)
4571 Features.push_back("+neonfp");
4572 else if (FPMath == FP_VFP)
4573 Features.push_back("-neonfp");
4574
Daniel Dunbar893d4752009-12-19 04:15:38 +00004575 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004576 auto Feature =
4577 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4578 if (Feature != Features.end())
4579 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004580
Rafael Espindolaeb265472013-08-21 21:59:03 +00004581 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004582 }
4583
Craig Topper3164f332014-03-11 03:39:26 +00004584 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004585 return llvm::StringSwitch<bool>(Feature)
4586 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004587 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004588 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004589 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004590 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004591 .Case("hwdiv", HWDiv & HWDivThumb)
4592 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004593 .Default(false);
4594 }
Renato Golin15b86152015-07-03 16:41:13 +00004595
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004596 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004597 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004598 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004599
Renato Golin15b86152015-07-03 16:41:13 +00004600 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004601 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004602 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004603 CPU = Name;
4604 return true;
4605 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004606
Craig Topper3164f332014-03-11 03:39:26 +00004607 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004608
Craig Topper3164f332014-03-11 03:39:26 +00004609 void getTargetDefines(const LangOptions &Opts,
4610 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004611 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004612 Builder.defineMacro("__arm");
4613 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004614
Chris Lattnerecd49032009-03-02 22:27:17 +00004615 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004616 Builder.defineMacro("__REGISTER_PREFIX__", "");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004617 if (!CPUAttr.empty())
4618 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004619
4620 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004621 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004622 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004623
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004624 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004625 // ACLE 6.5.7 Crypto Extension
4626 if (Crypto)
4627 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4628 // ACLE 6.5.8 CRC32 Extension
4629 if (CRC)
4630 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4631 // ACLE 6.5.10 Numeric Maximum and Minimum
4632 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4633 // ACLE 6.5.9 Directed Rounding
4634 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004635 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004636
4637 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4638 // is not defined for the M-profile.
4639 // NOTE that the deffault profile is assumed to be 'A'
4640 if (CPUProfile.empty() || CPUProfile != "M")
4641 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4642
4643 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4644 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4645 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004646 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004647 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004648 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004649 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4650
4651 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4652 // instruction set such as ARM or Thumb.
4653 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4654
4655 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4656
4657 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004658 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004659 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004660
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004661 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004662 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004663 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004664
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004665 // ACLE 6.4.4 LDREX/STREX
4666 if (LDREX)
4667 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4668
4669 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004670 if (ArchVersion == 5 ||
4671 (ArchVersion == 6 && CPUProfile != "M") ||
4672 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004673 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4674
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004675 // ACLE 6.5.1 Hardware Floating Point
4676 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004677 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004678
Yi Konga44c4d72014-06-27 21:25:42 +00004679 // ACLE predefines.
4680 Builder.defineMacro("__ARM_ACLE", "200");
4681
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004682 // FP16 support (we currently only support IEEE format).
4683 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4684 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4685
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004686 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4687 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4688 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4689
Mike Stump9d54bd72009-04-08 02:07:04 +00004690 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004691
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004692 // FIXME: It's more complicated than this and we don't really support
4693 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004694 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004695 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004696 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004697
David Tweed8f676532012-10-25 13:33:01 +00004698 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004699 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004700 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4701 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004702 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004703 Builder.defineMacro("__ARM_PCS", "1");
4704
David Tweed8f676532012-10-25 13:33:01 +00004705 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004706 Builder.defineMacro("__ARM_PCS_VFP", "1");
4707 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004708
Daniel Dunbar893d4752009-12-19 04:15:38 +00004709 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004710 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004711
4712 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004713 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004714
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004715 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004716 Builder.defineMacro("__THUMBEL__");
4717 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004718 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004719 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004720 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004721
4722 // ACLE 6.4.9 32-bit SIMD instructions
4723 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4724 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4725
4726 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004727 if (((HWDiv & HWDivThumb) && isThumb()) ||
4728 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004729 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004730 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004731 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004732
4733 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004734 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004735
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004736 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004737 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004738 if (FPU & VFP2FPU)
4739 Builder.defineMacro("__ARM_VFPV2__");
4740 if (FPU & VFP3FPU)
4741 Builder.defineMacro("__ARM_VFPV3__");
4742 if (FPU & VFP4FPU)
4743 Builder.defineMacro("__ARM_VFPV4__");
4744 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004745
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004746 // This only gets set when Neon instructions are actually available, unlike
4747 // the VFP define, hence the soft float and arch check. This is subtly
4748 // different from gcc, we follow the intent which was that it should be set
4749 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004750 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004751 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004752 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004753 // current AArch32 NEON implementations do not support double-precision
4754 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004755 Builder.defineMacro("__ARM_NEON_FP",
4756 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004757 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004758
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004759 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4760 Opts.ShortWChar ? "2" : "4");
4761
4762 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4763 Opts.ShortEnums ? "1" : "4");
4764
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004765 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004766 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4767 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4768 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4769 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4770 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004771
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004772 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004773 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004774 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004775 }
4776
4777 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004778 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004779 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4780 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004781 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004782 }
4783
4784 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004785 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004786 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004787
4788 if (Opts.UnsafeFPMath)
4789 Builder.defineMacro("__ARM_FP_FAST", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004790 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004791
Craig Topper3164f332014-03-11 03:39:26 +00004792 void getTargetBuiltins(const Builtin::Info *&Records,
4793 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004794 Records = BuiltinInfo;
4795 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004796 }
Craig Topper3164f332014-03-11 03:39:26 +00004797 bool isCLZForZeroUndef() const override { return false; }
4798 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004799 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004800 }
Craig Topperf054e3a2015-10-19 03:52:27 +00004801 ArrayRef<const char *> getGCCRegNames() const override;
4802 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00004803 bool validateAsmConstraint(const char *&Name,
4804 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004805 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004806 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004807 case 'l': // r0-r7
4808 case 'h': // r8-r15
4809 case 'w': // VFP Floating point register single precision
4810 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004811 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004812 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004813 case 'I':
4814 case 'J':
4815 case 'K':
4816 case 'L':
4817 case 'M':
4818 // FIXME
4819 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004820 case 'Q': // A memory address that is a single base register.
4821 Info.setAllowsMemory();
4822 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004823 case 'U': // a memory reference...
4824 switch (Name[1]) {
4825 case 'q': // ...ARMV4 ldrsb
4826 case 'v': // ...VFP load/store (reg+constant offset)
4827 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004828 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004829 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004830 case 'n': // valid address for Neon doubleword vector load/store
4831 case 'm': // valid address for Neon element and structure load/store
4832 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004833 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004834 Info.setAllowsMemory();
4835 Name++;
4836 return true;
4837 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004838 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004839 return false;
4840 }
Craig Topper3164f332014-03-11 03:39:26 +00004841 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004842 std::string R;
4843 switch (*Constraint) {
4844 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004845 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004846 Constraint++;
4847 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004848 case 'p': // 'p' should be translated to 'r' by default.
4849 R = std::string("r");
4850 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004851 default:
4852 return std::string(1, *Constraint);
4853 }
4854 return R;
4855 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004856 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004857 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004858 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004859 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004860 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004861
Bill Wendling9d1ee112012-10-25 23:28:48 +00004862 // Strip off constraint modifiers.
4863 while (Constraint[0] == '=' ||
4864 Constraint[0] == '+' ||
4865 Constraint[0] == '&')
4866 Constraint = Constraint.substr(1);
4867
4868 switch (Constraint[0]) {
4869 default: break;
4870 case 'r': {
4871 switch (Modifier) {
4872 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004873 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004874 case 'q':
4875 // A register of size 32 cannot fit a vector type.
4876 return false;
4877 }
4878 }
4879 }
4880
4881 return true;
4882 }
Craig Topper3164f332014-03-11 03:39:26 +00004883 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004884 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004885 return "";
4886 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004887
Craig Topper3164f332014-03-11 03:39:26 +00004888 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004889 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4890 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004891
Craig Topper3164f332014-03-11 03:39:26 +00004892 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004893 if (RegNo == 0) return 0;
4894 if (RegNo == 1) return 1;
4895 return -1;
4896 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004897
4898 bool hasSjLjLowering() const override {
4899 return true;
4900 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004901};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004902
Rafael Espindolaeb265472013-08-21 21:59:03 +00004903bool ARMTargetInfo::setFPMath(StringRef Name) {
4904 if (Name == "neon") {
4905 FPMath = FP_Neon;
4906 return true;
4907 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4908 Name == "vfp4") {
4909 FPMath = FP_VFP;
4910 return true;
4911 }
4912 return false;
4913}
4914
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004915const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004916 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004917 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004918 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4919
4920 // Float registers
4921 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4922 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4923 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004924 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004925
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004926 // Double registers
4927 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4928 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004929 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4930 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004931
4932 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004933 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4934 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004935};
4936
Craig Topperf054e3a2015-10-19 03:52:27 +00004937ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
4938 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004939}
4940
4941const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004942 { { "a1" }, "r0" },
4943 { { "a2" }, "r1" },
4944 { { "a3" }, "r2" },
4945 { { "a4" }, "r3" },
4946 { { "v1" }, "r4" },
4947 { { "v2" }, "r5" },
4948 { { "v3" }, "r6" },
4949 { { "v4" }, "r7" },
4950 { { "v5" }, "r8" },
4951 { { "v6", "rfp" }, "r9" },
4952 { { "sl" }, "r10" },
4953 { { "fp" }, "r11" },
4954 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004955 { { "r13" }, "sp" },
4956 { { "r14" }, "lr" },
4957 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004958 // The S, D and Q registers overlap, but aren't really aliases; we
4959 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004960};
4961
Craig Topperf054e3a2015-10-19 03:52:27 +00004962ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
4963 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004964}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004965
4966const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00004967#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004968 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004969#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4970 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00004971#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004972
Craig Topper07d3b622015-08-07 05:14:44 +00004973#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004974 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004975#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004976 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004977#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4978 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004979#include "clang/Basic/BuiltinsARM.def"
4980};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004981
4982class ARMleTargetInfo : public ARMTargetInfo {
4983public:
4984 ARMleTargetInfo(const llvm::Triple &Triple)
4985 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004986 void getTargetDefines(const LangOptions &Opts,
4987 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004988 Builder.defineMacro("__ARMEL__");
4989 ARMTargetInfo::getTargetDefines(Opts, Builder);
4990 }
4991};
4992
4993class ARMbeTargetInfo : public ARMTargetInfo {
4994public:
4995 ARMbeTargetInfo(const llvm::Triple &Triple)
4996 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004997 void getTargetDefines(const LangOptions &Opts,
4998 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004999 Builder.defineMacro("__ARMEB__");
5000 Builder.defineMacro("__ARM_BIG_ENDIAN");
5001 ARMTargetInfo::getTargetDefines(Opts, Builder);
5002 }
5003};
Chris Lattner17df24e2008-04-21 18:56:49 +00005004
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005005class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5006 const llvm::Triple Triple;
5007public:
5008 WindowsARMTargetInfo(const llvm::Triple &Triple)
5009 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
5010 TLSSupported = false;
5011 WCharType = UnsignedShort;
5012 SizeType = UnsignedInt;
5013 UserLabelPrefix = "";
5014 }
5015 void getVisualStudioDefines(const LangOptions &Opts,
5016 MacroBuilder &Builder) const {
5017 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5018
5019 // FIXME: this is invalid for WindowsCE
5020 Builder.defineMacro("_M_ARM_NT", "1");
5021 Builder.defineMacro("_M_ARMT", "_M_ARM");
5022 Builder.defineMacro("_M_THUMB", "_M_ARM");
5023
5024 assert((Triple.getArch() == llvm::Triple::arm ||
5025 Triple.getArch() == llvm::Triple::thumb) &&
5026 "invalid architecture for Windows ARM target info");
5027 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5028 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5029
5030 // TODO map the complete set of values
5031 // 31: VFPv3 40: VFPv4
5032 Builder.defineMacro("_M_ARM_FP", "31");
5033 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005034 BuiltinVaListKind getBuiltinVaListKind() const override {
5035 return TargetInfo::CharPtrBuiltinVaList;
5036 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005037 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5038 switch (CC) {
5039 case CC_X86StdCall:
5040 case CC_X86ThisCall:
5041 case CC_X86FastCall:
5042 case CC_X86VectorCall:
5043 return CCCR_Ignore;
5044 case CC_C:
5045 return CCCR_OK;
5046 default:
5047 return CCCR_Warning;
5048 }
5049 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005050};
5051
5052// Windows ARM + Itanium C++ ABI Target
5053class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5054public:
5055 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5056 : WindowsARMTargetInfo(Triple) {
5057 TheCXXABI.set(TargetCXXABI::GenericARM);
5058 }
5059
5060 void getTargetDefines(const LangOptions &Opts,
5061 MacroBuilder &Builder) const override {
5062 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5063
5064 if (Opts.MSVCCompat)
5065 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5066 }
5067};
5068
5069// Windows ARM, MS (C++) ABI
5070class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5071public:
5072 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5073 : WindowsARMTargetInfo(Triple) {
5074 TheCXXABI.set(TargetCXXABI::Microsoft);
5075 }
5076
5077 void getTargetDefines(const LangOptions &Opts,
5078 MacroBuilder &Builder) const override {
5079 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5080 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5081 }
5082};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005083
Yaron Keren321249c2015-07-15 13:32:23 +00005084// ARM MinGW target
5085class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5086public:
5087 MinGWARMTargetInfo(const llvm::Triple &Triple)
5088 : WindowsARMTargetInfo(Triple) {
5089 TheCXXABI.set(TargetCXXABI::GenericARM);
5090 }
5091
5092 void getTargetDefines(const LangOptions &Opts,
5093 MacroBuilder &Builder) const override {
5094 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5095 DefineStd(Builder, "WIN32", Opts);
5096 DefineStd(Builder, "WINNT", Opts);
5097 Builder.defineMacro("_ARM_");
5098 addMinGWDefines(Opts, Builder);
5099 }
5100};
5101
5102// ARM Cygwin target
5103class CygwinARMTargetInfo : public ARMleTargetInfo {
5104public:
5105 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5106 TLSSupported = false;
5107 WCharType = UnsignedShort;
5108 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005109 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005110 }
5111 void getTargetDefines(const LangOptions &Opts,
5112 MacroBuilder &Builder) const override {
5113 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5114 Builder.defineMacro("_ARM_");
5115 Builder.defineMacro("__CYGWIN__");
5116 Builder.defineMacro("__CYGWIN32__");
5117 DefineStd(Builder, "unix", Opts);
5118 if (Opts.CPlusPlus)
5119 Builder.defineMacro("_GNU_SOURCE");
5120 }
5121};
5122
Mike Stump11289f42009-09-09 15:08:12 +00005123class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005124 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005125protected:
Craig Topper3164f332014-03-11 03:39:26 +00005126 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5127 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005128 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005129 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005130
Torok Edwinb2b37c62009-06-30 17:10:35 +00005131public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005132 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005133 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005134 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005135 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005136 // FIXME: This should be based off of the target features in
5137 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005138 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005139
5140 // Darwin on iOS uses a variant of the ARM C++ ABI.
5141 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005142 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005143};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005144
Tim Northover573cbee2014-05-24 12:52:07 +00005145class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005146 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005147 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5148 static const char *const GCCRegNames[];
5149
James Molloy75f5f9e2014-04-16 15:33:48 +00005150 enum FPUModeEnum {
5151 FPUMode,
5152 NeonMode
5153 };
5154
5155 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005156 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005157 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005158 unsigned Unaligned;
James Molloy75f5f9e2014-04-16 15:33:48 +00005159
Tim Northovera2ee4332014-03-29 15:09:45 +00005160 static const Builtin::Info BuiltinInfo[];
5161
5162 std::string ABI;
5163
5164public:
Tim Northover573cbee2014-05-24 12:52:07 +00005165 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005166 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005167
5168 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5169 WCharType = SignedInt;
5170
5171 // NetBSD apparently prefers consistency across ARM targets to consistency
5172 // across 64-bit targets.
5173 Int64Type = SignedLongLong;
5174 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005175 } else {
5176 WCharType = UnsignedInt;
5177 Int64Type = SignedLong;
5178 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005179 }
5180
Tim Northovera2ee4332014-03-29 15:09:45 +00005181 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005182 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005183 MaxAtomicInlineWidth = 128;
5184 MaxAtomicPromoteWidth = 128;
5185
Tim Northovera6a19f12015-02-06 01:25:07 +00005186 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005187 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5188
Tim Northovera2ee4332014-03-29 15:09:45 +00005189 // {} in inline assembly are neon specifiers, not assembly variant
5190 // specifiers.
5191 NoAsmVariants = true;
5192
Tim Northover7ad87af2015-01-16 18:44:04 +00005193 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5194 // contributes to the alignment of the containing aggregate in the same way
5195 // a plain (non bit-field) member of that type would, without exception for
5196 // zero-sized or anonymous bit-fields."
5197 UseBitFieldTypeAlignment = true;
5198 UseZeroLengthBitfieldAlignment = true;
5199
Tim Northover573cbee2014-05-24 12:52:07 +00005200 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005201 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5202 }
5203
Alp Toker4925ba72014-06-07 23:30:42 +00005204 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005205 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005206 if (Name != "aapcs" && Name != "darwinpcs")
5207 return false;
5208
5209 ABI = Name;
5210 return true;
5211 }
5212
David Blaikie1cbb9712014-11-14 19:09:44 +00005213 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005214 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005215 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005216 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005217 .Case("cyclone", true)
5218 .Default(false);
5219 return CPUKnown;
5220 }
5221
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005222 void getTargetDefines(const LangOptions &Opts,
5223 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005224 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005225 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005226
5227 // Target properties.
5228 Builder.defineMacro("_LP64");
5229 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005230
5231 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5232 Builder.defineMacro("__ARM_ACLE", "200");
5233 Builder.defineMacro("__ARM_ARCH", "8");
5234 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5235
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005236 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005237 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005238 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005239
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005240 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5241 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5242 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5243 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005244 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005245 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5246 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005247
5248 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5249
5250 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005251 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005252
5253 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5254 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005255 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5256 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005257
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005258 if (Opts.UnsafeFPMath)
5259 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005260
5261 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5262
5263 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5264 Opts.ShortEnums ? "1" : "4");
5265
James Molloy75f5f9e2014-04-16 15:33:48 +00005266 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005267 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005268 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005269 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005270 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005271
Bradley Smith418c5932014-05-02 15:17:51 +00005272 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005273 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005274
James Molloy75f5f9e2014-04-16 15:33:48 +00005275 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005276 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5277
5278 if (Unaligned)
5279 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005280
5281 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5282 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5283 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5284 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5285 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005286 }
5287
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005288 void getTargetBuiltins(const Builtin::Info *&Records,
5289 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005290 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00005291 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00005292 }
5293
David Blaikie1cbb9712014-11-14 19:09:44 +00005294 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005295 return Feature == "aarch64" ||
5296 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005297 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005298 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005299 }
5300
James Molloy5e73df52014-04-16 15:06:20 +00005301 bool handleTargetFeatures(std::vector<std::string> &Features,
5302 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005303 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005304 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005305 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005306 Unaligned = 1;
5307
Eric Christopher610fe112015-08-26 08:21:55 +00005308 for (const auto &Feature : Features) {
5309 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005310 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005311 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005312 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005313 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005314 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005315 if (Feature == "+strict-align")
5316 Unaligned = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005317 }
5318
Eric Christopher964a5f32015-08-05 23:48:05 +00005319 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005320
5321 return true;
5322 }
5323
David Blaikie1cbb9712014-11-14 19:09:44 +00005324 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005325
David Blaikie1cbb9712014-11-14 19:09:44 +00005326 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005327 return TargetInfo::AArch64ABIBuiltinVaList;
5328 }
5329
Craig Topperf054e3a2015-10-19 03:52:27 +00005330 ArrayRef<const char *> getGCCRegNames() const override;
5331 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005332
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005333 bool validateAsmConstraint(const char *&Name,
5334 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005335 switch (*Name) {
5336 default:
5337 return false;
5338 case 'w': // Floating point and SIMD registers (V0-V31)
5339 Info.setAllowsRegister();
5340 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005341 case 'I': // Constant that can be used with an ADD instruction
5342 case 'J': // Constant that can be used with a SUB instruction
5343 case 'K': // Constant that can be used with a 32-bit logical instruction
5344 case 'L': // Constant that can be used with a 64-bit logical instruction
5345 case 'M': // Constant that can be used as a 32-bit MOV immediate
5346 case 'N': // Constant that can be used as a 64-bit MOV immediate
5347 case 'Y': // Floating point constant zero
5348 case 'Z': // Integer constant zero
5349 return true;
5350 case 'Q': // A memory reference with base register and no offset
5351 Info.setAllowsMemory();
5352 return true;
5353 case 'S': // A symbolic address
5354 Info.setAllowsRegister();
5355 return true;
5356 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005357 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5358 // Utf: A memory address suitable for ldp/stp in TF mode.
5359 // Usa: An absolute symbolic address.
5360 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5361 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005362 case 'z': // Zero register, wzr or xzr
5363 Info.setAllowsRegister();
5364 return true;
5365 case 'x': // Floating point and SIMD registers (V0-V15)
5366 Info.setAllowsRegister();
5367 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005368 }
5369 return false;
5370 }
5371
Akira Hatanaka987f1862014-08-22 06:05:21 +00005372 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005373 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005374 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005375 // Strip off constraint modifiers.
5376 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5377 Constraint = Constraint.substr(1);
5378
5379 switch (Constraint[0]) {
5380 default:
5381 return true;
5382 case 'z':
5383 case 'r': {
5384 switch (Modifier) {
5385 case 'x':
5386 case 'w':
5387 // For now assume that the person knows what they're
5388 // doing with the modifier.
5389 return true;
5390 default:
5391 // By default an 'r' constraint will be in the 'x'
5392 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005393 if (Size == 64)
5394 return true;
5395
5396 SuggestedModifier = "w";
5397 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005398 }
5399 }
5400 }
5401 }
5402
David Blaikie1cbb9712014-11-14 19:09:44 +00005403 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005404
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005405 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005406 if (RegNo == 0)
5407 return 0;
5408 if (RegNo == 1)
5409 return 1;
5410 return -1;
5411 }
5412};
5413
Tim Northover573cbee2014-05-24 12:52:07 +00005414const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005415 // 32-bit Integer registers
5416 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5417 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5418 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5419
5420 // 64-bit Integer registers
5421 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5422 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5423 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5424
5425 // 32-bit floating point regsisters
5426 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5427 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5428 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5429
5430 // 64-bit floating point regsisters
5431 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5432 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5433 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5434
5435 // Vector registers
5436 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5437 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5438 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5439};
5440
Craig Topperf054e3a2015-10-19 03:52:27 +00005441ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5442 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005443}
5444
Tim Northover573cbee2014-05-24 12:52:07 +00005445const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005446 { { "w31" }, "wsp" },
5447 { { "x29" }, "fp" },
5448 { { "x30" }, "lr" },
5449 { { "x31" }, "sp" },
5450 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5451 // don't want to substitute one of these for a different-sized one.
5452};
5453
Craig Topperf054e3a2015-10-19 03:52:27 +00005454ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5455 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005456}
5457
Tim Northover573cbee2014-05-24 12:52:07 +00005458const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005459#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005460 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005461#include "clang/Basic/BuiltinsNEON.def"
5462
5463#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005464 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005465#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005466};
James Molloy5e73df52014-04-16 15:06:20 +00005467
Tim Northover573cbee2014-05-24 12:52:07 +00005468class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005469 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005470 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005471 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005472 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005473 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005474 }
5475
5476public:
Tim Northover573cbee2014-05-24 12:52:07 +00005477 AArch64leTargetInfo(const llvm::Triple &Triple)
5478 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005479 BigEndian = false;
5480 }
5481 void getTargetDefines(const LangOptions &Opts,
5482 MacroBuilder &Builder) const override {
5483 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005484 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005485 }
5486};
5487
Tim Northover573cbee2014-05-24 12:52:07 +00005488class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005489 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005490 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005491 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005492 }
5493
5494public:
Tim Northover573cbee2014-05-24 12:52:07 +00005495 AArch64beTargetInfo(const llvm::Triple &Triple)
5496 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005497 void getTargetDefines(const LangOptions &Opts,
5498 MacroBuilder &Builder) const override {
5499 Builder.defineMacro("__AARCH64EB__");
5500 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5501 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005502 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005503 }
5504};
Tim Northovera2ee4332014-03-29 15:09:45 +00005505
Tim Northover573cbee2014-05-24 12:52:07 +00005506class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005507protected:
5508 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5509 MacroBuilder &Builder) const override {
5510 Builder.defineMacro("__AARCH64_SIMD__");
5511 Builder.defineMacro("__ARM64_ARCH_8__");
5512 Builder.defineMacro("__ARM_NEON__");
5513 Builder.defineMacro("__LITTLE_ENDIAN__");
5514 Builder.defineMacro("__REGISTER_PREFIX__", "");
5515 Builder.defineMacro("__arm64", "1");
5516 Builder.defineMacro("__arm64__", "1");
5517
5518 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5519 }
5520
Tim Northovera2ee4332014-03-29 15:09:45 +00005521public:
Tim Northover573cbee2014-05-24 12:52:07 +00005522 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5523 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005524 Int64Type = SignedLongLong;
5525 WCharType = SignedInt;
5526 UseSignedCharForObjCBool = false;
5527
Tim Northovera6a19f12015-02-06 01:25:07 +00005528 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005529 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5530
5531 TheCXXABI.set(TargetCXXABI::iOS64);
5532 }
5533
David Blaikie1cbb9712014-11-14 19:09:44 +00005534 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005535 return TargetInfo::CharPtrBuiltinVaList;
5536 }
5537};
Tim Northovera2ee4332014-03-29 15:09:45 +00005538
Tony Linthicum76329bf2011-12-12 21:14:55 +00005539// Hexagon abstract base class
5540class HexagonTargetInfo : public TargetInfo {
5541 static const Builtin::Info BuiltinInfo[];
5542 static const char * const GCCRegNames[];
5543 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5544 std::string CPU;
5545public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005546 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005547 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00005548 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005549
5550 // {} in inline assembly are packet specifiers, not assembly variant
5551 // specifiers.
5552 NoAsmVariants = true;
5553 }
5554
Craig Topper3164f332014-03-11 03:39:26 +00005555 void getTargetBuiltins(const Builtin::Info *&Records,
5556 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005557 Records = BuiltinInfo;
5558 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5559 }
5560
Craig Topper3164f332014-03-11 03:39:26 +00005561 bool validateAsmConstraint(const char *&Name,
5562 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005563 return true;
5564 }
5565
Craig Topper3164f332014-03-11 03:39:26 +00005566 void getTargetDefines(const LangOptions &Opts,
5567 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005568
Craig Topper3164f332014-03-11 03:39:26 +00005569 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005570 return Feature == "hexagon";
5571 }
Craig Topper3164f332014-03-11 03:39:26 +00005572
5573 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005574 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005575 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005576 ArrayRef<const char *> getGCCRegNames() const override;
5577 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005578 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005579 return "";
5580 }
Sebastian Pop86500282012-01-13 20:37:10 +00005581
5582 static const char *getHexagonCPUSuffix(StringRef Name) {
5583 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005584 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005585 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005586 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005587 }
5588
Craig Topper3164f332014-03-11 03:39:26 +00005589 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005590 if (!getHexagonCPUSuffix(Name))
5591 return false;
5592
Tony Linthicum76329bf2011-12-12 21:14:55 +00005593 CPU = Name;
5594 return true;
5595 }
5596};
5597
5598void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5599 MacroBuilder &Builder) const {
5600 Builder.defineMacro("qdsp6");
5601 Builder.defineMacro("__qdsp6", "1");
5602 Builder.defineMacro("__qdsp6__", "1");
5603
5604 Builder.defineMacro("hexagon");
5605 Builder.defineMacro("__hexagon", "1");
5606 Builder.defineMacro("__hexagon__", "1");
5607
5608 if(CPU == "hexagonv1") {
5609 Builder.defineMacro("__HEXAGON_V1__");
5610 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5611 if(Opts.HexagonQdsp6Compat) {
5612 Builder.defineMacro("__QDSP6_V1__");
5613 Builder.defineMacro("__QDSP6_ARCH__", "1");
5614 }
5615 }
5616 else if(CPU == "hexagonv2") {
5617 Builder.defineMacro("__HEXAGON_V2__");
5618 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5619 if(Opts.HexagonQdsp6Compat) {
5620 Builder.defineMacro("__QDSP6_V2__");
5621 Builder.defineMacro("__QDSP6_ARCH__", "2");
5622 }
5623 }
5624 else if(CPU == "hexagonv3") {
5625 Builder.defineMacro("__HEXAGON_V3__");
5626 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5627 if(Opts.HexagonQdsp6Compat) {
5628 Builder.defineMacro("__QDSP6_V3__");
5629 Builder.defineMacro("__QDSP6_ARCH__", "3");
5630 }
5631 }
5632 else if(CPU == "hexagonv4") {
5633 Builder.defineMacro("__HEXAGON_V4__");
5634 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5635 if(Opts.HexagonQdsp6Compat) {
5636 Builder.defineMacro("__QDSP6_V4__");
5637 Builder.defineMacro("__QDSP6_ARCH__", "4");
5638 }
5639 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005640 else if(CPU == "hexagonv5") {
5641 Builder.defineMacro("__HEXAGON_V5__");
5642 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5643 if(Opts.HexagonQdsp6Compat) {
5644 Builder.defineMacro("__QDSP6_V5__");
5645 Builder.defineMacro("__QDSP6_ARCH__", "5");
5646 }
5647 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005648}
5649
5650const char * const HexagonTargetInfo::GCCRegNames[] = {
5651 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5652 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5653 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5654 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5655 "p0", "p1", "p2", "p3",
5656 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5657};
5658
Craig Topperf054e3a2015-10-19 03:52:27 +00005659ArrayRef<const char *> HexagonTargetInfo::getGCCRegNames() const {
5660 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005661}
5662
5663
5664const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5665 { { "sp" }, "r29" },
5666 { { "fp" }, "r30" },
5667 { { "lr" }, "r31" },
5668 };
5669
Craig Topperf054e3a2015-10-19 03:52:27 +00005670ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
5671 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005672}
5673
5674
5675const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005676#define BUILTIN(ID, TYPE, ATTRS) \
5677 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5678#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5679 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005680#include "clang/Basic/BuiltinsHexagon.def"
5681};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005682
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005683// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5684class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005685 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5686 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005687 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005688public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005689 SparcTargetInfo(const llvm::Triple &Triple)
5690 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005691
Craig Topper3164f332014-03-11 03:39:26 +00005692 bool handleTargetFeatures(std::vector<std::string> &Features,
5693 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005694 // The backend doesn't actually handle soft float yet, but in case someone
5695 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005696 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5697 if (Feature != Features.end()) {
5698 SoftFloat = true;
5699 Features.erase(Feature);
5700 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005701 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005702 }
Craig Topper3164f332014-03-11 03:39:26 +00005703 void getTargetDefines(const LangOptions &Opts,
5704 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005705 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005706 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005707
5708 if (SoftFloat)
5709 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005710 }
Craig Topper3164f332014-03-11 03:39:26 +00005711
5712 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005713 return llvm::StringSwitch<bool>(Feature)
5714 .Case("softfloat", SoftFloat)
5715 .Case("sparc", true)
5716 .Default(false);
5717 }
Craig Topper3164f332014-03-11 03:39:26 +00005718
5719 void getTargetBuiltins(const Builtin::Info *&Records,
5720 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005721 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005722 }
Craig Topper3164f332014-03-11 03:39:26 +00005723 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005724 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005725 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005726 ArrayRef<const char *> getGCCRegNames() const override;
5727 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005728 bool validateAsmConstraint(const char *&Name,
5729 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005730 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005731 switch (*Name) {
5732 case 'I': // Signed 13-bit constant
5733 case 'J': // Zero
5734 case 'K': // 32-bit constant with the low 12 bits clear
5735 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5736 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5737 case 'N': // Same as 'K' but zext (required for SIMode)
5738 case 'O': // The constant 4096
5739 return true;
5740 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005741 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005742 }
Craig Topper3164f332014-03-11 03:39:26 +00005743 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005744 // FIXME: Implement!
5745 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005746 }
5747};
5748
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005749const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005750 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5751 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5752 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5753 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5754};
5755
Craig Topperf054e3a2015-10-19 03:52:27 +00005756ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
5757 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00005758}
5759
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005760const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005761 { { "g0" }, "r0" },
5762 { { "g1" }, "r1" },
5763 { { "g2" }, "r2" },
5764 { { "g3" }, "r3" },
5765 { { "g4" }, "r4" },
5766 { { "g5" }, "r5" },
5767 { { "g6" }, "r6" },
5768 { { "g7" }, "r7" },
5769 { { "o0" }, "r8" },
5770 { { "o1" }, "r9" },
5771 { { "o2" }, "r10" },
5772 { { "o3" }, "r11" },
5773 { { "o4" }, "r12" },
5774 { { "o5" }, "r13" },
5775 { { "o6", "sp" }, "r14" },
5776 { { "o7" }, "r15" },
5777 { { "l0" }, "r16" },
5778 { { "l1" }, "r17" },
5779 { { "l2" }, "r18" },
5780 { { "l3" }, "r19" },
5781 { { "l4" }, "r20" },
5782 { { "l5" }, "r21" },
5783 { { "l6" }, "r22" },
5784 { { "l7" }, "r23" },
5785 { { "i0" }, "r24" },
5786 { { "i1" }, "r25" },
5787 { { "i2" }, "r26" },
5788 { { "i3" }, "r27" },
5789 { { "i4" }, "r28" },
5790 { { "i5" }, "r29" },
5791 { { "i6", "fp" }, "r30" },
5792 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005793};
5794
Craig Topperf054e3a2015-10-19 03:52:27 +00005795ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
5796 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00005797}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005798
5799// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5800class SparcV8TargetInfo : public SparcTargetInfo {
5801public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005802 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005803 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00005804 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
5805 switch (getTriple().getOS()) {
5806 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00005807 SizeType = UnsignedInt;
5808 IntPtrType = SignedInt;
5809 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00005810 break;
5811 case llvm::Triple::NetBSD:
5812 case llvm::Triple::OpenBSD:
5813 SizeType = UnsignedLong;
5814 IntPtrType = SignedLong;
5815 PtrDiffType = SignedLong;
5816 break;
Brad Smith56495d52015-08-13 22:00:53 +00005817 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005818 }
5819
Craig Topper3164f332014-03-11 03:39:26 +00005820 void getTargetDefines(const LangOptions &Opts,
5821 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005822 SparcTargetInfo::getTargetDefines(Opts, Builder);
5823 Builder.defineMacro("__sparcv8");
5824 }
5825};
5826
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005827// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5828class SparcV8elTargetInfo : public SparcV8TargetInfo {
5829 public:
5830 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005831 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005832 BigEndian = false;
5833 }
5834};
5835
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005836// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5837class SparcV9TargetInfo : public SparcTargetInfo {
5838public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005839 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005840 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00005841 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005842 // This is an LP64 platform.
5843 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005844
5845 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005846 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005847 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005848 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005849 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005850 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005851
5852 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5853 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5854 LongDoubleWidth = 128;
5855 LongDoubleAlign = 128;
5856 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005857 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005858 }
5859
Craig Topper3164f332014-03-11 03:39:26 +00005860 void getTargetDefines(const LangOptions &Opts,
5861 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005862 SparcTargetInfo::getTargetDefines(Opts, Builder);
5863 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005864 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005865 // Solaris doesn't need these variants, but the BSDs do.
5866 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005867 Builder.defineMacro("__sparc64__");
5868 Builder.defineMacro("__sparc_v9__");
5869 Builder.defineMacro("__sparcv9__");
5870 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005871 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005872
Craig Topper3164f332014-03-11 03:39:26 +00005873 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005874 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5875 .Case("v9", true)
5876 .Case("ultrasparc", true)
5877 .Case("ultrasparc3", true)
5878 .Case("niagara", true)
5879 .Case("niagara2", true)
5880 .Case("niagara3", true)
5881 .Case("niagara4", true)
5882 .Default(false);
5883
5884 // No need to store the CPU yet. There aren't any CPU-specific
5885 // macros to define.
5886 return CPUKnown;
5887 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005888};
5889
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005890class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005891 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005892 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005893 std::string CPU;
5894 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005895 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005896
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005897public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005898 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00005899 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
5900 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005901 IntMaxType = SignedLong;
5902 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005903 TLSSupported = true;
5904 IntWidth = IntAlign = 32;
5905 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5906 PointerWidth = PointerAlign = 64;
5907 LongDoubleWidth = 128;
5908 LongDoubleAlign = 64;
5909 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005910 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005911 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00005912 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 +00005913 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5914 }
5915 void getTargetDefines(const LangOptions &Opts,
5916 MacroBuilder &Builder) const override {
5917 Builder.defineMacro("__s390__");
5918 Builder.defineMacro("__s390x__");
5919 Builder.defineMacro("__zarch__");
5920 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005921 if (HasTransactionalExecution)
5922 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005923 if (Opts.ZVector)
5924 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005925 }
5926 void getTargetBuiltins(const Builtin::Info *&Records,
5927 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005928 Records = BuiltinInfo;
5929 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005930 }
5931
Craig Topperf054e3a2015-10-19 03:52:27 +00005932 ArrayRef<const char *> getGCCRegNames() const override;
5933 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005934 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00005935 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00005936 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005937 bool validateAsmConstraint(const char *&Name,
5938 TargetInfo::ConstraintInfo &info) const override;
5939 const char *getClobbers() const override {
5940 // FIXME: Is this really right?
5941 return "";
5942 }
5943 BuiltinVaListKind getBuiltinVaListKind() const override {
5944 return TargetInfo::SystemZBuiltinVaList;
5945 }
5946 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005947 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005948 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5949 .Case("z10", true)
5950 .Case("z196", true)
5951 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005952 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005953 .Default(false);
5954
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005955 return CPUKnown;
5956 }
Eric Christopher8c47b422015-10-09 18:39:55 +00005957 bool
5958 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5959 StringRef CPU,
5960 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005961 if (CPU == "zEC12")
5962 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005963 if (CPU == "z13") {
5964 Features["transactional-execution"] = true;
5965 Features["vector"] = true;
5966 }
Eric Christopher007b0a02015-08-28 22:32:01 +00005967 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005968 }
5969
5970 bool handleTargetFeatures(std::vector<std::string> &Features,
5971 DiagnosticsEngine &Diags) override {
5972 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00005973 for (const auto &Feature : Features) {
5974 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005975 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00005976 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005977 HasVector = true;
5978 }
5979 // If we use the vector ABI, vector types are 64-bit aligned.
5980 if (HasVector) {
5981 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005982 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5983 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005984 }
5985 return true;
5986 }
5987
5988 bool hasFeature(StringRef Feature) const override {
5989 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005990 .Case("systemz", true)
5991 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005992 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005993 .Default(false);
5994 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005995
5996 StringRef getABI() const override {
5997 if (HasVector)
5998 return "vector";
5999 return "";
6000 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006001
6002 bool useFloat128ManglingForLongDouble() const override {
6003 return true;
6004 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006005};
6006
6007const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6008#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006009 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006010#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006011};
6012
6013const char *const SystemZTargetInfo::GCCRegNames[] = {
6014 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6015 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6016 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6017 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6018};
6019
Craig Topperf054e3a2015-10-19 03:52:27 +00006020ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6021 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006022}
6023
6024bool SystemZTargetInfo::
6025validateAsmConstraint(const char *&Name,
6026 TargetInfo::ConstraintInfo &Info) const {
6027 switch (*Name) {
6028 default:
6029 return false;
6030
6031 case 'a': // Address register
6032 case 'd': // Data register (equivalent to 'r')
6033 case 'f': // Floating-point register
6034 Info.setAllowsRegister();
6035 return true;
6036
6037 case 'I': // Unsigned 8-bit constant
6038 case 'J': // Unsigned 12-bit constant
6039 case 'K': // Signed 16-bit constant
6040 case 'L': // Signed 20-bit displacement (on all targets we support)
6041 case 'M': // 0x7fffffff
6042 return true;
6043
6044 case 'Q': // Memory with base and unsigned 12-bit displacement
6045 case 'R': // Likewise, plus an index
6046 case 'S': // Memory with base and signed 20-bit displacement
6047 case 'T': // Likewise, plus an index
6048 Info.setAllowsMemory();
6049 return true;
6050 }
6051}
Ulrich Weigand47445072013-05-06 16:26:41 +00006052
Eric Christopherc48497a2015-09-18 21:26:24 +00006053class MSP430TargetInfo : public TargetInfo {
6054 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006055
Eric Christopherc48497a2015-09-18 21:26:24 +00006056public:
6057 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6058 BigEndian = false;
6059 TLSSupported = false;
6060 IntWidth = 16;
6061 IntAlign = 16;
6062 LongWidth = 32;
6063 LongLongWidth = 64;
6064 LongAlign = LongLongAlign = 16;
6065 PointerWidth = 16;
6066 PointerAlign = 16;
6067 SuitableAlign = 16;
6068 SizeType = UnsignedInt;
6069 IntMaxType = SignedLongLong;
6070 IntPtrType = SignedInt;
6071 PtrDiffType = SignedInt;
6072 SigAtomicType = SignedLong;
6073 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006074 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006075 void getTargetDefines(const LangOptions &Opts,
6076 MacroBuilder &Builder) const override {
6077 Builder.defineMacro("MSP430");
6078 Builder.defineMacro("__MSP430__");
6079 // FIXME: defines for different 'flavours' of MCU
6080 }
6081 void getTargetBuiltins(const Builtin::Info *&Records,
6082 unsigned &NumRecords) const override {
6083 // FIXME: Implement.
6084 Records = nullptr;
6085 NumRecords = 0;
6086 }
6087 bool hasFeature(StringRef Feature) const override {
6088 return Feature == "msp430";
6089 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006090 ArrayRef<const char *> getGCCRegNames() const override;
6091 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006092 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006093 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006094 }
6095 bool validateAsmConstraint(const char *&Name,
6096 TargetInfo::ConstraintInfo &info) const override {
6097 // FIXME: implement
6098 switch (*Name) {
6099 case 'K': // the constant 1
6100 case 'L': // constant -1^20 .. 1^19
6101 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006102 return true;
6103 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006104 // No target constraints for now.
6105 return false;
6106 }
6107 const char *getClobbers() const override {
6108 // FIXME: Is this really right?
6109 return "";
6110 }
6111 BuiltinVaListKind getBuiltinVaListKind() const override {
6112 // FIXME: implement
6113 return TargetInfo::CharPtrBuiltinVaList;
6114 }
6115};
6116
6117const char *const MSP430TargetInfo::GCCRegNames[] = {
6118 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6119 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6120
Craig Topperf054e3a2015-10-19 03:52:27 +00006121ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6122 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006123}
6124
6125// LLVM and Clang cannot be used directly to output native binaries for
6126// target, but is used to compile C code to llvm bitcode with correct
6127// type and alignment information.
6128//
6129// TCE uses the llvm bitcode as input and uses it for generating customized
6130// target processor and program binary. TCE co-design environment is
6131// publicly available in http://tce.cs.tut.fi
6132
6133static const unsigned TCEOpenCLAddrSpaceMap[] = {
6134 3, // opencl_global
6135 4, // opencl_local
6136 5, // opencl_constant
6137 // FIXME: generic has to be added to the target
6138 0, // opencl_generic
6139 0, // cuda_device
6140 0, // cuda_constant
6141 0 // cuda_shared
6142};
6143
6144class TCETargetInfo : public TargetInfo {
6145public:
6146 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6147 TLSSupported = false;
6148 IntWidth = 32;
6149 LongWidth = LongLongWidth = 32;
6150 PointerWidth = 32;
6151 IntAlign = 32;
6152 LongAlign = LongLongAlign = 32;
6153 PointerAlign = 32;
6154 SuitableAlign = 32;
6155 SizeType = UnsignedInt;
6156 IntMaxType = SignedLong;
6157 IntPtrType = SignedInt;
6158 PtrDiffType = SignedInt;
6159 FloatWidth = 32;
6160 FloatAlign = 32;
6161 DoubleWidth = 32;
6162 DoubleAlign = 32;
6163 LongDoubleWidth = 32;
6164 LongDoubleAlign = 32;
6165 FloatFormat = &llvm::APFloat::IEEEsingle;
6166 DoubleFormat = &llvm::APFloat::IEEEsingle;
6167 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6168 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6169 "-f64:32-v64:32-v128:32-a:0:32-n32";
6170 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6171 UseAddrSpaceMapMangling = true;
6172 }
6173
6174 void getTargetDefines(const LangOptions &Opts,
6175 MacroBuilder &Builder) const override {
6176 DefineStd(Builder, "tce", Opts);
6177 Builder.defineMacro("__TCE__");
6178 Builder.defineMacro("__TCE_V1__");
6179 }
6180 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6181
6182 void getTargetBuiltins(const Builtin::Info *&Records,
6183 unsigned &NumRecords) const override {}
6184 const char *getClobbers() const override { return ""; }
6185 BuiltinVaListKind getBuiltinVaListKind() const override {
6186 return TargetInfo::VoidPtrBuiltinVaList;
6187 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006188 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006189 bool validateAsmConstraint(const char *&Name,
6190 TargetInfo::ConstraintInfo &info) const override {
6191 return true;
6192 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006193 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6194 return None;
6195 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006196};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006197
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006198class BPFTargetInfo : public TargetInfo {
6199public:
6200 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6201 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6202 SizeType = UnsignedLong;
6203 PtrDiffType = SignedLong;
6204 IntPtrType = SignedLong;
6205 IntMaxType = SignedLong;
6206 Int64Type = SignedLong;
6207 RegParmMax = 5;
6208 if (Triple.getArch() == llvm::Triple::bpfeb) {
6209 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006210 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006211 } else {
6212 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006213 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006214 }
6215 MaxAtomicPromoteWidth = 64;
6216 MaxAtomicInlineWidth = 64;
6217 TLSSupported = false;
6218 }
6219 void getTargetDefines(const LangOptions &Opts,
6220 MacroBuilder &Builder) const override {
6221 DefineStd(Builder, "bpf", Opts);
6222 Builder.defineMacro("__BPF__");
6223 }
6224 bool hasFeature(StringRef Feature) const override {
6225 return Feature == "bpf";
6226 }
6227
6228 void getTargetBuiltins(const Builtin::Info *&Records,
6229 unsigned &NumRecords) const override {}
6230 const char *getClobbers() const override {
6231 return "";
6232 }
6233 BuiltinVaListKind getBuiltinVaListKind() const override {
6234 return TargetInfo::VoidPtrBuiltinVaList;
6235 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006236 ArrayRef<const char *> getGCCRegNames() const override {
6237 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006238 }
6239 bool validateAsmConstraint(const char *&Name,
6240 TargetInfo::ConstraintInfo &info) const override {
6241 return true;
6242 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006243 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6244 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006245 }
6246};
6247
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006248class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006249 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006250
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006251 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006252 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006253 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006254 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006255 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006256 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006257 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006258 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006259 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006260 enum DspRevEnum {
6261 NoDSP, DSP1, DSP2
6262 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006263 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006264
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006265protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006266 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006267 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006268
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006269public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006270 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6271 const std::string &CPUStr)
6272 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006273 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006274 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6275 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6276 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006277
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006278 bool isNaN2008Default() const {
6279 return CPU == "mips32r6" || CPU == "mips64r6";
6280 }
6281
6282 bool isFP64Default() const {
6283 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6284 }
6285
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006286 bool isNan2008() const override {
6287 return IsNan2008;
6288 }
6289
Alp Toker4925ba72014-06-07 23:30:42 +00006290 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006291 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006292 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6293 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006294 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006295 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006296 .Case("mips1", IsMips32)
6297 .Case("mips2", IsMips32)
6298 .Case("mips3", true)
6299 .Case("mips4", true)
6300 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006301 .Case("mips32", IsMips32)
6302 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006303 .Case("mips32r3", IsMips32)
6304 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006305 .Case("mips32r6", IsMips32)
6306 .Case("mips64", true)
6307 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006308 .Case("mips64r3", true)
6309 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006310 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006311 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006312 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006313 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006314 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006315 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006316 bool
6317 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6318 StringRef CPU,
6319 const std::vector<std::string> &FeaturesVec) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006320 if (CPU == "octeon")
6321 Features["mips64r2"] = Features["cnmips"] = true;
6322 else
6323 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006324 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006325 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006326
Craig Topper3164f332014-03-11 03:39:26 +00006327 void getTargetDefines(const LangOptions &Opts,
6328 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006329 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006330 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006331 if (Opts.GNUMode)
6332 Builder.defineMacro("mips");
6333
Simon Atanasyan683535b2012-08-29 19:14:58 +00006334 Builder.defineMacro("__REGISTER_PREFIX__", "");
6335
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006336 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006337 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006338 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006339 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006340 case SoftFloat:
6341 Builder.defineMacro("__mips_soft_float", Twine(1));
6342 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006343 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006344
Simon Atanasyan16071912013-04-14 14:07:30 +00006345 if (IsSingleFloat)
6346 Builder.defineMacro("__mips_single_float", Twine(1));
6347
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006348 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6349 Builder.defineMacro("_MIPS_FPSET",
6350 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6351
Simon Atanasyan72244b62012-07-05 16:06:06 +00006352 if (IsMips16)
6353 Builder.defineMacro("__mips16", Twine(1));
6354
Simon Atanasyan60777612013-04-14 14:07:51 +00006355 if (IsMicromips)
6356 Builder.defineMacro("__mips_micromips", Twine(1));
6357
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006358 if (IsNan2008)
6359 Builder.defineMacro("__mips_nan2008", Twine(1));
6360
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006361 switch (DspRev) {
6362 default:
6363 break;
6364 case DSP1:
6365 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6366 Builder.defineMacro("__mips_dsp", Twine(1));
6367 break;
6368 case DSP2:
6369 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6370 Builder.defineMacro("__mips_dspr2", Twine(1));
6371 Builder.defineMacro("__mips_dsp", Twine(1));
6372 break;
6373 }
6374
Jack Carter44ff1e52013-08-12 17:20:29 +00006375 if (HasMSA)
6376 Builder.defineMacro("__mips_msa", Twine(1));
6377
Simon Atanasyan26f19672012-04-05 19:28:31 +00006378 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6379 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6380 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006381
6382 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6383 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006384 }
6385
Craig Topper3164f332014-03-11 03:39:26 +00006386 void getTargetBuiltins(const Builtin::Info *&Records,
6387 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006388 Records = BuiltinInfo;
6389 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006390 }
Craig Topper3164f332014-03-11 03:39:26 +00006391 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006392 return llvm::StringSwitch<bool>(Feature)
6393 .Case("mips", true)
6394 .Case("fp64", HasFP64)
6395 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006396 }
Craig Topper3164f332014-03-11 03:39:26 +00006397 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006398 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006399 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006400 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006401 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006402 // CPU register names
6403 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006404 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6405 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6406 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006407 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6408 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006409 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6410 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6411 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6412 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006413 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006414 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006415 "$fcc5","$fcc6","$fcc7",
6416 // MSA register names
6417 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6418 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6419 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6420 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6421 // MSA control register names
6422 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6423 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006424 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006425 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006426 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006427 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006428 bool validateAsmConstraint(const char *&Name,
6429 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006430 switch (*Name) {
6431 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006432 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006433 case 'r': // CPU registers.
6434 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006435 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006436 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006437 case 'c': // $25 for indirect jumps
6438 case 'l': // lo register
6439 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006440 Info.setAllowsRegister();
6441 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006442 case 'I': // Signed 16-bit constant
6443 case 'J': // Integer 0
6444 case 'K': // Unsigned 16-bit constant
6445 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6446 case 'M': // Constants not loadable via lui, addiu, or ori
6447 case 'N': // Constant -1 to -65535
6448 case 'O': // A signed 15-bit constant
6449 case 'P': // A constant between 1 go 65535
6450 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006451 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006452 Info.setAllowsMemory();
6453 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006454 case 'Z':
6455 if (Name[1] == 'C') { // An address usable by ll, and sc.
6456 Info.setAllowsMemory();
6457 Name++; // Skip over 'Z'.
6458 return true;
6459 }
6460 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006461 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006462 }
6463
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006464 std::string convertConstraint(const char *&Constraint) const override {
6465 std::string R;
6466 switch (*Constraint) {
6467 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6468 if (Constraint[1] == 'C') {
6469 R = std::string("^") + std::string(Constraint, 2);
6470 Constraint++;
6471 return R;
6472 }
6473 break;
6474 }
6475 return TargetInfo::convertConstraint(Constraint);
6476 }
6477
Craig Topper3164f332014-03-11 03:39:26 +00006478 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006479 // In GCC, $1 is not widely used in generated code (it's used only in a few
6480 // specific situations), so there is no real need for users to add it to
6481 // the clobbers list if they want to use it in their inline assembly code.
6482 //
6483 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6484 // code generation, so using it in inline assembly without adding it to the
6485 // clobbers list can cause conflicts between the inline assembly code and
6486 // the surrounding generated code.
6487 //
6488 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6489 // operands, which will conflict with the ".set at" assembler option (which
6490 // we use only for inline assembly, in order to maintain compatibility with
6491 // GCC) and will also conflict with the user's usage of $1.
6492 //
6493 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6494 // register for generated code is to automatically clobber $1 for all inline
6495 // assembly code.
6496 //
6497 // FIXME: We should automatically clobber $1 only for inline assembly code
6498 // which actually uses it. This would allow LLVM to use $1 for inline
6499 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006500 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006501 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006502
Craig Topper3164f332014-03-11 03:39:26 +00006503 bool handleTargetFeatures(std::vector<std::string> &Features,
6504 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006505 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006506 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006507 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006508 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006509 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006510 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006511 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006512
Eric Christopher610fe112015-08-26 08:21:55 +00006513 for (const auto &Feature : Features) {
6514 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006515 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006516 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006517 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006518 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006519 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006520 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006521 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006522 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006523 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006524 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006525 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006526 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006527 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006528 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006529 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006530 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006531 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006532 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006533 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006534 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006535 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006536 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006537
Eric Christopher964a5f32015-08-05 23:48:05 +00006538 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006539
Rafael Espindolaeb265472013-08-21 21:59:03 +00006540 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006541 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006542
Craig Topper3164f332014-03-11 03:39:26 +00006543 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006544 if (RegNo == 0) return 4;
6545 if (RegNo == 1) return 5;
6546 return -1;
6547 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006548
6549 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006550};
6551
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006552const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006553#define BUILTIN(ID, TYPE, ATTRS) \
6554 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6555#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6556 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006557#include "clang/Basic/BuiltinsMips.def"
6558};
6559
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006560class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006561public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006562 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006563 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006564 SizeType = UnsignedInt;
6565 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006566 Int64Type = SignedLongLong;
6567 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006568 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006569 }
Craig Topper3164f332014-03-11 03:39:26 +00006570 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006571 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006572 ABI = Name;
6573 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006574 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006575 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006576 }
Craig Topper3164f332014-03-11 03:39:26 +00006577 void getTargetDefines(const LangOptions &Opts,
6578 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006579 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006580
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006581 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006582 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6583
6584 const std::string& CPUStr = getCPU();
6585 if (CPUStr == "mips32")
6586 Builder.defineMacro("__mips_isa_rev", "1");
6587 else if (CPUStr == "mips32r2")
6588 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006589 else if (CPUStr == "mips32r3")
6590 Builder.defineMacro("__mips_isa_rev", "3");
6591 else if (CPUStr == "mips32r5")
6592 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006593 else if (CPUStr == "mips32r6")
6594 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006595
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006596 if (ABI == "o32") {
6597 Builder.defineMacro("__mips_o32");
6598 Builder.defineMacro("_ABIO32", "1");
6599 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6600 }
6601 else if (ABI == "eabi")
6602 Builder.defineMacro("__mips_eabi");
6603 else
David Blaikie83d382b2011-09-23 05:06:16 +00006604 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006605 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006606 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006607 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6608 { { "at" }, "$1" },
6609 { { "v0" }, "$2" },
6610 { { "v1" }, "$3" },
6611 { { "a0" }, "$4" },
6612 { { "a1" }, "$5" },
6613 { { "a2" }, "$6" },
6614 { { "a3" }, "$7" },
6615 { { "t0" }, "$8" },
6616 { { "t1" }, "$9" },
6617 { { "t2" }, "$10" },
6618 { { "t3" }, "$11" },
6619 { { "t4" }, "$12" },
6620 { { "t5" }, "$13" },
6621 { { "t6" }, "$14" },
6622 { { "t7" }, "$15" },
6623 { { "s0" }, "$16" },
6624 { { "s1" }, "$17" },
6625 { { "s2" }, "$18" },
6626 { { "s3" }, "$19" },
6627 { { "s4" }, "$20" },
6628 { { "s5" }, "$21" },
6629 { { "s6" }, "$22" },
6630 { { "s7" }, "$23" },
6631 { { "t8" }, "$24" },
6632 { { "t9" }, "$25" },
6633 { { "k0" }, "$26" },
6634 { { "k1" }, "$27" },
6635 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006636 { { "sp","$sp" }, "$29" },
6637 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006638 { { "ra" }, "$31" }
6639 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006640 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006641 }
6642};
6643
6644class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006645 void setDataLayoutString() override {
6646 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006647 }
6648
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006649public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006650 Mips32EBTargetInfo(const llvm::Triple &Triple)
6651 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006652 }
Craig Topper3164f332014-03-11 03:39:26 +00006653 void getTargetDefines(const LangOptions &Opts,
6654 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006655 DefineStd(Builder, "MIPSEB", Opts);
6656 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006657 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006658 }
6659};
6660
6661class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006662 void setDataLayoutString() override {
6663 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006664 }
6665
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006666public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006667 Mips32ELTargetInfo(const llvm::Triple &Triple)
6668 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006669 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006670 }
Craig Topper3164f332014-03-11 03:39:26 +00006671 void getTargetDefines(const LangOptions &Opts,
6672 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006673 DefineStd(Builder, "MIPSEL", Opts);
6674 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006675 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006676 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006677};
Akira Hatanakabef17452011-09-20 19:21:49 +00006678
6679class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006680public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006681 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006682 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006683 LongDoubleWidth = LongDoubleAlign = 128;
6684 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006685 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6686 LongDoubleWidth = LongDoubleAlign = 64;
6687 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6688 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006689 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006690 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006691 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006692 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006693
6694 void setN64ABITypes() {
6695 LongWidth = LongAlign = 64;
6696 PointerWidth = PointerAlign = 64;
6697 SizeType = UnsignedLong;
6698 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006699 Int64Type = SignedLong;
6700 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006701 }
6702
6703 void setN32ABITypes() {
6704 LongWidth = LongAlign = 32;
6705 PointerWidth = PointerAlign = 32;
6706 SizeType = UnsignedInt;
6707 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006708 Int64Type = SignedLongLong;
6709 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006710 }
6711
Craig Topper3164f332014-03-11 03:39:26 +00006712 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006713 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006714 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006715 ABI = Name;
6716 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006717 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006718 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006719 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006720 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006721 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006722 }
6723 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006724 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006725
Craig Topper3164f332014-03-11 03:39:26 +00006726 void getTargetDefines(const LangOptions &Opts,
6727 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006728 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006729
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006730 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006731 Builder.defineMacro("__mips64");
6732 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006733 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6734
6735 const std::string& CPUStr = getCPU();
6736 if (CPUStr == "mips64")
6737 Builder.defineMacro("__mips_isa_rev", "1");
6738 else if (CPUStr == "mips64r2")
6739 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006740 else if (CPUStr == "mips64r3")
6741 Builder.defineMacro("__mips_isa_rev", "3");
6742 else if (CPUStr == "mips64r5")
6743 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006744 else if (CPUStr == "mips64r6")
6745 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006746
Akira Hatanakabef17452011-09-20 19:21:49 +00006747 if (ABI == "n32") {
6748 Builder.defineMacro("__mips_n32");
6749 Builder.defineMacro("_ABIN32", "2");
6750 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6751 }
6752 else if (ABI == "n64") {
6753 Builder.defineMacro("__mips_n64");
6754 Builder.defineMacro("_ABI64", "3");
6755 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6756 }
6757 else
David Blaikie83d382b2011-09-23 05:06:16 +00006758 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006759 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006760 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006761 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6762 { { "at" }, "$1" },
6763 { { "v0" }, "$2" },
6764 { { "v1" }, "$3" },
6765 { { "a0" }, "$4" },
6766 { { "a1" }, "$5" },
6767 { { "a2" }, "$6" },
6768 { { "a3" }, "$7" },
6769 { { "a4" }, "$8" },
6770 { { "a5" }, "$9" },
6771 { { "a6" }, "$10" },
6772 { { "a7" }, "$11" },
6773 { { "t0" }, "$12" },
6774 { { "t1" }, "$13" },
6775 { { "t2" }, "$14" },
6776 { { "t3" }, "$15" },
6777 { { "s0" }, "$16" },
6778 { { "s1" }, "$17" },
6779 { { "s2" }, "$18" },
6780 { { "s3" }, "$19" },
6781 { { "s4" }, "$20" },
6782 { { "s5" }, "$21" },
6783 { { "s6" }, "$22" },
6784 { { "s7" }, "$23" },
6785 { { "t8" }, "$24" },
6786 { { "t9" }, "$25" },
6787 { { "k0" }, "$26" },
6788 { { "k1" }, "$27" },
6789 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006790 { { "sp","$sp" }, "$29" },
6791 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006792 { { "ra" }, "$31" }
6793 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006794 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00006795 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006796
6797 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006798};
6799
6800class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006801 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006802 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006803 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 +00006804 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006805 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006806
Akira Hatanakabef17452011-09-20 19:21:49 +00006807 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006808
Akira Hatanakabef17452011-09-20 19:21:49 +00006809public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006810 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006811 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006812 void getTargetDefines(const LangOptions &Opts,
6813 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006814 DefineStd(Builder, "MIPSEB", Opts);
6815 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006816 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006817 }
6818};
6819
6820class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006821 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006822 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006823 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 +00006824 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006825 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006826 }
6827public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006828 Mips64ELTargetInfo(const llvm::Triple &Triple)
6829 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006830 // Default ABI is n64.
6831 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006832 }
Craig Topper3164f332014-03-11 03:39:26 +00006833 void getTargetDefines(const LangOptions &Opts,
6834 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006835 DefineStd(Builder, "MIPSEL", Opts);
6836 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006837 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006838 }
6839};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006840
Ivan Krasindd7403e2011-08-24 20:22:22 +00006841class PNaClTargetInfo : public TargetInfo {
6842public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006843 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006844 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006845 this->UserLabelPrefix = "";
6846 this->LongAlign = 32;
6847 this->LongWidth = 32;
6848 this->PointerAlign = 32;
6849 this->PointerWidth = 32;
6850 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006851 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006852 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006853 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006854 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006855 this->SizeType = TargetInfo::UnsignedInt;
6856 this->PtrDiffType = TargetInfo::SignedInt;
6857 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006858 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006859 }
6860
Craig Toppere6f17d02014-03-11 04:07:52 +00006861 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006862 Builder.defineMacro("__le32__");
6863 Builder.defineMacro("__pnacl__");
6864 }
Craig Topper3164f332014-03-11 03:39:26 +00006865 void getTargetDefines(const LangOptions &Opts,
6866 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006867 getArchDefines(Opts, Builder);
6868 }
Craig Topper3164f332014-03-11 03:39:26 +00006869 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006870 return Feature == "pnacl";
6871 }
Craig Topper3164f332014-03-11 03:39:26 +00006872 void getTargetBuiltins(const Builtin::Info *&Records,
6873 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006874 }
Craig Topper3164f332014-03-11 03:39:26 +00006875 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006876 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006877 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006878 ArrayRef<const char *> getGCCRegNames() const override;
6879 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006880 bool validateAsmConstraint(const char *&Name,
6881 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006882 return false;
6883 }
6884
Craig Topper3164f332014-03-11 03:39:26 +00006885 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006886 return "";
6887 }
6888};
6889
Craig Topperf054e3a2015-10-19 03:52:27 +00006890ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
6891 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006892}
6893
Craig Topperf054e3a2015-10-19 03:52:27 +00006894ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
6895 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006896}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006897
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006898// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6899class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6900public:
6901 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00006902 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006903 }
6904
6905 BuiltinVaListKind getBuiltinVaListKind() const override {
6906 return TargetInfo::PNaClABIBuiltinVaList;
6907 }
6908};
6909
JF Bastien643817d2014-09-12 17:52:47 +00006910class Le64TargetInfo : public TargetInfo {
6911 static const Builtin::Info BuiltinInfo[];
6912
6913public:
6914 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6915 BigEndian = false;
6916 NoAsmVariants = true;
6917 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6918 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006919 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006920 }
6921
6922 void getTargetDefines(const LangOptions &Opts,
6923 MacroBuilder &Builder) const override {
6924 DefineStd(Builder, "unix", Opts);
6925 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6926 Builder.defineMacro("__ELF__");
6927 }
6928 void getTargetBuiltins(const Builtin::Info *&Records,
6929 unsigned &NumRecords) const override {
6930 Records = BuiltinInfo;
6931 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6932 }
6933 BuiltinVaListKind getBuiltinVaListKind() const override {
6934 return TargetInfo::PNaClABIBuiltinVaList;
6935 }
6936 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00006937 ArrayRef<const char *> getGCCRegNames() const override {
6938 return None;
JF Bastien643817d2014-09-12 17:52:47 +00006939 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006940 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6941 return None;
JF Bastien643817d2014-09-12 17:52:47 +00006942 }
6943 bool validateAsmConstraint(const char *&Name,
6944 TargetInfo::ConstraintInfo &Info) const override {
6945 return false;
6946 }
6947
6948 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006949};
Dan Gohmanc2853072015-09-03 22:51:53 +00006950
6951class WebAssemblyTargetInfo : public TargetInfo {
6952 static const Builtin::Info BuiltinInfo[];
6953
6954 enum SIMDEnum {
6955 NoSIMD,
6956 SIMD128,
6957 } SIMDLevel;
6958
6959public:
6960 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
6961 : TargetInfo(T), SIMDLevel(NoSIMD) {
6962 BigEndian = false;
6963 NoAsmVariants = true;
6964 SuitableAlign = 128;
6965 LargeArrayMinWidth = 128;
6966 LargeArrayAlign = 128;
6967 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00006968 SigAtomicType = SignedLong;
Dan Gohmanc2853072015-09-03 22:51:53 +00006969 }
6970
6971protected:
6972 void getTargetDefines(const LangOptions &Opts,
6973 MacroBuilder &Builder) const override {
6974 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
6975 if (SIMDLevel >= SIMD128)
6976 Builder.defineMacro("__wasm_simd128__");
6977 }
6978
6979private:
Eric Christopher8c47b422015-10-09 18:39:55 +00006980 bool
6981 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6982 StringRef CPU,
6983 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00006984 if (CPU == "bleeding-edge")
6985 Features["simd128"] = true;
6986 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6987 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00006988 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00006989 return llvm::StringSwitch<bool>(Feature)
6990 .Case("simd128", SIMDLevel >= SIMD128)
6991 .Default(false);
6992 }
6993 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00006994 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00006995 for (const auto &Feature : Features) {
6996 if (Feature == "+simd128") {
6997 SIMDLevel = std::max(SIMDLevel, SIMD128);
6998 continue;
6999 }
7000 if (Feature == "-simd128") {
7001 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7002 continue;
7003 }
7004
7005 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7006 << "-target-feature";
7007 return false;
7008 }
7009 return true;
7010 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007011 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007012 return llvm::StringSwitch<bool>(Name)
7013 .Case("mvp", true)
7014 .Case("bleeding-edge", true)
7015 .Case("generic", true)
7016 .Default(false);
7017 }
7018 void getTargetBuiltins(const Builtin::Info *&Records,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007019 unsigned &NumRecords) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007020 Records = BuiltinInfo;
7021 NumRecords = clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin;
7022 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007023 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007024 // TODO: Implement va_list properly.
7025 return VoidPtrBuiltinVaList;
7026 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007027 ArrayRef<const char *> getGCCRegNames() const final {
7028 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007029 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007030 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7031 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007032 }
7033 bool
7034 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007035 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007036 return false;
7037 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007038 const char *getClobbers() const final { return ""; }
7039 bool isCLZForZeroUndef() const final { return false; }
7040 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007041 IntType getIntTypeByWidth(unsigned BitWidth,
7042 bool IsSigned) const final {
7043 // WebAssembly prefers long long for explicitly 64-bit integers.
7044 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7045 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7046 }
7047 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7048 bool IsSigned) const final {
7049 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7050 return BitWidth == 64
7051 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7052 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7053 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007054};
7055
7056const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7057#define BUILTIN(ID, TYPE, ATTRS) \
7058 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7059#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7060 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7061#include "clang/Basic/BuiltinsWebAssembly.def"
7062};
7063
7064class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7065public:
7066 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7067 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007068 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohmanc2853072015-09-03 22:51:53 +00007069 DataLayoutString = "e-p:32:32-i64:64-n32:64-S128";
7070 }
7071
7072protected:
7073 void getTargetDefines(const LangOptions &Opts,
7074 MacroBuilder &Builder) const override {
7075 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7076 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7077 }
7078};
7079
7080class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7081public:
7082 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7083 : WebAssemblyTargetInfo(T) {
7084 LongAlign = LongWidth = 64;
7085 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007086 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohmanc2853072015-09-03 22:51:53 +00007087 DataLayoutString = "e-p:64:64-i64:64-n32:64-S128";
7088 }
7089
7090protected:
7091 void getTargetDefines(const LangOptions &Opts,
7092 MacroBuilder &Builder) const override {
7093 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7094 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7095 }
7096};
7097
JF Bastien643817d2014-09-12 17:52:47 +00007098const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7099#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007100 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007101#include "clang/Basic/BuiltinsLe64.def"
7102};
7103
Eric Christopherc48497a2015-09-18 21:26:24 +00007104static const unsigned SPIRAddrSpaceMap[] = {
7105 1, // opencl_global
7106 3, // opencl_local
7107 2, // opencl_constant
7108 4, // opencl_generic
7109 0, // cuda_device
7110 0, // cuda_constant
7111 0 // cuda_shared
7112};
7113class SPIRTargetInfo : public TargetInfo {
7114public:
7115 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7116 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7117 "SPIR target must use unknown OS");
7118 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7119 "SPIR target must use unknown environment type");
7120 BigEndian = false;
7121 TLSSupported = false;
7122 LongWidth = LongAlign = 64;
7123 AddrSpaceMap = &SPIRAddrSpaceMap;
7124 UseAddrSpaceMapMangling = true;
7125 // Define available target features
7126 // These must be defined in sorted order!
7127 NoAsmVariants = true;
7128 }
7129 void getTargetDefines(const LangOptions &Opts,
7130 MacroBuilder &Builder) const override {
7131 DefineStd(Builder, "SPIR", Opts);
7132 }
7133 bool hasFeature(StringRef Feature) const override {
7134 return Feature == "spir";
7135 }
Craig Topper3164f332014-03-11 03:39:26 +00007136
Eric Christopherc48497a2015-09-18 21:26:24 +00007137 void getTargetBuiltins(const Builtin::Info *&Records,
7138 unsigned &NumRecords) const override {}
7139 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007140 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007141 bool validateAsmConstraint(const char *&Name,
7142 TargetInfo::ConstraintInfo &info) const override {
7143 return true;
7144 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007145 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7146 return None;
7147 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007148 BuiltinVaListKind getBuiltinVaListKind() const override {
7149 return TargetInfo::VoidPtrBuiltinVaList;
7150 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007151
Eric Christopherc48497a2015-09-18 21:26:24 +00007152 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7153 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7154 : CCCR_Warning;
7155 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007156
Eric Christopherc48497a2015-09-18 21:26:24 +00007157 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7158 return CC_SpirFunction;
7159 }
7160};
Guy Benyeib798fc92012-12-11 21:38:14 +00007161
Eric Christopherc48497a2015-09-18 21:26:24 +00007162class SPIR32TargetInfo : public SPIRTargetInfo {
7163public:
7164 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7165 PointerWidth = PointerAlign = 32;
7166 SizeType = TargetInfo::UnsignedInt;
7167 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7168 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7169 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7170 }
7171 void getTargetDefines(const LangOptions &Opts,
7172 MacroBuilder &Builder) const override {
7173 DefineStd(Builder, "SPIR32", Opts);
7174 }
7175};
Guy Benyeib798fc92012-12-11 21:38:14 +00007176
Eric Christopherc48497a2015-09-18 21:26:24 +00007177class SPIR64TargetInfo : public SPIRTargetInfo {
7178public:
7179 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7180 PointerWidth = PointerAlign = 64;
7181 SizeType = TargetInfo::UnsignedLong;
7182 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7183 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7184 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7185 }
7186 void getTargetDefines(const LangOptions &Opts,
7187 MacroBuilder &Builder) const override {
7188 DefineStd(Builder, "SPIR64", Opts);
7189 }
7190};
Guy Benyeib798fc92012-12-11 21:38:14 +00007191
Robert Lytton0e076492013-08-13 09:43:10 +00007192class XCoreTargetInfo : public TargetInfo {
7193 static const Builtin::Info BuiltinInfo[];
7194public:
7195 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7196 BigEndian = false;
7197 NoAsmVariants = true;
7198 LongLongAlign = 32;
7199 SuitableAlign = 32;
7200 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007201 SizeType = UnsignedInt;
7202 PtrDiffType = SignedInt;
7203 IntPtrType = SignedInt;
7204 WCharType = UnsignedChar;
7205 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007206 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007207 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7208 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007209 }
Craig Topper3164f332014-03-11 03:39:26 +00007210 void getTargetDefines(const LangOptions &Opts,
7211 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007212 Builder.defineMacro("__XS1B__");
7213 }
Craig Topper3164f332014-03-11 03:39:26 +00007214 void getTargetBuiltins(const Builtin::Info *&Records,
7215 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007216 Records = BuiltinInfo;
7217 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
7218 }
Craig Topper3164f332014-03-11 03:39:26 +00007219 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007220 return TargetInfo::VoidPtrBuiltinVaList;
7221 }
Craig Topper3164f332014-03-11 03:39:26 +00007222 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007223 return "";
7224 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007225 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007226 static const char * const GCCRegNames[] = {
7227 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7228 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7229 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007230 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007231 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007232 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7233 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007234 }
Craig Topper3164f332014-03-11 03:39:26 +00007235 bool validateAsmConstraint(const char *&Name,
7236 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007237 return false;
7238 }
Craig Topper3164f332014-03-11 03:39:26 +00007239 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007240 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7241 return (RegNo < 2)? RegNo : -1;
7242 }
Robert Lytton0e076492013-08-13 09:43:10 +00007243};
7244
7245const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007246#define BUILTIN(ID, TYPE, ATTRS) \
7247 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7248#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7249 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007250#include "clang/Basic/BuiltinsXCore.def"
7251};
Robert Lytton0e076492013-08-13 09:43:10 +00007252
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007253// x86_32 Android target
7254class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7255public:
7256 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7257 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7258 SuitableAlign = 32;
7259 LongDoubleWidth = 64;
7260 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7261 }
7262};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007263
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007264// x86_64 Android target
7265class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7266public:
7267 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7268 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7269 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7270 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007271
7272 bool useFloat128ManglingForLongDouble() const override {
7273 return true;
7274 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007275};
7276} // end anonymous namespace
7277
Chris Lattner5ba61f02006-10-14 07:39:34 +00007278//===----------------------------------------------------------------------===//
7279// Driver code
7280//===----------------------------------------------------------------------===//
7281
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007282static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007283 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007284
Daniel Dunbar52322032009-08-18 05:47:58 +00007285 switch (Triple.getArch()) {
7286 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007287 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007288
Tim Northover2a0783d2014-05-30 14:14:07 +00007289 case llvm::Triple::xcore:
7290 return new XCoreTargetInfo(Triple);
7291
7292 case llvm::Triple::hexagon:
7293 return new HexagonTargetInfo(Triple);
7294
7295 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007296 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007297 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007298
7299 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007300 case llvm::Triple::CloudABI:
7301 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple);
Ed Maste6a9eda52014-11-13 16:55:42 +00007302 case llvm::Triple::FreeBSD:
7303 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007304 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007305 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007306 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007307 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007308 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007309 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007310 }
7311
Christian Pirker9b019ae2014-02-25 13:51:00 +00007312 case llvm::Triple::aarch64_be:
7313 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007314 case llvm::Triple::FreeBSD:
7315 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007316 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007317 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007318 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007319 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007320 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007321 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007322 }
7323
Daniel Dunbar52322032009-08-18 05:47:58 +00007324 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007325 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007326 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007327 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007328
Daniel Dunbar52322032009-08-18 05:47:58 +00007329 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007330 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007331 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007332 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007333 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007334 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007335 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007336 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007337 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007338 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007339 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007340 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007341 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007342 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007343 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007344 case llvm::Triple::Win32:
7345 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007346 case llvm::Triple::Cygnus:
7347 return new CygwinARMTargetInfo(Triple);
7348 case llvm::Triple::GNU:
7349 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007350 case llvm::Triple::Itanium:
7351 return new ItaniumWindowsARMleTargetInfo(Triple);
7352 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007353 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007354 return new MicrosoftARMleTargetInfo(Triple);
7355 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007356 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007357 return new ARMleTargetInfo(Triple);
7358 }
7359
7360 case llvm::Triple::armeb:
7361 case llvm::Triple::thumbeb:
7362 if (Triple.isOSDarwin())
7363 return new DarwinARMTargetInfo(Triple);
7364
7365 switch (os) {
7366 case llvm::Triple::Linux:
7367 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7368 case llvm::Triple::FreeBSD:
7369 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7370 case llvm::Triple::NetBSD:
7371 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7372 case llvm::Triple::OpenBSD:
7373 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7374 case llvm::Triple::Bitrig:
7375 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7376 case llvm::Triple::RTEMS:
7377 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7378 case llvm::Triple::NaCl:
7379 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7380 default:
7381 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007382 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007383
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007384 case llvm::Triple::bpfeb:
7385 case llvm::Triple::bpfel:
7386 return new BPFTargetInfo(Triple);
7387
Daniel Dunbar52322032009-08-18 05:47:58 +00007388 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007389 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007390
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007391 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007392 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007393 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007394 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007395 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007396 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007397 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007398 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007399 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007400 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007401 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007402 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007403 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007404
7405 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007406 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007407 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007408 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007409 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007410 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007411 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007412 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007413 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007414 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007415 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007416 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007417 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007418 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007419 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007420
Akira Hatanakabef17452011-09-20 19:21:49 +00007421 case llvm::Triple::mips64:
7422 switch (os) {
7423 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007424 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007425 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007426 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007427 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007428 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007429 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007430 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007431 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007432 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007433 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007434 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007435 }
7436
7437 case llvm::Triple::mips64el:
7438 switch (os) {
7439 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007440 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007441 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007442 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007443 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007444 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007445 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007446 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007447 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007448 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007449 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007450 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007451 }
7452
Ivan Krasindd7403e2011-08-24 20:22:22 +00007453 case llvm::Triple::le32:
7454 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007455 case llvm::Triple::NaCl:
7456 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7457 default:
7458 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007459 }
7460
JF Bastien643817d2014-09-12 17:52:47 +00007461 case llvm::Triple::le64:
7462 return new Le64TargetInfo(Triple);
7463
Daniel Dunbar52322032009-08-18 05:47:58 +00007464 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007465 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007466 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007467 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007468 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007469 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007470 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007471 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007472 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007473 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007474 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007475 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007476 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007477 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007478 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007479 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007480 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007481
7482 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007483 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007484 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007485 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007486 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007487 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007488 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007489 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007490 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007491 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007492 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007493 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007494 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007495 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007496 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007497
Bill Schmidt778d3872013-07-26 01:36:11 +00007498 case llvm::Triple::ppc64le:
7499 switch (os) {
7500 case llvm::Triple::Linux:
7501 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007502 case llvm::Triple::NetBSD:
7503 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007504 default:
7505 return new PPC64TargetInfo(Triple);
7506 }
7507
Peter Collingbournec947aae2012-05-20 23:28:41 +00007508 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007509 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007510 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007511 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007512
Tom Stellardd8e38a32015-01-06 20:34:47 +00007513 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007514 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007515 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007516
Daniel Dunbar52322032009-08-18 05:47:58 +00007517 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007518 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007519 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007520 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007521 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007522 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007523 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007524 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007525 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007526 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007527 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007528 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007529 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007530 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007531 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007532
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007533 // The 'sparcel' architecture copies all the above cases except for Solaris.
7534 case llvm::Triple::sparcel:
7535 switch (os) {
7536 case llvm::Triple::Linux:
7537 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7538 case llvm::Triple::NetBSD:
7539 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7540 case llvm::Triple::OpenBSD:
7541 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7542 case llvm::Triple::RTEMS:
7543 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7544 default:
7545 return new SparcV8elTargetInfo(Triple);
7546 }
7547
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007548 case llvm::Triple::sparcv9:
7549 switch (os) {
7550 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007551 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007552 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007553 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007554 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007555 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007556 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007557 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007558 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007559 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007560 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007561 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007562 }
7563
Ulrich Weigand47445072013-05-06 16:26:41 +00007564 case llvm::Triple::systemz:
7565 switch (os) {
7566 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007567 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007568 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007569 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007570 }
7571
Eli Friedmana9c3d712009-08-19 20:47:07 +00007572 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007573 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007574
Daniel Dunbar52322032009-08-18 05:47:58 +00007575 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007576 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007577 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007578
Daniel Dunbar52322032009-08-18 05:47:58 +00007579 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007580 case llvm::Triple::CloudABI:
7581 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007582 case llvm::Triple::Linux: {
7583 switch (Triple.getEnvironment()) {
7584 default:
7585 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7586 case llvm::Triple::Android:
7587 return new AndroidX86_32TargetInfo(Triple);
7588 }
7589 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007590 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007591 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007592 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007593 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007594 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007595 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007596 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007597 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007598 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007599 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007600 case llvm::Triple::KFreeBSD:
7601 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007602 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007603 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007604 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007605 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007606 case llvm::Triple::Win32: {
7607 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007608 case llvm::Triple::Cygnus:
7609 return new CygwinX86_32TargetInfo(Triple);
7610 case llvm::Triple::GNU:
7611 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007612 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007613 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007614 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007615 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007616 }
7617 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007618 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007619 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007620 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007621 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007622 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007623 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007624 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007625 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007626 }
7627
7628 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007629 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007630 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007631
Daniel Dunbar52322032009-08-18 05:47:58 +00007632 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007633 case llvm::Triple::CloudABI:
7634 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007635 case llvm::Triple::Linux: {
7636 switch (Triple.getEnvironment()) {
7637 default:
7638 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7639 case llvm::Triple::Android:
7640 return new AndroidX86_64TargetInfo(Triple);
7641 }
7642 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007643 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007644 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007645 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007646 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007647 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007648 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007649 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007650 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007651 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007652 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007653 case llvm::Triple::KFreeBSD:
7654 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007655 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007656 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007657 case llvm::Triple::Win32: {
7658 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007659 case llvm::Triple::Cygnus:
7660 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007661 case llvm::Triple::GNU:
7662 return new MinGWX86_64TargetInfo(Triple);
7663 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007664 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007665 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007666 }
7667 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007668 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007669 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007670 case llvm::Triple::PS4:
7671 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007672 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007673 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007674 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007675
Douglas Katzman78d7c542015-05-12 21:18:10 +00007676 case llvm::Triple::spir: {
7677 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7678 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7679 return nullptr;
7680 return new SPIR32TargetInfo(Triple);
7681 }
7682 case llvm::Triple::spir64: {
7683 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7684 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7685 return nullptr;
7686 return new SPIR64TargetInfo(Triple);
7687 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007688 case llvm::Triple::wasm32:
7689 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7690 return nullptr;
7691 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7692 case llvm::Triple::wasm64:
7693 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7694 return nullptr;
7695 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007696 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007697}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007698
7699/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007700/// options.
Alp Toker80758082014-07-06 05:26:44 +00007701TargetInfo *
7702TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7703 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007704 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007705
7706 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007707 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007708 if (!Target) {
7709 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007710 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007711 }
Alp Toker80758082014-07-06 05:26:44 +00007712 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007713
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007714 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007715 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7716 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007717 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007718 }
7719
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007720 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007721 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7722 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007723 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007724 }
7725
Rafael Espindolaeb265472013-08-21 21:59:03 +00007726 // Set the fp math unit.
7727 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7728 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007729 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007730 }
7731
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007732 // Compute the default target features, we need the target to handle this
7733 // because features may have dependencies on one another.
7734 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00007735 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
7736 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00007737 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007738
7739 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007740 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007741 for (const auto &F : Features)
7742 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7743
Eric Christopher3ff21b32013-10-16 21:26:26 +00007744 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007745 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007746
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007747 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007748}