blob: 6ac6987694e786a791f55c04c53cb1c0374da0a2 [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__");
Dan Albert84aee012015-03-03 18:28:38 +0000386 if (Triple.getEnvironment() == llvm::Triple::Android) {
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 Christopheref1e2952015-08-28 02:13:58 +0000890 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
891 StringRef CPU,
Eric Christopher007b0a02015-08-28 22:32:01 +0000892 std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000893
Craig Topper3164f332014-03-11 03:39:26 +0000894 bool handleTargetFeatures(std::vector<std::string> &Features,
895 DiagnosticsEngine &Diags) override;
896 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000897 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
898 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000899
900 void getGCCRegNames(const char * const *&Names,
901 unsigned &NumNames) const override;
902 void getGCCRegAliases(const GCCRegAlias *&Aliases,
903 unsigned &NumAliases) const override;
904 bool validateAsmConstraint(const char *&Name,
905 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000906 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000907 default: return false;
908 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000909 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000910 case 'b': // Base register
911 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000912 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000913 break;
914 // FIXME: The following are added to allow parsing.
915 // I just took a guess at what the actions should be.
916 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000917 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000918 case 'v': // Altivec vector register
919 Info.setAllowsRegister();
920 break;
921 case 'w':
922 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000923 case 'd':// VSX vector register to hold vector double data
924 case 'f':// VSX vector register to hold vector float data
925 case 's':// VSX vector register to hold scalar float data
926 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000927 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000928 break;
929 default:
930 return false;
931 }
932 Info.setAllowsRegister();
933 Name++; // Skip over 'w'.
934 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000935 case 'h': // `MQ', `CTR', or `LINK' register
936 case 'q': // `MQ' register
937 case 'c': // `CTR' register
938 case 'l': // `LINK' register
939 case 'x': // `CR' register (condition register) number 0
940 case 'y': // `CR' register (condition register)
941 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000942 Info.setAllowsRegister();
943 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000944 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000945 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000946 // (use `L' instead for SImode constants)
947 case 'K': // Unsigned 16-bit constant
948 case 'L': // Signed 16-bit constant shifted left 16 bits
949 case 'M': // Constant larger than 31
950 case 'N': // Exact power of 2
951 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000952 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000953 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000954 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000955 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000956 break;
957 case 'm': // Memory operand. Note that on PowerPC targets, m can
958 // include addresses that update the base register. It
959 // is therefore only safe to use `m' in an asm statement
960 // if that asm statement accesses the operand exactly once.
961 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000962 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000963 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000964 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000965 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000966 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
967 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000968 // register to be updated.
969 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000970 if (Name[1] != 's')
971 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000972 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000973 // include any automodification of the base register. Unlike
974 // `m', this constraint can be used in asm statements that
975 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000976 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000977 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000978 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000979 break;
980 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000981 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000982 case 'Z': // Memory operand that is an indexed or indirect from a
983 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000984 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000985 Info.setAllowsMemory();
986 Info.setAllowsRegister();
987 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000988 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000989 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000990 // register (`p' is preferable for asm statements)
991 case 'S': // Constant suitable as a 64-bit mask operand
992 case 'T': // Constant suitable as a 32-bit mask operand
993 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000994 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000995 // instructions
996 case 'W': // Vector constant that does not require memory
997 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000998 break;
999 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001000 }
John Thompson07a61a42010-06-24 22:44:13 +00001001 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001002 }
Craig Topper3164f332014-03-11 03:39:26 +00001003 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001004 std::string R;
1005 switch (*Constraint) {
1006 case 'e':
1007 case 'w':
1008 // Two-character constraint; add "^" hint for later parsing.
1009 R = std::string("^") + std::string(Constraint, 2);
1010 Constraint++;
1011 break;
1012 default:
1013 return TargetInfo::convertConstraint(Constraint);
1014 }
1015 return R;
1016 }
Craig Topper3164f332014-03-11 03:39:26 +00001017 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001018 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001019 }
Craig Topper3164f332014-03-11 03:39:26 +00001020 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001021 if (RegNo == 0) return 3;
1022 if (RegNo == 1) return 4;
1023 return -1;
1024 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001025
1026 bool hasSjLjLowering() const override {
1027 return true;
1028 }
David Majnemer2617ea62015-06-09 18:05:33 +00001029
1030 bool useFloat128ManglingForLongDouble() const override {
1031 return LongDoubleWidth == 128 &&
1032 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1033 getTriple().isOSBinFormatELF();
1034 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001035};
Anders Carlssonf511f642007-11-27 04:11:28 +00001036
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001037const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001038#define BUILTIN(ID, TYPE, ATTRS) \
1039 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1040#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1041 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001042#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001043};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001044
Eric Christopher917e9522014-11-18 22:36:15 +00001045/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001046/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001047bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001048 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001049 for (const auto &Feature : Features) {
1050 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001051 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001052 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001053 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001054 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001055 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001056 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001057 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001058 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001059 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001060 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001061 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001062 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001063 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001064 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001065 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001066 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001067 // TODO: Finish this list and add an assert that we've handled them
1068 // all.
1069 }
Eric Christopher02c33352015-08-25 00:59:11 +00001070
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001071 return true;
1072}
1073
Chris Lattnerecd49032009-03-02 22:27:17 +00001074/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1075/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001076void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001077 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001078 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001079 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001080 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001081 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001082 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001083 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001084 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001085 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001086 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001087 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001088 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001089 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001090
Chris Lattnerecd49032009-03-02 22:27:17 +00001091 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001092 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1093 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001094 } else {
1095 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1096 getTriple().getOS() != llvm::Triple::OpenBSD)
1097 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001098 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001099
Ulrich Weigand8afad612014-07-28 13:17:52 +00001100 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001101 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001102 Builder.defineMacro("_CALL_ELF", "1");
1103 if (ABI == "elfv2")
1104 Builder.defineMacro("_CALL_ELF", "2");
1105
Chris Lattnerecd49032009-03-02 22:27:17 +00001106 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001107 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1108 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001109
Chris Lattnerecd49032009-03-02 22:27:17 +00001110 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001111 if (LongDoubleWidth == 128)
1112 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001113
John Thompsone467e192009-11-19 17:18:50 +00001114 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001115 Builder.defineMacro("__VEC__", "10206");
1116 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001117 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001118
1119 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001120 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1121 .Case("440", ArchDefineName)
1122 .Case("450", ArchDefineName | ArchDefine440)
1123 .Case("601", ArchDefineName)
1124 .Case("602", ArchDefineName | ArchDefinePpcgr)
1125 .Case("603", ArchDefineName | ArchDefinePpcgr)
1126 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1127 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1128 .Case("604", ArchDefineName | ArchDefinePpcgr)
1129 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1130 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001131 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001132 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1133 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1134 .Case("750", ArchDefineName | ArchDefinePpcgr)
1135 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1136 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001137 .Case("a2", ArchDefineA2)
1138 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001139 .Case("pwr3", ArchDefinePpcgr)
1140 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1141 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1142 | ArchDefinePpcsq)
1143 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1144 | ArchDefinePpcgr | ArchDefinePpcsq)
1145 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1146 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1147 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1148 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1149 | ArchDefinePpcsq)
1150 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1151 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001152 | ArchDefinePpcgr | ArchDefinePpcsq)
1153 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1154 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1155 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001156 .Case("power3", ArchDefinePpcgr)
1157 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1158 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1159 | ArchDefinePpcsq)
1160 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1161 | ArchDefinePpcgr | ArchDefinePpcsq)
1162 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1163 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1164 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1165 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1166 | ArchDefinePpcsq)
1167 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1168 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001169 | ArchDefinePpcgr | ArchDefinePpcsq)
1170 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1171 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1172 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001173 .Default(ArchDefineNone);
1174
1175 if (defs & ArchDefineName)
1176 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1177 if (defs & ArchDefinePpcgr)
1178 Builder.defineMacro("_ARCH_PPCGR");
1179 if (defs & ArchDefinePpcsq)
1180 Builder.defineMacro("_ARCH_PPCSQ");
1181 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001182 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001183 if (defs & ArchDefine603)
1184 Builder.defineMacro("_ARCH_603");
1185 if (defs & ArchDefine604)
1186 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001187 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001188 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001189 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001190 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001191 if (defs & ArchDefinePwr5x)
1192 Builder.defineMacro("_ARCH_PWR5X");
1193 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001194 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001195 if (defs & ArchDefinePwr6x)
1196 Builder.defineMacro("_ARCH_PWR6X");
1197 if (defs & ArchDefinePwr7)
1198 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001199 if (defs & ArchDefinePwr8)
1200 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001201 if (defs & ArchDefineA2)
1202 Builder.defineMacro("_ARCH_A2");
1203 if (defs & ArchDefineA2q) {
1204 Builder.defineMacro("_ARCH_A2Q");
1205 Builder.defineMacro("_ARCH_QP");
1206 }
1207
1208 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1209 Builder.defineMacro("__bg__");
1210 Builder.defineMacro("__THW_BLUEGENE__");
1211 Builder.defineMacro("__bgq__");
1212 Builder.defineMacro("__TOS_BGQ__");
1213 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001214
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001215 if (HasVSX)
1216 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001217 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001218 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001219 if (HasP8Crypto)
1220 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001221 if (HasHTM)
1222 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001223
1224 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1225 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1226 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1227 if (PointerWidth == 64)
1228 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001229
Bill Schmidt38378a02013-02-01 20:23:10 +00001230 // FIXME: The following are not yet generated here by Clang, but are
1231 // generated by GCC:
1232 //
1233 // _SOFT_FLOAT_
1234 // __RECIP_PRECISION__
1235 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001236 // __RECIP__
1237 // __RECIPF__
1238 // __RSQRTE__
1239 // __RSQRTEF__
1240 // _SOFT_DOUBLE_
1241 // __NO_LWSYNC__
1242 // __HAVE_BSWAP__
1243 // __LONGDOUBLE128
1244 // __CMODEL_MEDIUM__
1245 // __CMODEL_LARGE__
1246 // _CALL_SYSV
1247 // _CALL_DARWIN
1248 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001249}
1250
Eric Christophera8a14c32015-08-31 18:39:16 +00001251// Handle explicit options being passed to the compiler here: if we've
1252// explicitly turned off vsx and turned on power8-vector or direct-move then
1253// go ahead and error since the customer has expressed a somewhat incompatible
1254// set of options.
1255static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
1256 std::vector<std::string> &FeaturesVec) {
1257
1258 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1259 FeaturesVec.end()) {
1260 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1261 FeaturesVec.end()) {
1262 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1263 << "-mno-vsx";
1264 return false;
1265 }
1266
1267 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1268 FeaturesVec.end()) {
1269 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1270 << "-mno-vsx";
1271 return false;
1272 }
1273 }
1274
1275 return true;
1276}
1277
1278bool PPCTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
1279 DiagnosticsEngine &Diags, StringRef CPU,
1280 std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001281 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1282 .Case("7400", true)
1283 .Case("g4", true)
1284 .Case("7450", true)
1285 .Case("g4+", true)
1286 .Case("970", true)
1287 .Case("g5", true)
1288 .Case("pwr6", true)
1289 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001290 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001291 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001292 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001293 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001294
1295 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001296 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1297 .Case("ppc64le", true)
1298 .Case("pwr8", true)
1299 .Default(false);
1300 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1301 .Case("ppc64le", true)
1302 .Case("pwr8", true)
1303 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001304 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1305 .Case("ppc64le", true)
1306 .Case("pwr8", true)
1307 .Case("pwr7", true)
1308 .Default(false);
1309 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1310 .Case("ppc64le", true)
1311 .Case("pwr8", true)
1312 .Case("pwr7", true)
1313 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001314 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1315 .Case("ppc64le", true)
1316 .Case("pwr8", true)
1317 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001318 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1319 .Case("ppc64le", true)
1320 .Case("pwr8", true)
1321 .Case("pwr7", true)
1322 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001323
Eric Christophera8a14c32015-08-31 18:39:16 +00001324 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1325 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001326
Eric Christopher007b0a02015-08-28 22:32:01 +00001327 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001328}
1329
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001330bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001331 return llvm::StringSwitch<bool>(Feature)
1332 .Case("powerpc", true)
1333 .Case("vsx", HasVSX)
1334 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001335 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001336 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001337 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001338 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001339 .Case("bpermd", HasBPERMD)
1340 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001341 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001342}
Chris Lattner17df24e2008-04-21 18:56:49 +00001343
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001344void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1345 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001346 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1347 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1348 // incompatible options.
1349 if (Enabled) {
1350 if (Name == "vsx") {
1351 Features[Name] = true;
1352 } else if (Name == "direct-move") {
1353 Features[Name] = Features["vsx"] = true;
1354 } else if (Name == "power8-vector") {
1355 Features[Name] = Features["vsx"] = true;
1356 } else {
1357 Features[Name] = true;
1358 }
1359 } else {
1360 if (Name == "vsx") {
1361 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1362 false;
1363 } else {
1364 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001365 }
1366 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001367}
1368
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001369const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001370 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1371 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1372 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1373 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1374 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1375 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1376 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1377 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001378 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001379 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001380 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001381 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1382 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1383 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1384 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001385 "vrsave", "vscr",
1386 "spe_acc", "spefscr",
1387 "sfp"
1388};
Chris Lattner10a5b382007-01-29 05:24:35 +00001389
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001390void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001391 unsigned &NumNames) const {
1392 Names = GCCRegNames;
1393 NumNames = llvm::array_lengthof(GCCRegNames);
1394}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001395
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001396const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1397 // While some of these aliases do map to different registers
1398 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001399 { { "0" }, "r0" },
1400 { { "1"}, "r1" },
1401 { { "2" }, "r2" },
1402 { { "3" }, "r3" },
1403 { { "4" }, "r4" },
1404 { { "5" }, "r5" },
1405 { { "6" }, "r6" },
1406 { { "7" }, "r7" },
1407 { { "8" }, "r8" },
1408 { { "9" }, "r9" },
1409 { { "10" }, "r10" },
1410 { { "11" }, "r11" },
1411 { { "12" }, "r12" },
1412 { { "13" }, "r13" },
1413 { { "14" }, "r14" },
1414 { { "15" }, "r15" },
1415 { { "16" }, "r16" },
1416 { { "17" }, "r17" },
1417 { { "18" }, "r18" },
1418 { { "19" }, "r19" },
1419 { { "20" }, "r20" },
1420 { { "21" }, "r21" },
1421 { { "22" }, "r22" },
1422 { { "23" }, "r23" },
1423 { { "24" }, "r24" },
1424 { { "25" }, "r25" },
1425 { { "26" }, "r26" },
1426 { { "27" }, "r27" },
1427 { { "28" }, "r28" },
1428 { { "29" }, "r29" },
1429 { { "30" }, "r30" },
1430 { { "31" }, "r31" },
1431 { { "fr0" }, "f0" },
1432 { { "fr1" }, "f1" },
1433 { { "fr2" }, "f2" },
1434 { { "fr3" }, "f3" },
1435 { { "fr4" }, "f4" },
1436 { { "fr5" }, "f5" },
1437 { { "fr6" }, "f6" },
1438 { { "fr7" }, "f7" },
1439 { { "fr8" }, "f8" },
1440 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001441 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001442 { { "fr11" }, "f11" },
1443 { { "fr12" }, "f12" },
1444 { { "fr13" }, "f13" },
1445 { { "fr14" }, "f14" },
1446 { { "fr15" }, "f15" },
1447 { { "fr16" }, "f16" },
1448 { { "fr17" }, "f17" },
1449 { { "fr18" }, "f18" },
1450 { { "fr19" }, "f19" },
1451 { { "fr20" }, "f20" },
1452 { { "fr21" }, "f21" },
1453 { { "fr22" }, "f22" },
1454 { { "fr23" }, "f23" },
1455 { { "fr24" }, "f24" },
1456 { { "fr25" }, "f25" },
1457 { { "fr26" }, "f26" },
1458 { { "fr27" }, "f27" },
1459 { { "fr28" }, "f28" },
1460 { { "fr29" }, "f29" },
1461 { { "fr30" }, "f30" },
1462 { { "fr31" }, "f31" },
1463 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001464};
1465
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001466void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001467 unsigned &NumAliases) const {
1468 Aliases = GCCRegAliases;
1469 NumAliases = llvm::array_lengthof(GCCRegAliases);
1470}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001471
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001472class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001473public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001474 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001475 DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001476
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001477 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001478 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001479 case llvm::Triple::FreeBSD:
1480 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001481 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001482 PtrDiffType = SignedInt;
1483 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001484 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001485 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001486 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001487 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001488
Roman Divacky3ffe7462012-03-13 19:20:17 +00001489 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1490 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001491 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001492 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001493
1494 // PPC32 supports atomics up to 4 bytes.
1495 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001496 }
1497
Craig Topper3164f332014-03-11 03:39:26 +00001498 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001499 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001500 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001501 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001502};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001503
Bill Schmidt778d3872013-07-26 01:36:11 +00001504// Note: ABI differences may eventually require us to have a separate
1505// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001506class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001507public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001508 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001509 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001510 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001511 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001512
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001513 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001514 DataLayoutString = "e-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001515 ABI = "elfv2";
1516 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001517 DataLayoutString = "E-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001518 ABI = "elfv1";
1519 }
1520
1521 switch (getTriple().getOS()) {
1522 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001523 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001524 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001525 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001526 case llvm::Triple::NetBSD:
1527 IntMaxType = SignedLongLong;
1528 Int64Type = SignedLongLong;
1529 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001530 default:
1531 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001532 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001533
1534 // PPC64 supports atomics up to 8 bytes.
1535 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001536 }
Craig Topper3164f332014-03-11 03:39:26 +00001537 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001538 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001539 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001540 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001541 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001542 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001543 ABI = Name;
1544 return true;
1545 }
1546 return false;
1547 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001548};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001549
Roman Divacky965b0b72011-01-06 08:27:10 +00001550class DarwinPPC32TargetInfo :
1551 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001552public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001553 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1554 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001555 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001556 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001557 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001558 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001559 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001560 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001561 }
Craig Topper3164f332014-03-11 03:39:26 +00001562 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001563 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001564 }
1565};
1566
1567class DarwinPPC64TargetInfo :
1568 public DarwinTargetInfo<PPC64TargetInfo> {
1569public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001570 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1571 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001572 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001573 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001574 DataLayoutString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001575 }
1576};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001577
Eric Christopherc48497a2015-09-18 21:26:24 +00001578static const unsigned NVPTXAddrSpaceMap[] = {
1579 1, // opencl_global
1580 3, // opencl_local
1581 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001582 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001583 0, // opencl_generic
1584 1, // cuda_device
1585 4, // cuda_constant
1586 3, // cuda_shared
1587};
1588
1589class NVPTXTargetInfo : public TargetInfo {
1590 static const char *const GCCRegNames[];
1591 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001592
1593 // The GPU profiles supported by the NVPTX backend
1594 enum GPUKind {
1595 GK_NONE,
1596 GK_SM20,
1597 GK_SM21,
1598 GK_SM30,
1599 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001600 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001601 } GPU;
1602
Eric Christopherc48497a2015-09-18 21:26:24 +00001603public:
1604 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1605 BigEndian = false;
1606 TLSSupported = false;
1607 LongWidth = LongAlign = 64;
1608 AddrSpaceMap = &NVPTXAddrSpaceMap;
1609 UseAddrSpaceMapMangling = true;
1610 // Define available target features
1611 // These must be defined in sorted order!
1612 NoAsmVariants = true;
1613 // Set the default GPU to sm20
1614 GPU = GK_SM20;
1615 }
1616 void getTargetDefines(const LangOptions &Opts,
1617 MacroBuilder &Builder) const override {
1618 Builder.defineMacro("__PTX__");
1619 Builder.defineMacro("__NVPTX__");
1620 if (Opts.CUDAIsDevice) {
1621 // Set __CUDA_ARCH__ for the GPU specified.
1622 std::string CUDAArchCode;
1623 switch (GPU) {
1624 case GK_SM20:
1625 CUDAArchCode = "200";
1626 break;
1627 case GK_SM21:
1628 CUDAArchCode = "210";
1629 break;
1630 case GK_SM30:
1631 CUDAArchCode = "300";
1632 break;
1633 case GK_SM35:
1634 CUDAArchCode = "350";
1635 break;
1636 case GK_SM37:
1637 CUDAArchCode = "370";
1638 break;
1639 default:
1640 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001641 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001642 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001643 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001644 }
1645 void getTargetBuiltins(const Builtin::Info *&Records,
1646 unsigned &NumRecords) const override {
1647 Records = BuiltinInfo;
1648 NumRecords = clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin;
1649 }
1650 bool hasFeature(StringRef Feature) const override {
1651 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001652 }
1653
Eric Christopherc48497a2015-09-18 21:26:24 +00001654 void getGCCRegNames(const char *const *&Names,
1655 unsigned &NumNames) const override;
1656 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1657 unsigned &NumAliases) const override {
1658 // No aliases.
1659 Aliases = nullptr;
1660 NumAliases = 0;
1661 }
1662 bool validateAsmConstraint(const char *&Name,
1663 TargetInfo::ConstraintInfo &Info) const override {
1664 switch (*Name) {
1665 default:
1666 return false;
1667 case 'c':
1668 case 'h':
1669 case 'r':
1670 case 'l':
1671 case 'f':
1672 case 'd':
1673 Info.setAllowsRegister();
1674 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001675 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001676 }
1677 const char *getClobbers() const override {
1678 // FIXME: Is this really right?
1679 return "";
1680 }
1681 BuiltinVaListKind getBuiltinVaListKind() const override {
1682 // FIXME: implement
1683 return TargetInfo::CharPtrBuiltinVaList;
1684 }
1685 bool setCPU(const std::string &Name) override {
1686 GPU = llvm::StringSwitch<GPUKind>(Name)
1687 .Case("sm_20", GK_SM20)
1688 .Case("sm_21", GK_SM21)
1689 .Case("sm_30", GK_SM30)
1690 .Case("sm_35", GK_SM35)
1691 .Case("sm_37", GK_SM37)
1692 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001693
Eric Christopherc48497a2015-09-18 21:26:24 +00001694 return GPU != GK_NONE;
1695 }
1696};
1697
1698const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1699#define BUILTIN(ID, TYPE, ATTRS) \
1700 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1701#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1702 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1703#include "clang/Basic/BuiltinsNVPTX.def"
1704};
1705
1706const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1707
1708void NVPTXTargetInfo::getGCCRegNames(const char *const *&Names,
1709 unsigned &NumNames) const {
1710 Names = GCCRegNames;
1711 NumNames = llvm::array_lengthof(GCCRegNames);
1712}
1713
1714class NVPTX32TargetInfo : public NVPTXTargetInfo {
1715public:
1716 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001717 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001718 PointerWidth = PointerAlign = 32;
1719 SizeType = TargetInfo::UnsignedInt;
1720 PtrDiffType = TargetInfo::SignedInt;
1721 IntPtrType = TargetInfo::SignedInt;
1722 DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
1723 }
1724};
1725
1726class NVPTX64TargetInfo : public NVPTXTargetInfo {
1727public:
1728 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1729 PointerWidth = PointerAlign = 64;
1730 SizeType = TargetInfo::UnsignedLong;
1731 PtrDiffType = TargetInfo::SignedLong;
1732 IntPtrType = TargetInfo::SignedLong;
1733 DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64";
1734 }
1735};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001736
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001737static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001738 1, // opencl_global
1739 3, // opencl_local
1740 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001741 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001742 1, // cuda_device
1743 2, // cuda_constant
1744 3 // cuda_shared
1745};
1746
Tom Stellarda96344b2014-08-21 13:58:40 +00001747// If you edit the description strings, make sure you update
1748// getPointerWidthV().
1749
Eric Christopher964a5f32015-08-05 23:48:05 +00001750static const char *DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001751 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1752 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001753
Eric Christopher964a5f32015-08-05 23:48:05 +00001754static const char *DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001755 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1756 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001757
Eric Christopher964a5f32015-08-05 23:48:05 +00001758static const char *DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001759 "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 +00001760 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1761 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001762
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001763class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001764 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001765 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001766
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001767 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001768 enum GPUKind {
1769 GK_NONE,
1770 GK_R600,
1771 GK_R600_DOUBLE_OPS,
1772 GK_R700,
1773 GK_R700_DOUBLE_OPS,
1774 GK_EVERGREEN,
1775 GK_EVERGREEN_DOUBLE_OPS,
1776 GK_NORTHERN_ISLANDS,
1777 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001778 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001779 GK_SEA_ISLANDS,
1780 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001781 } GPU;
1782
Jan Veselyeebeaea2015-05-04 19:53:36 +00001783 bool hasFP64:1;
1784 bool hasFMAF:1;
1785 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001786
Eli Friedmand13b41e2012-10-12 23:32:00 +00001787public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001788 AMDGPUTargetInfo(const llvm::Triple &Triple)
1789 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001790
1791 if (Triple.getArch() == llvm::Triple::amdgcn) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001792 DataLayoutString = DataLayoutStringSI;
Tom Stellardd99fb952015-01-28 15:38:44 +00001793 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001794 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001795 hasFMAF = true;
1796 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001797 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001798 DataLayoutString = DataLayoutStringR600;
Tom Stellardd99fb952015-01-28 15:38:44 +00001799 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001800 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001801 hasFMAF = false;
1802 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001803 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001804 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001805 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001806 }
1807
Tom Stellarda96344b2014-08-21 13:58:40 +00001808 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1809 if (GPU <= GK_CAYMAN)
1810 return 32;
1811
1812 switch(AddrSpace) {
1813 default:
1814 return 64;
1815 case 0:
1816 case 3:
1817 case 5:
1818 return 32;
1819 }
1820 }
1821
Craig Topper3164f332014-03-11 03:39:26 +00001822 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001823 return "";
1824 }
1825
Craig Topper3164f332014-03-11 03:39:26 +00001826 void getGCCRegNames(const char * const *&Names,
Tom Stellard7b1059b2015-04-14 14:36:56 +00001827 unsigned &NumNames) const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001828
Craig Topper3164f332014-03-11 03:39:26 +00001829 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1830 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001831 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001832 NumAliases = 0;
1833 }
1834
Craig Topper3164f332014-03-11 03:39:26 +00001835 bool validateAsmConstraint(const char *&Name,
1836 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001837 return true;
1838 }
1839
Craig Topper3164f332014-03-11 03:39:26 +00001840 void getTargetBuiltins(const Builtin::Info *&Records,
1841 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001842 Records = BuiltinInfo;
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001843 NumRecords = clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001844 }
1845
Craig Topper3164f332014-03-11 03:39:26 +00001846 void getTargetDefines(const LangOptions &Opts,
1847 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001848 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001849 if (hasFMAF)
1850 Builder.defineMacro("__HAS_FMAF__");
1851 if (hasLDEXPF)
1852 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001853 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001854 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001855 if (Opts.OpenCL) {
1856 if (GPU >= GK_NORTHERN_ISLANDS) {
1857 Builder.defineMacro("cl_khr_byte_addressable_store");
1858 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1859 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1860 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1861 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1862 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001863 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001864 }
1865
Craig Topper3164f332014-03-11 03:39:26 +00001866 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001867 return TargetInfo::CharPtrBuiltinVaList;
1868 }
1869
Craig Topper3164f332014-03-11 03:39:26 +00001870 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001871 GPU = llvm::StringSwitch<GPUKind>(Name)
1872 .Case("r600" , GK_R600)
1873 .Case("rv610", GK_R600)
1874 .Case("rv620", GK_R600)
1875 .Case("rv630", GK_R600)
1876 .Case("rv635", GK_R600)
1877 .Case("rs780", GK_R600)
1878 .Case("rs880", GK_R600)
1879 .Case("rv670", GK_R600_DOUBLE_OPS)
1880 .Case("rv710", GK_R700)
1881 .Case("rv730", GK_R700)
1882 .Case("rv740", GK_R700_DOUBLE_OPS)
1883 .Case("rv770", GK_R700_DOUBLE_OPS)
1884 .Case("palm", GK_EVERGREEN)
1885 .Case("cedar", GK_EVERGREEN)
1886 .Case("sumo", GK_EVERGREEN)
1887 .Case("sumo2", GK_EVERGREEN)
1888 .Case("redwood", GK_EVERGREEN)
1889 .Case("juniper", GK_EVERGREEN)
1890 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1891 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1892 .Case("barts", GK_NORTHERN_ISLANDS)
1893 .Case("turks", GK_NORTHERN_ISLANDS)
1894 .Case("caicos", GK_NORTHERN_ISLANDS)
1895 .Case("cayman", GK_CAYMAN)
1896 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001897 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001898 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1899 .Case("verde", GK_SOUTHERN_ISLANDS)
1900 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001901 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001902 .Case("bonaire", GK_SEA_ISLANDS)
1903 .Case("kabini", GK_SEA_ISLANDS)
1904 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001905 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001906 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001907 .Case("tonga", GK_VOLCANIC_ISLANDS)
1908 .Case("iceland", GK_VOLCANIC_ISLANDS)
1909 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001910 .Default(GK_NONE);
1911
1912 if (GPU == GK_NONE) {
1913 return false;
1914 }
1915
1916 // Set the correct data layout
1917 switch (GPU) {
1918 case GK_NONE:
1919 case GK_R600:
1920 case GK_R700:
1921 case GK_EVERGREEN:
1922 case GK_NORTHERN_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001923 DataLayoutString = DataLayoutStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001924 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001925 hasFMAF = false;
1926 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001927 break;
1928 case GK_R600_DOUBLE_OPS:
1929 case GK_R700_DOUBLE_OPS:
1930 case GK_EVERGREEN_DOUBLE_OPS:
1931 case GK_CAYMAN:
Eric Christopher964a5f32015-08-05 23:48:05 +00001932 DataLayoutString = DataLayoutStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001933 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001934 hasFMAF = true;
1935 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001936 break;
1937 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001938 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001939 case GK_VOLCANIC_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001940 DataLayoutString = DataLayoutStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001941 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001942 hasFMAF = true;
1943 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001944 break;
1945 }
1946
1947 return true;
1948 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001949};
1950
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001951const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001952#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001953 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001954#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001955};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001956const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001957 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1958 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1959 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1960 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1961 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1962 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1963 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1964 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1965 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1966 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1967 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1968 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1969 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1970 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1971 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1972 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1973 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1974 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1975 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1976 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1977 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1978 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1979 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1980 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1981 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1982 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1983 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1984 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1985 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1986 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1987 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1988 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1989 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1990 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1991 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1992 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1993 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1994 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1995 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1996 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1997 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1998 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
1999 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2000 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2001 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2002 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2003 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
2004 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
2005 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
2006 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
2007};
2008
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002009void AMDGPUTargetInfo::getGCCRegNames(const char * const *&Names,
2010 unsigned &NumNames) const {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002011 Names = GCCRegNames;
2012 NumNames = llvm::array_lengthof(GCCRegNames);
2013}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002014
Eli Friedman3fd920a2008-08-20 02:34:37 +00002015// Namespace for x86 abstract base class
2016const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002017#define BUILTIN(ID, TYPE, ATTRS) \
2018 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002019#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002020 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002021#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002022 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002023#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002024};
Eli Friedmanb5366062008-05-20 14:21:01 +00002025
Nuno Lopescfca1f02009-12-23 17:49:57 +00002026static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002027 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2028 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002029 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002030 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2031 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2032 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002033 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002034 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2035 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002036};
2037
Eric Christophercdd36352011-06-21 00:05:20 +00002038const TargetInfo::AddlRegName AddlRegNames[] = {
2039 { { "al", "ah", "eax", "rax" }, 0 },
2040 { { "bl", "bh", "ebx", "rbx" }, 3 },
2041 { { "cl", "ch", "ecx", "rcx" }, 2 },
2042 { { "dl", "dh", "edx", "rdx" }, 1 },
2043 { { "esi", "rsi" }, 4 },
2044 { { "edi", "rdi" }, 5 },
2045 { { "esp", "rsp" }, 7 },
2046 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002047 { { "r8d", "r8w", "r8b" }, 38 },
2048 { { "r9d", "r9w", "r9b" }, 39 },
2049 { { "r10d", "r10w", "r10b" }, 40 },
2050 { { "r11d", "r11w", "r11b" }, 41 },
2051 { { "r12d", "r12w", "r12b" }, 42 },
2052 { { "r13d", "r13w", "r13b" }, 43 },
2053 { { "r14d", "r14w", "r14b" }, 44 },
2054 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002055};
2056
2057// X86 target abstract base class; x86-32 and x86-64 are very close, so
2058// most of the implementation can be shared.
2059class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002060 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002061 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00002062 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00002063 enum MMX3DNowEnum {
2064 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
2065 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002066 enum XOPEnum {
2067 NoXOP,
2068 SSE4A,
2069 FMA4,
2070 XOP
2071 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00002072
Eric Christophere1ddaf92010-04-02 23:50:19 +00002073 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00002074 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00002075 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00002076 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00002077 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00002078 bool HasBMI;
2079 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00002080 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00002081 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00002082 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00002083 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00002084 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002085 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00002086 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00002087 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00002088 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
2089 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00002090 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002091 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002092
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002093 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2094 ///
2095 /// Each enumeration represents a particular CPU supported by Clang. These
2096 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2097 enum CPUKind {
2098 CK_Generic,
2099
2100 /// \name i386
2101 /// i386-generation processors.
2102 //@{
2103 CK_i386,
2104 //@}
2105
2106 /// \name i486
2107 /// i486-generation processors.
2108 //@{
2109 CK_i486,
2110 CK_WinChipC6,
2111 CK_WinChip2,
2112 CK_C3,
2113 //@}
2114
2115 /// \name i586
2116 /// i586-generation processors, P5 microarchitecture based.
2117 //@{
2118 CK_i586,
2119 CK_Pentium,
2120 CK_PentiumMMX,
2121 //@}
2122
2123 /// \name i686
2124 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2125 //@{
2126 CK_i686,
2127 CK_PentiumPro,
2128 CK_Pentium2,
2129 CK_Pentium3,
2130 CK_Pentium3M,
2131 CK_PentiumM,
2132 CK_C3_2,
2133
2134 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2135 /// Clang however has some logic to suport this.
2136 // FIXME: Warn, deprecate, and potentially remove this.
2137 CK_Yonah,
2138 //@}
2139
2140 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002141 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002142 //@{
2143 CK_Pentium4,
2144 CK_Pentium4M,
2145 CK_Prescott,
2146 CK_Nocona,
2147 //@}
2148
2149 /// \name Core
2150 /// Core microarchitecture based processors.
2151 //@{
2152 CK_Core2,
2153
2154 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2155 /// codename which GCC no longer accepts as an option to -march, but Clang
2156 /// has some logic for recognizing it.
2157 // FIXME: Warn, deprecate, and potentially remove this.
2158 CK_Penryn,
2159 //@}
2160
2161 /// \name Atom
2162 /// Atom processors
2163 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002164 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002165 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002166 //@}
2167
2168 /// \name Nehalem
2169 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002170 CK_Nehalem,
2171
2172 /// \name Westmere
2173 /// Westmere microarchitecture based processors.
2174 CK_Westmere,
2175
2176 /// \name Sandy Bridge
2177 /// Sandy Bridge microarchitecture based processors.
2178 CK_SandyBridge,
2179
2180 /// \name Ivy Bridge
2181 /// Ivy Bridge microarchitecture based processors.
2182 CK_IvyBridge,
2183
2184 /// \name Haswell
2185 /// Haswell microarchitecture based processors.
2186 CK_Haswell,
2187
2188 /// \name Broadwell
2189 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002190 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002191
2192 /// \name Skylake
2193 /// Skylake microarchitecture based processors.
2194 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002195
Craig Topper449314e2013-08-20 07:09:39 +00002196 /// \name Knights Landing
2197 /// Knights Landing processor.
2198 CK_KNL,
2199
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002200 /// \name K6
2201 /// K6 architecture processors.
2202 //@{
2203 CK_K6,
2204 CK_K6_2,
2205 CK_K6_3,
2206 //@}
2207
2208 /// \name K7
2209 /// K7 architecture processors.
2210 //@{
2211 CK_Athlon,
2212 CK_AthlonThunderbird,
2213 CK_Athlon4,
2214 CK_AthlonXP,
2215 CK_AthlonMP,
2216 //@}
2217
2218 /// \name K8
2219 /// K8 architecture processors.
2220 //@{
2221 CK_Athlon64,
2222 CK_Athlon64SSE3,
2223 CK_AthlonFX,
2224 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002225 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002226 CK_Opteron,
2227 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002228 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002229 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002230
Benjamin Kramer569f2152012-01-10 11:50:18 +00002231 /// \name Bobcat
2232 /// Bobcat architecture processors.
2233 //@{
2234 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002235 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002236 //@}
2237
2238 /// \name Bulldozer
2239 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002240 //@{
2241 CK_BDVER1,
2242 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002243 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002244 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002245 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002246
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002247 /// This specification is deprecated and will be removed in the future.
2248 /// Users should prefer \see CK_K8.
2249 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002250 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002251 CK_x86_64,
2252 //@}
2253
2254 /// \name Geode
2255 /// Geode processors.
2256 //@{
2257 CK_Geode
2258 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002259 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002260
Eric Christopherc50738f2015-08-27 00:05:50 +00002261 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002262 return llvm::StringSwitch<CPUKind>(CPU)
2263 .Case("i386", CK_i386)
2264 .Case("i486", CK_i486)
2265 .Case("winchip-c6", CK_WinChipC6)
2266 .Case("winchip2", CK_WinChip2)
2267 .Case("c3", CK_C3)
2268 .Case("i586", CK_i586)
2269 .Case("pentium", CK_Pentium)
2270 .Case("pentium-mmx", CK_PentiumMMX)
2271 .Case("i686", CK_i686)
2272 .Case("pentiumpro", CK_PentiumPro)
2273 .Case("pentium2", CK_Pentium2)
2274 .Case("pentium3", CK_Pentium3)
2275 .Case("pentium3m", CK_Pentium3M)
2276 .Case("pentium-m", CK_PentiumM)
2277 .Case("c3-2", CK_C3_2)
2278 .Case("yonah", CK_Yonah)
2279 .Case("pentium4", CK_Pentium4)
2280 .Case("pentium4m", CK_Pentium4M)
2281 .Case("prescott", CK_Prescott)
2282 .Case("nocona", CK_Nocona)
2283 .Case("core2", CK_Core2)
2284 .Case("penryn", CK_Penryn)
2285 .Case("bonnell", CK_Bonnell)
2286 .Case("atom", CK_Bonnell) // Legacy name.
2287 .Case("silvermont", CK_Silvermont)
2288 .Case("slm", CK_Silvermont) // Legacy name.
2289 .Case("nehalem", CK_Nehalem)
2290 .Case("corei7", CK_Nehalem) // Legacy name.
2291 .Case("westmere", CK_Westmere)
2292 .Case("sandybridge", CK_SandyBridge)
2293 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2294 .Case("ivybridge", CK_IvyBridge)
2295 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2296 .Case("haswell", CK_Haswell)
2297 .Case("core-avx2", CK_Haswell) // Legacy name.
2298 .Case("broadwell", CK_Broadwell)
2299 .Case("skylake", CK_Skylake)
2300 .Case("skx", CK_Skylake) // Legacy name.
2301 .Case("knl", CK_KNL)
2302 .Case("k6", CK_K6)
2303 .Case("k6-2", CK_K6_2)
2304 .Case("k6-3", CK_K6_3)
2305 .Case("athlon", CK_Athlon)
2306 .Case("athlon-tbird", CK_AthlonThunderbird)
2307 .Case("athlon-4", CK_Athlon4)
2308 .Case("athlon-xp", CK_AthlonXP)
2309 .Case("athlon-mp", CK_AthlonMP)
2310 .Case("athlon64", CK_Athlon64)
2311 .Case("athlon64-sse3", CK_Athlon64SSE3)
2312 .Case("athlon-fx", CK_AthlonFX)
2313 .Case("k8", CK_K8)
2314 .Case("k8-sse3", CK_K8SSE3)
2315 .Case("opteron", CK_Opteron)
2316 .Case("opteron-sse3", CK_OpteronSSE3)
2317 .Case("barcelona", CK_AMDFAM10)
2318 .Case("amdfam10", CK_AMDFAM10)
2319 .Case("btver1", CK_BTVER1)
2320 .Case("btver2", CK_BTVER2)
2321 .Case("bdver1", CK_BDVER1)
2322 .Case("bdver2", CK_BDVER2)
2323 .Case("bdver3", CK_BDVER3)
2324 .Case("bdver4", CK_BDVER4)
2325 .Case("x86-64", CK_x86_64)
2326 .Case("geode", CK_Geode)
2327 .Default(CK_Generic);
2328 }
2329
Rafael Espindolaeb265472013-08-21 21:59:03 +00002330 enum FPMathKind {
2331 FP_Default,
2332 FP_SSE,
2333 FP_387
2334 } FPMath;
2335
Eli Friedman3fd920a2008-08-20 02:34:37 +00002336public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002337 X86TargetInfo(const llvm::Triple &Triple)
2338 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002339 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002340 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2341 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2342 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2343 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2344 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2345 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002346 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002347 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002348 }
Craig Topper3164f332014-03-11 03:39:26 +00002349 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002350 // X87 evaluates with 80 bits "long double" precision.
2351 return SSELevel == NoSSE ? 2 : 0;
2352 }
Craig Topper3164f332014-03-11 03:39:26 +00002353 void getTargetBuiltins(const Builtin::Info *&Records,
2354 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002355 Records = BuiltinInfo;
2356 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002357 }
Craig Topper3164f332014-03-11 03:39:26 +00002358 void getGCCRegNames(const char * const *&Names,
2359 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002360 Names = GCCRegNames;
2361 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002362 }
Craig Topper3164f332014-03-11 03:39:26 +00002363 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2364 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002365 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002366 NumAliases = 0;
2367 }
Craig Topper3164f332014-03-11 03:39:26 +00002368 void getGCCAddlRegNames(const AddlRegName *&Names,
2369 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002370 Names = AddlRegNames;
2371 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002372 }
Eric Christopherd9832702015-06-29 21:00:05 +00002373 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002374 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002375 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002376
Akira Hatanaka974131e2014-09-18 18:17:18 +00002377 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2378
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002379 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2380
Akira Hatanaka974131e2014-09-18 18:17:18 +00002381 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2382
Craig Topper3164f332014-03-11 03:39:26 +00002383 std::string convertConstraint(const char *&Constraint) const override;
2384 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002385 return "~{dirflag},~{fpsr},~{flags}";
2386 }
Craig Topper3164f332014-03-11 03:39:26 +00002387 void getTargetDefines(const LangOptions &Opts,
2388 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002389 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2390 bool Enabled);
2391 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2392 bool Enabled);
2393 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2394 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002395 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2396 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002397 setFeatureEnabledImpl(Features, Name, Enabled);
2398 }
2399 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002400 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002401 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2402 StringRef Name, bool Enabled);
Eric Christopheref1e2952015-08-28 02:13:58 +00002403 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2404 StringRef CPU,
Eric Christopher007b0a02015-08-28 22:32:01 +00002405 std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002406 bool hasFeature(StringRef Feature) const override;
2407 bool handleTargetFeatures(std::vector<std::string> &Features,
2408 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002409 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002410 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2411 return "avx512";
2412 else if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002413 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002414 else if (getTriple().getArch() == llvm::Triple::x86 &&
2415 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002416 return "no-mmx";
2417 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002418 }
Craig Topper3164f332014-03-11 03:39:26 +00002419 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002420 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002421
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002422 // Perform any per-CPU checks necessary to determine if this CPU is
2423 // acceptable.
2424 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2425 // invalid without explaining *why*.
2426 switch (CPU) {
2427 case CK_Generic:
2428 // No processor selected!
2429 return false;
2430
2431 case CK_i386:
2432 case CK_i486:
2433 case CK_WinChipC6:
2434 case CK_WinChip2:
2435 case CK_C3:
2436 case CK_i586:
2437 case CK_Pentium:
2438 case CK_PentiumMMX:
2439 case CK_i686:
2440 case CK_PentiumPro:
2441 case CK_Pentium2:
2442 case CK_Pentium3:
2443 case CK_Pentium3M:
2444 case CK_PentiumM:
2445 case CK_Yonah:
2446 case CK_C3_2:
2447 case CK_Pentium4:
2448 case CK_Pentium4M:
2449 case CK_Prescott:
2450 case CK_K6:
2451 case CK_K6_2:
2452 case CK_K6_3:
2453 case CK_Athlon:
2454 case CK_AthlonThunderbird:
2455 case CK_Athlon4:
2456 case CK_AthlonXP:
2457 case CK_AthlonMP:
2458 case CK_Geode:
2459 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002460 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002461 return false;
2462
2463 // Fallthrough
2464 case CK_Nocona:
2465 case CK_Core2:
2466 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002467 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002468 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002469 case CK_Nehalem:
2470 case CK_Westmere:
2471 case CK_SandyBridge:
2472 case CK_IvyBridge:
2473 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002474 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002475 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002476 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002477 case CK_Athlon64:
2478 case CK_Athlon64SSE3:
2479 case CK_AthlonFX:
2480 case CK_K8:
2481 case CK_K8SSE3:
2482 case CK_Opteron:
2483 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002484 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002485 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002486 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002487 case CK_BDVER1:
2488 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002489 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002490 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002491 case CK_x86_64:
2492 return true;
2493 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002494 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002495 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002496
Craig Topper3164f332014-03-11 03:39:26 +00002497 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002498
Craig Topper3164f332014-03-11 03:39:26 +00002499 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002500 // We accept all non-ARM calling conventions
2501 return (CC == CC_X86ThisCall ||
2502 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002503 CC == CC_X86StdCall ||
2504 CC == CC_X86VectorCall ||
2505 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002506 CC == CC_X86Pascal ||
2507 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002508 }
2509
Craig Topper3164f332014-03-11 03:39:26 +00002510 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002511 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002512 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002513
2514 bool hasSjLjLowering() const override {
2515 return true;
2516 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002517};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002518
Rafael Espindolaeb265472013-08-21 21:59:03 +00002519bool X86TargetInfo::setFPMath(StringRef Name) {
2520 if (Name == "387") {
2521 FPMath = FP_387;
2522 return true;
2523 }
2524 if (Name == "sse") {
2525 FPMath = FP_SSE;
2526 return true;
2527 }
2528 return false;
2529}
2530
Eric Christopher007b0a02015-08-28 22:32:01 +00002531bool X86TargetInfo::initFeatureMap(
2532 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
2533 std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002534 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002535 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002536 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002537 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002538
Eric Christopher2b4a7252015-08-27 00:05:52 +00002539 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002540 case CK_Generic:
2541 case CK_i386:
2542 case CK_i486:
2543 case CK_i586:
2544 case CK_Pentium:
2545 case CK_i686:
2546 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002547 break;
2548 case CK_PentiumMMX:
2549 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002550 case CK_K6:
2551 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002552 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002553 break;
2554 case CK_Pentium3:
2555 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002556 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002557 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002558 break;
2559 case CK_PentiumM:
2560 case CK_Pentium4:
2561 case CK_Pentium4M:
2562 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002563 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002564 break;
2565 case CK_Yonah:
2566 case CK_Prescott:
2567 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002568 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002569 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002570 break;
2571 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002572 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002573 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002574 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002575 break;
2576 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002577 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002578 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002579 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002580 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002581 setFeatureEnabledImpl(Features, "avx512f", true);
2582 setFeatureEnabledImpl(Features, "avx512cd", true);
2583 setFeatureEnabledImpl(Features, "avx512dq", true);
2584 setFeatureEnabledImpl(Features, "avx512bw", true);
2585 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002586 // FALLTHROUGH
2587 case CK_Broadwell:
2588 setFeatureEnabledImpl(Features, "rdseed", true);
2589 setFeatureEnabledImpl(Features, "adx", true);
2590 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002591 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002592 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002593 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002594 setFeatureEnabledImpl(Features, "bmi", true);
2595 setFeatureEnabledImpl(Features, "bmi2", true);
2596 setFeatureEnabledImpl(Features, "rtm", true);
2597 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002598 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002599 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002600 setFeatureEnabledImpl(Features, "rdrnd", true);
2601 setFeatureEnabledImpl(Features, "f16c", true);
2602 setFeatureEnabledImpl(Features, "fsgsbase", true);
2603 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002604 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002605 setFeatureEnabledImpl(Features, "avx", true);
2606 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002607 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002608 case CK_Silvermont:
2609 setFeatureEnabledImpl(Features, "aes", true);
2610 setFeatureEnabledImpl(Features, "pclmul", true);
2611 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002612 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002613 setFeatureEnabledImpl(Features, "sse4.2", true);
2614 setFeatureEnabledImpl(Features, "cx16", true);
2615 break;
2616 case CK_KNL:
2617 setFeatureEnabledImpl(Features, "avx512f", true);
2618 setFeatureEnabledImpl(Features, "avx512cd", true);
2619 setFeatureEnabledImpl(Features, "avx512er", true);
2620 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002621 setFeatureEnabledImpl(Features, "rdseed", true);
2622 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002623 setFeatureEnabledImpl(Features, "lzcnt", true);
2624 setFeatureEnabledImpl(Features, "bmi", true);
2625 setFeatureEnabledImpl(Features, "bmi2", true);
2626 setFeatureEnabledImpl(Features, "rtm", true);
2627 setFeatureEnabledImpl(Features, "fma", true);
2628 setFeatureEnabledImpl(Features, "rdrnd", true);
2629 setFeatureEnabledImpl(Features, "f16c", true);
2630 setFeatureEnabledImpl(Features, "fsgsbase", true);
2631 setFeatureEnabledImpl(Features, "aes", true);
2632 setFeatureEnabledImpl(Features, "pclmul", true);
2633 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002634 break;
2635 case CK_K6_2:
2636 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002637 case CK_WinChip2:
2638 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002639 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002640 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002641 case CK_Athlon:
2642 case CK_AthlonThunderbird:
2643 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002644 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002645 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002646 case CK_Athlon4:
2647 case CK_AthlonXP:
2648 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002649 setFeatureEnabledImpl(Features, "sse", true);
2650 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002651 break;
2652 case CK_K8:
2653 case CK_Opteron:
2654 case CK_Athlon64:
2655 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002656 setFeatureEnabledImpl(Features, "sse2", true);
2657 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002658 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002659 case CK_AMDFAM10:
2660 setFeatureEnabledImpl(Features, "sse4a", true);
2661 setFeatureEnabledImpl(Features, "lzcnt", true);
2662 setFeatureEnabledImpl(Features, "popcnt", true);
2663 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002664 case CK_K8SSE3:
2665 case CK_OpteronSSE3:
2666 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002667 setFeatureEnabledImpl(Features, "sse3", true);
2668 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002669 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002670 case CK_BTVER2:
2671 setFeatureEnabledImpl(Features, "avx", true);
2672 setFeatureEnabledImpl(Features, "aes", true);
2673 setFeatureEnabledImpl(Features, "pclmul", true);
2674 setFeatureEnabledImpl(Features, "bmi", true);
2675 setFeatureEnabledImpl(Features, "f16c", true);
2676 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002677 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002678 setFeatureEnabledImpl(Features, "ssse3", true);
2679 setFeatureEnabledImpl(Features, "sse4a", true);
2680 setFeatureEnabledImpl(Features, "lzcnt", true);
2681 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002682 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002683 setFeatureEnabledImpl(Features, "cx16", 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);
2691 // FALLTHROUGH
2692 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002693 setFeatureEnabledImpl(Features, "bmi", true);
2694 setFeatureEnabledImpl(Features, "fma", true);
2695 setFeatureEnabledImpl(Features, "f16c", true);
2696 setFeatureEnabledImpl(Features, "tbm", true);
2697 // FALLTHROUGH
2698 case CK_BDVER1:
2699 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002700 setFeatureEnabledImpl(Features, "xop", true);
2701 setFeatureEnabledImpl(Features, "lzcnt", true);
2702 setFeatureEnabledImpl(Features, "aes", true);
2703 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002704 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002705 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002706 break;
Eli Friedman33465822011-07-08 23:31:17 +00002707 }
Eric Christopher007b0a02015-08-28 22:32:01 +00002708 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002709}
2710
Rafael Espindolae62e2792013-08-20 13:44:29 +00002711void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002712 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002713 if (Enabled) {
2714 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002715 case AVX512F:
2716 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002717 case AVX2:
2718 Features["avx2"] = true;
2719 case AVX:
2720 Features["avx"] = true;
2721 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002722 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002723 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002724 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002725 case SSSE3:
2726 Features["ssse3"] = true;
2727 case SSE3:
2728 Features["sse3"] = true;
2729 case SSE2:
2730 Features["sse2"] = true;
2731 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002732 Features["sse"] = true;
2733 case NoSSE:
2734 break;
2735 }
2736 return;
2737 }
2738
2739 switch (Level) {
2740 case NoSSE:
2741 case SSE1:
2742 Features["sse"] = false;
2743 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002744 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2745 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002746 case SSE3:
2747 Features["sse3"] = false;
2748 setXOPLevel(Features, NoXOP, false);
2749 case SSSE3:
2750 Features["ssse3"] = false;
2751 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002752 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002753 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002754 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002755 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002756 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002757 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002758 case AVX2:
2759 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002760 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002761 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002762 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2763 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002764 }
2765}
2766
2767void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002768 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002769 if (Enabled) {
2770 switch (Level) {
2771 case AMD3DNowAthlon:
2772 Features["3dnowa"] = true;
2773 case AMD3DNow:
2774 Features["3dnow"] = true;
2775 case MMX:
2776 Features["mmx"] = true;
2777 case NoMMX3DNow:
2778 break;
2779 }
2780 return;
2781 }
2782
2783 switch (Level) {
2784 case NoMMX3DNow:
2785 case MMX:
2786 Features["mmx"] = false;
2787 case AMD3DNow:
2788 Features["3dnow"] = false;
2789 case AMD3DNowAthlon:
2790 Features["3dnowa"] = false;
2791 }
2792}
2793
2794void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002795 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002796 if (Enabled) {
2797 switch (Level) {
2798 case XOP:
2799 Features["xop"] = true;
2800 case FMA4:
2801 Features["fma4"] = true;
2802 setSSELevel(Features, AVX, true);
2803 case SSE4A:
2804 Features["sse4a"] = true;
2805 setSSELevel(Features, SSE3, true);
2806 case NoXOP:
2807 break;
2808 }
2809 return;
2810 }
2811
2812 switch (Level) {
2813 case NoXOP:
2814 case SSE4A:
2815 Features["sse4a"] = false;
2816 case FMA4:
2817 Features["fma4"] = false;
2818 case XOP:
2819 Features["xop"] = false;
2820 }
2821}
2822
Craig Topper86d79ef2013-09-17 04:51:29 +00002823void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2824 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002825 // This is a bit of a hack to deal with the sse4 target feature when used
2826 // as part of the target attribute. We handle sse4 correctly everywhere
2827 // else. See below for more information on how we handle the sse4 options.
2828 if (Name != "sse4")
2829 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002830
Craig Topper29561122013-09-19 01:13:07 +00002831 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002832 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002833 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002834 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002835 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002836 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002837 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002838 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002839 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002840 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002841 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002842 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002843 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002844 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002845 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002846 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002847 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002848 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002849 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002850 if (Enabled)
2851 setSSELevel(Features, SSE2, Enabled);
2852 } else if (Name == "pclmul") {
2853 if (Enabled)
2854 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002855 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002856 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002857 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002858 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002859 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002860 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002861 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2862 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002863 if (Enabled)
2864 setSSELevel(Features, AVX512F, Enabled);
2865 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002866 if (Enabled)
2867 setSSELevel(Features, AVX, Enabled);
2868 } else if (Name == "fma4") {
2869 setXOPLevel(Features, FMA4, Enabled);
2870 } else if (Name == "xop") {
2871 setXOPLevel(Features, XOP, Enabled);
2872 } else if (Name == "sse4a") {
2873 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002874 } else if (Name == "f16c") {
2875 if (Enabled)
2876 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002877 } else if (Name == "sha") {
2878 if (Enabled)
2879 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002880 } else if (Name == "sse4") {
2881 // We can get here via the __target__ attribute since that's not controlled
2882 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2883 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2884 // disabled.
2885 if (Enabled)
2886 setSSELevel(Features, SSE42, Enabled);
2887 else
2888 setSSELevel(Features, SSE41, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002889 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002890}
2891
Eric Christopher3ff21b32013-10-16 21:26:26 +00002892/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002893/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002894bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002895 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00002896 for (const auto &Feature : Features) {
2897 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00002898 continue;
2899
Eric Christopher610fe112015-08-26 08:21:55 +00002900 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002901 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002902 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00002903 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002904 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002905 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002906 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002907 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002908 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00002909 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002910 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002911 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002912 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002913 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002914 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002915 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002916 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00002917 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002918 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00002919 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002920 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00002921 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002922 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00002923 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002924 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002925 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002926 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00002927 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002928 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00002929 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002930 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00002931 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002932 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00002933 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002934 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002935 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002936 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002937 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002938 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002939 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002940 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002941 HasAVX512VL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002942 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00002943 HasSHA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002944 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00002945 HasCX16 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002946 }
2947
Benjamin Kramer27402c62012-03-05 15:10:44 +00002948 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002949 .Case("+avx512f", AVX512F)
2950 .Case("+avx2", AVX2)
2951 .Case("+avx", AVX)
2952 .Case("+sse4.2", SSE42)
2953 .Case("+sse4.1", SSE41)
2954 .Case("+ssse3", SSSE3)
2955 .Case("+sse3", SSE3)
2956 .Case("+sse2", SSE2)
2957 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002958 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002959 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002960
Eli Friedman33465822011-07-08 23:31:17 +00002961 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002962 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002963 .Case("+3dnowa", AMD3DNowAthlon)
2964 .Case("+3dnow", AMD3DNow)
2965 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00002966 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002967 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002968
2969 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002970 .Case("+xop", XOP)
2971 .Case("+fma4", FMA4)
2972 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002973 .Default(NoXOP);
2974 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002975 }
Eli Friedman33465822011-07-08 23:31:17 +00002976
Craig Topper7481d8a2013-09-10 06:55:47 +00002977 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2978 // Can't do this earlier because we need to be able to explicitly enable
2979 // popcnt and still disable sse4.2.
2980 if (!HasPOPCNT && SSELevel >= SSE42 &&
2981 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2982 HasPOPCNT = true;
2983 Features.push_back("+popcnt");
2984 }
2985
Yunzhong Gao61089362013-10-16 19:07:02 +00002986 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2987 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2988 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2989 HasPRFCHW = true;
2990 Features.push_back("+prfchw");
2991 }
2992
Rafael Espindolaeb265472013-08-21 21:59:03 +00002993 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2994 // matches the selected sse level.
2995 if (FPMath == FP_SSE && SSELevel < SSE1) {
2996 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2997 return false;
2998 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2999 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
3000 return false;
3001 }
3002
Eli Friedman33465822011-07-08 23:31:17 +00003003 // Don't tell the backend if we're turning off mmx; it will end up disabling
3004 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00003005 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3006 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00003007 std::vector<std::string>::iterator it;
3008 it = std::find(Features.begin(), Features.end(), "-mmx");
3009 if (it != Features.end())
3010 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00003011 else if (SSELevel > NoSSE)
3012 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Alexey Bataev00396512015-07-02 03:40:19 +00003013
3014 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003015 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003016 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003017}
Chris Lattnerecd49032009-03-02 22:27:17 +00003018
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003019/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3020/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003021void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003022 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003023 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003024 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003025 Builder.defineMacro("__amd64__");
3026 Builder.defineMacro("__amd64");
3027 Builder.defineMacro("__x86_64");
3028 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003029 if (getTriple().getArchName() == "x86_64h") {
3030 Builder.defineMacro("__x86_64h");
3031 Builder.defineMacro("__x86_64h__");
3032 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003033 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003034 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003035 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003036
Chris Lattnerecd49032009-03-02 22:27:17 +00003037 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003038 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3039 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003040 switch (CPU) {
3041 case CK_Generic:
3042 break;
3043 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003044 // The rest are coming from the i386 define above.
3045 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003046 break;
3047 case CK_i486:
3048 case CK_WinChipC6:
3049 case CK_WinChip2:
3050 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003051 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003052 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003053 case CK_PentiumMMX:
3054 Builder.defineMacro("__pentium_mmx__");
3055 Builder.defineMacro("__tune_pentium_mmx__");
3056 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003057 case CK_i586:
3058 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003059 defineCPUMacros(Builder, "i586");
3060 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003061 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003062 case CK_Pentium3:
3063 case CK_Pentium3M:
3064 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003065 Builder.defineMacro("__tune_pentium3__");
3066 // Fallthrough
3067 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003068 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003069 Builder.defineMacro("__tune_pentium2__");
3070 // Fallthrough
3071 case CK_PentiumPro:
3072 Builder.defineMacro("__tune_i686__");
3073 Builder.defineMacro("__tune_pentiumpro__");
3074 // Fallthrough
3075 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003076 Builder.defineMacro("__i686");
3077 Builder.defineMacro("__i686__");
3078 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3079 Builder.defineMacro("__pentiumpro");
3080 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003081 break;
3082 case CK_Pentium4:
3083 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003084 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003085 break;
3086 case CK_Yonah:
3087 case CK_Prescott:
3088 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003089 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003090 break;
3091 case CK_Core2:
3092 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003093 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003094 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003095 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003096 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003097 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003098 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003099 defineCPUMacros(Builder, "slm");
3100 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003101 case CK_Nehalem:
3102 case CK_Westmere:
3103 case CK_SandyBridge:
3104 case CK_IvyBridge:
3105 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003106 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003107 // FIXME: Historically, we defined this legacy name, it would be nice to
3108 // remove it at some point. We've never exposed fine-grained names for
3109 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003110 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003111 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003112 case CK_Skylake:
3113 // FIXME: Historically, we defined this legacy name, it would be nice to
3114 // remove it at some point. This is the only fine-grained CPU macro in the
3115 // main intel CPU line, and it would be better to not have these and force
3116 // people to use ISA macros.
3117 defineCPUMacros(Builder, "skx");
3118 break;
Craig Topper449314e2013-08-20 07:09:39 +00003119 case CK_KNL:
3120 defineCPUMacros(Builder, "knl");
3121 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003122 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003123 Builder.defineMacro("__k6_2__");
3124 Builder.defineMacro("__tune_k6_2__");
3125 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003126 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003127 if (CPU != CK_K6_2) { // In case of fallthrough
3128 // FIXME: GCC may be enabling these in cases where some other k6
3129 // architecture is specified but -m3dnow is explicitly provided. The
3130 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003131 Builder.defineMacro("__k6_3__");
3132 Builder.defineMacro("__tune_k6_3__");
3133 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003134 // Fallthrough
3135 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003136 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003137 break;
3138 case CK_Athlon:
3139 case CK_AthlonThunderbird:
3140 case CK_Athlon4:
3141 case CK_AthlonXP:
3142 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003143 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003144 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003145 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003146 Builder.defineMacro("__tune_athlon_sse__");
3147 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003148 break;
3149 case CK_K8:
3150 case CK_K8SSE3:
3151 case CK_x86_64:
3152 case CK_Opteron:
3153 case CK_OpteronSSE3:
3154 case CK_Athlon64:
3155 case CK_Athlon64SSE3:
3156 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003157 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003158 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003159 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003160 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003161 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003162 case CK_BTVER1:
3163 defineCPUMacros(Builder, "btver1");
3164 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003165 case CK_BTVER2:
3166 defineCPUMacros(Builder, "btver2");
3167 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003168 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003169 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003170 break;
3171 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003172 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003173 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003174 case CK_BDVER3:
3175 defineCPUMacros(Builder, "bdver3");
3176 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003177 case CK_BDVER4:
3178 defineCPUMacros(Builder, "bdver4");
3179 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003180 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003181 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003182 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003183 }
Chris Lattner96e43572009-03-02 22:40:39 +00003184
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003185 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003186 Builder.defineMacro("__REGISTER_PREFIX__", "");
3187
Chris Lattner6df41af2009-04-19 17:32:33 +00003188 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3189 // functions in glibc header files that use FP Stack inline asm which the
3190 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003191 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003192
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003193 if (HasAES)
3194 Builder.defineMacro("__AES__");
3195
Craig Topper3f122a72012-05-31 05:18:48 +00003196 if (HasPCLMUL)
3197 Builder.defineMacro("__PCLMUL__");
3198
Craig Topper22967d42011-12-25 05:06:45 +00003199 if (HasLZCNT)
3200 Builder.defineMacro("__LZCNT__");
3201
Benjamin Kramer1e250392012-07-07 09:39:18 +00003202 if (HasRDRND)
3203 Builder.defineMacro("__RDRND__");
3204
Craig Topper8c7f2512014-11-03 06:51:41 +00003205 if (HasFSGSBASE)
3206 Builder.defineMacro("__FSGSBASE__");
3207
Craig Topper22967d42011-12-25 05:06:45 +00003208 if (HasBMI)
3209 Builder.defineMacro("__BMI__");
3210
3211 if (HasBMI2)
3212 Builder.defineMacro("__BMI2__");
3213
Craig Topper1de83482011-12-29 16:10:46 +00003214 if (HasPOPCNT)
3215 Builder.defineMacro("__POPCNT__");
3216
Michael Liao625a8752012-11-10 05:17:46 +00003217 if (HasRTM)
3218 Builder.defineMacro("__RTM__");
3219
Michael Liao74f4eaf2013-03-26 17:52:08 +00003220 if (HasPRFCHW)
3221 Builder.defineMacro("__PRFCHW__");
3222
Michael Liaoffaae352013-03-29 05:17:55 +00003223 if (HasRDSEED)
3224 Builder.defineMacro("__RDSEED__");
3225
Robert Khasanov50e6f582014-09-19 09:53:48 +00003226 if (HasADX)
3227 Builder.defineMacro("__ADX__");
3228
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003229 if (HasTBM)
3230 Builder.defineMacro("__TBM__");
3231
Rafael Espindolae62e2792013-08-20 13:44:29 +00003232 switch (XOPLevel) {
3233 case XOP:
3234 Builder.defineMacro("__XOP__");
3235 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003236 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003237 case SSE4A:
3238 Builder.defineMacro("__SSE4A__");
3239 case NoXOP:
3240 break;
3241 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003242
Craig Topperbba778b2012-06-03 21:46:30 +00003243 if (HasFMA)
3244 Builder.defineMacro("__FMA__");
3245
Manman Rena45358c2012-10-11 00:59:55 +00003246 if (HasF16C)
3247 Builder.defineMacro("__F16C__");
3248
Craig Topper679b53a2013-08-21 05:29:10 +00003249 if (HasAVX512CD)
3250 Builder.defineMacro("__AVX512CD__");
3251 if (HasAVX512ER)
3252 Builder.defineMacro("__AVX512ER__");
3253 if (HasAVX512PF)
3254 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003255 if (HasAVX512DQ)
3256 Builder.defineMacro("__AVX512DQ__");
3257 if (HasAVX512BW)
3258 Builder.defineMacro("__AVX512BW__");
3259 if (HasAVX512VL)
3260 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003261
Ben Langmuir58078d02013-09-19 13:22:04 +00003262 if (HasSHA)
3263 Builder.defineMacro("__SHA__");
3264
Nick Lewycky50e8f482013-10-05 20:14:27 +00003265 if (HasCX16)
3266 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3267
Chris Lattner96e43572009-03-02 22:40:39 +00003268 // Each case falls through to the previous one here.
3269 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003270 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003271 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003272 case AVX2:
3273 Builder.defineMacro("__AVX2__");
3274 case AVX:
3275 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003276 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003277 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003278 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003279 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003280 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003281 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003282 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003283 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003284 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003285 Builder.defineMacro("__SSE2__");
3286 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003287 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003288 Builder.defineMacro("__SSE__");
3289 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003290 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003291 break;
3292 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003293
Derek Schuffc7dd7222012-10-11 15:52:22 +00003294 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003295 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003296 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003297 case AVX2:
3298 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003299 case SSE42:
3300 case SSE41:
3301 case SSSE3:
3302 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003303 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003304 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003305 break;
3306 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003307 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003308 break;
3309 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003310 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003311 }
3312 }
3313
Anders Carlssone437c682010-01-27 03:47:49 +00003314 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003315 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003316 case AMD3DNowAthlon:
3317 Builder.defineMacro("__3dNOW_A__");
3318 case AMD3DNow:
3319 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003320 case MMX:
3321 Builder.defineMacro("__MMX__");
3322 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003323 break;
3324 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003325
3326 if (CPU >= CK_i486) {
3327 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3328 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3329 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3330 }
3331 if (CPU >= CK_i586)
3332 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003333}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003334
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003335bool X86TargetInfo::hasFeature(StringRef Feature) const {
3336 return llvm::StringSwitch<bool>(Feature)
3337 .Case("aes", HasAES)
3338 .Case("avx", SSELevel >= AVX)
3339 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003340 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003341 .Case("avx512cd", HasAVX512CD)
3342 .Case("avx512er", HasAVX512ER)
3343 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003344 .Case("avx512dq", HasAVX512DQ)
3345 .Case("avx512bw", HasAVX512BW)
3346 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003347 .Case("bmi", HasBMI)
3348 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003349 .Case("cx16", HasCX16)
3350 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003351 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003352 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003353 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003354 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003355 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3356 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3357 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003358 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003359 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003360 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003361 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003362 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003363 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003364 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003365 .Case("sse", SSELevel >= SSE1)
3366 .Case("sse2", SSELevel >= SSE2)
3367 .Case("sse3", SSELevel >= SSE3)
3368 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003369 .Case("sse4.1", SSELevel >= SSE41)
3370 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003371 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003372 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003373 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003374 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3375 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003376 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003377 .Default(false);
3378}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003379
Eric Christopherd9832702015-06-29 21:00:05 +00003380// We can't use a generic validation scheme for the features accepted here
3381// versus subtarget features accepted in the target attribute because the
3382// bitfield structure that's initialized in the runtime only supports the
3383// below currently rather than the full range of subtarget features. (See
3384// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3385bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3386 return llvm::StringSwitch<bool>(FeatureStr)
3387 .Case("cmov", true)
3388 .Case("mmx", true)
3389 .Case("popcnt", true)
3390 .Case("sse", true)
3391 .Case("sse2", true)
3392 .Case("sse3", true)
3393 .Case("sse4.1", true)
3394 .Case("sse4.2", true)
3395 .Case("avx", true)
3396 .Case("avx2", true)
3397 .Case("sse4a", true)
3398 .Case("fma4", true)
3399 .Case("xop", true)
3400 .Case("fma", true)
3401 .Case("avx512f", true)
3402 .Case("bmi", true)
3403 .Case("bmi2", true)
3404 .Default(false);
3405}
3406
Eli Friedman3fd920a2008-08-20 02:34:37 +00003407bool
Anders Carlsson58436352009-02-28 17:11:49 +00003408X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003409 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003410 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003411 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003412 // Constant constraints.
3413 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3414 // instructions.
3415 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3416 // x86_64 instructions.
3417 case 's':
3418 Info.setRequiresImmediate();
3419 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003420 case 'I':
3421 Info.setRequiresImmediate(0, 31);
3422 return true;
3423 case 'J':
3424 Info.setRequiresImmediate(0, 63);
3425 return true;
3426 case 'K':
3427 Info.setRequiresImmediate(-128, 127);
3428 return true;
3429 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003430 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003431 return true;
3432 case 'M':
3433 Info.setRequiresImmediate(0, 3);
3434 return true;
3435 case 'N':
3436 Info.setRequiresImmediate(0, 255);
3437 return true;
3438 case 'O':
3439 Info.setRequiresImmediate(0, 127);
3440 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003441 // Register constraints.
3442 case 'Y': // 'Y' is the first character for several 2-character constraints.
3443 // Shift the pointer to the second character of the constraint.
3444 Name++;
3445 switch (*Name) {
3446 default:
3447 return false;
3448 case '0': // First SSE register.
3449 case 't': // Any SSE register, when SSE2 is enabled.
3450 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3451 case 'm': // Any MMX register, when inter-unit moves enabled.
3452 Info.setAllowsRegister();
3453 return true;
3454 }
3455 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003456 // Constraint 'f' cannot be used for output operands.
3457 if (Info.ConstraintStr[0] == '=')
3458 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003459 Info.setAllowsRegister();
3460 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003461 case 'a': // eax.
3462 case 'b': // ebx.
3463 case 'c': // ecx.
3464 case 'd': // edx.
3465 case 'S': // esi.
3466 case 'D': // edi.
3467 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003468 case 't': // Top of floating point stack.
3469 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003470 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003471 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003472 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003473 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003474 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3475 case 'l': // "Index" registers: any general register that can be used as an
3476 // index in a base+index memory access.
3477 Info.setAllowsRegister();
3478 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003479 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003480 case 'C': // SSE floating point constant.
3481 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003482 return true;
3483 }
3484}
3485
Akira Hatanaka974131e2014-09-18 18:17:18 +00003486bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3487 unsigned Size) const {
3488 // Strip off constraint modifiers.
3489 while (Constraint[0] == '=' ||
3490 Constraint[0] == '+' ||
3491 Constraint[0] == '&')
3492 Constraint = Constraint.substr(1);
3493
3494 return validateOperandSize(Constraint, Size);
3495}
3496
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003497bool X86TargetInfo::validateInputSize(StringRef Constraint,
3498 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003499 return validateOperandSize(Constraint, Size);
3500}
3501
3502bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3503 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003504 switch (Constraint[0]) {
3505 default: break;
3506 case 'y':
3507 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003508 case 'f':
3509 case 't':
3510 case 'u':
3511 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003512 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003513 if (SSELevel >= AVX512F)
3514 // 512-bit zmm registers can be used if target supports AVX512F.
3515 return Size <= 512U;
3516 else if (SSELevel >= AVX)
3517 // 256-bit ymm registers can be used if target supports AVX.
3518 return Size <= 256U;
3519 return Size <= 128U;
3520 case 'Y':
3521 // 'Y' is the first character for several 2-character constraints.
3522 switch (Constraint[1]) {
3523 default: break;
3524 case 'm':
3525 // 'Ym' is synonymous with 'y'.
3526 return Size <= 64;
3527 case 'i':
3528 case 't':
3529 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3530 if (SSELevel >= AVX512F)
3531 return Size <= 512U;
3532 else if (SSELevel >= AVX)
3533 return Size <= 256U;
3534 return SSELevel >= SSE2 && Size <= 128U;
3535 }
3536
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003537 }
3538
3539 return true;
3540}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003541
Eli Friedman3fd920a2008-08-20 02:34:37 +00003542std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003543X86TargetInfo::convertConstraint(const char *&Constraint) const {
3544 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003545 case 'a': return std::string("{ax}");
3546 case 'b': return std::string("{bx}");
3547 case 'c': return std::string("{cx}");
3548 case 'd': return std::string("{dx}");
3549 case 'S': return std::string("{si}");
3550 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003551 case 'p': // address
3552 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003553 case 't': // top of floating point stack.
3554 return std::string("{st}");
3555 case 'u': // second from top of floating point stack.
3556 return std::string("{st(1)}"); // second from top of floating point stack.
3557 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003558 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003559 }
3560}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003561
Eli Friedman3fd920a2008-08-20 02:34:37 +00003562// X86-32 generic target
3563class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003564public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003565 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003566 DoubleAlign = LongLongAlign = 32;
3567 LongDoubleWidth = 96;
3568 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003569 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003570 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003571 SizeType = UnsignedInt;
3572 PtrDiffType = SignedInt;
3573 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003574 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003575
3576 // Use fpret for all types.
3577 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3578 (1 << TargetInfo::Double) |
3579 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003580
3581 // x86-32 has atomics up to 8 bytes
3582 // FIXME: Check that we actually have cmpxchg8b before setting
3583 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3584 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003585 }
Craig Topper3164f332014-03-11 03:39:26 +00003586 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003587 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003588 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003589
Craig Topper3164f332014-03-11 03:39:26 +00003590 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003591 if (RegNo == 0) return 0;
3592 if (RegNo == 1) return 2;
3593 return -1;
3594 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003595 bool validateOperandSize(StringRef Constraint,
3596 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003597 switch (Constraint[0]) {
3598 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003599 case 'R':
3600 case 'q':
3601 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003602 case 'a':
3603 case 'b':
3604 case 'c':
3605 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003606 case 'S':
3607 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003608 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003609 case 'A':
3610 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003611 }
3612
Akira Hatanaka974131e2014-09-18 18:17:18 +00003613 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003614 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003615};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003616
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003617class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3618public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003619 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3620 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003621
Craig Topper3164f332014-03-11 03:39:26 +00003622 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003623 unsigned Major, Minor, Micro;
3624 getTriple().getOSVersion(Major, Minor, Micro);
3625 // New NetBSD uses the default rounding mode.
3626 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3627 return X86_32TargetInfo::getFloatEvalMethod();
3628 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003629 return 1;
3630 }
3631};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003632
Eli Friedmane3aa4542009-07-05 18:47:56 +00003633class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3634public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003635 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3636 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003637 SizeType = UnsignedLong;
3638 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003639 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003640 }
3641};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003642
Eli Friedman9fa28852012-08-08 23:57:20 +00003643class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3644public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003645 BitrigI386TargetInfo(const llvm::Triple &Triple)
3646 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003647 SizeType = UnsignedLong;
3648 IntPtrType = SignedLong;
3649 PtrDiffType = SignedLong;
3650 }
3651};
Eli Friedman9fa28852012-08-08 23:57:20 +00003652
Torok Edwinb2b37c62009-06-30 17:10:35 +00003653class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003654public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003655 DarwinI386TargetInfo(const llvm::Triple &Triple)
3656 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003657 LongDoubleWidth = 128;
3658 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003659 SuitableAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003660 SizeType = UnsignedLong;
3661 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003662 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003663 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003664 }
3665
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003666 bool handleTargetFeatures(std::vector<std::string> &Features,
3667 DiagnosticsEngine &Diags) override {
3668 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3669 Diags))
3670 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003671 // We now know the features we have: we can decide how to align vectors.
3672 MaxVectorAlign =
3673 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003674 return true;
3675 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003676};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003677
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003678// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003679class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003680public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003681 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3682 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003683 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003684 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003685 bool IsWinCOFF =
3686 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003687 DataLayoutString = IsWinCOFF
3688 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3689 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003690 }
Craig Topper3164f332014-03-11 03:39:26 +00003691 void getTargetDefines(const LangOptions &Opts,
3692 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003693 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3694 }
3695};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003696
3697// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003698class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003699public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003700 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003701 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003702 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003703 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3704 }
Craig Topper3164f332014-03-11 03:39:26 +00003705 void getTargetDefines(const LangOptions &Opts,
3706 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003707 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3708 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3709 // The value of the following reflects processor type.
3710 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3711 // We lost the original triple, so we use the default.
3712 Builder.defineMacro("_M_IX86", "600");
3713 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003714};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003715
David Majnemerae1ed0e2015-05-28 04:36:18 +00003716static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3717 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang supports
Reid Kleckner47606832014-04-21 20:58:00 +00003718 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3719 // macro anyway for pre-processor compatibility.
3720 if (Opts.MicrosoftExt)
3721 Builder.defineMacro("__declspec", "__declspec");
3722 else
3723 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3724
3725 if (!Opts.MicrosoftExt) {
3726 // Provide macros for all the calling convention keywords. Provide both
3727 // single and double underscore prefixed variants. These are available on
3728 // x64 as well as x86, even though they have no effect.
3729 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3730 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003731 std::string GCCSpelling = "__attribute__((__";
3732 GCCSpelling += CC;
3733 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003734 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3735 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3736 }
3737 }
3738}
3739
David Majnemerae1ed0e2015-05-28 04:36:18 +00003740static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3741 Builder.defineMacro("__MSVCRT__");
3742 Builder.defineMacro("__MINGW32__");
3743 addCygMingDefines(Opts, Builder);
3744}
3745
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003746// x86-32 MinGW target
3747class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3748public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003749 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003750 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003751 void getTargetDefines(const LangOptions &Opts,
3752 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003753 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003754 DefineStd(Builder, "WIN32", Opts);
3755 DefineStd(Builder, "WINNT", Opts);
3756 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003757 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003758 }
3759};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003760
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003761// x86-32 Cygwin target
3762class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3763public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003764 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3765 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003766 TLSSupported = false;
3767 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003768 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003769 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 +00003770 }
Craig Topper3164f332014-03-11 03:39:26 +00003771 void getTargetDefines(const LangOptions &Opts,
3772 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003773 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003774 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003775 Builder.defineMacro("__CYGWIN__");
3776 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003777 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003778 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003779 if (Opts.CPlusPlus)
3780 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003781 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003782};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003783
Chris Lattnerb986aba2010-04-11 19:29:39 +00003784// x86-32 Haiku target
3785class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3786public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003787 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003788 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003789 IntPtrType = SignedLong;
3790 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003791 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003792 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003793 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003794 }
Craig Topper3164f332014-03-11 03:39:26 +00003795 void getTargetDefines(const LangOptions &Opts,
3796 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003797 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3798 Builder.defineMacro("__INTEL__");
3799 Builder.defineMacro("__HAIKU__");
3800 }
3801};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003802
Douglas Gregor9fabd852011-07-01 22:41:14 +00003803// RTEMS Target
3804template<typename Target>
3805class RTEMSTargetInfo : public OSTargetInfo<Target> {
3806protected:
Craig Topper3164f332014-03-11 03:39:26 +00003807 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3808 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003809 // RTEMS defines; list based off of gcc output
3810
Douglas Gregor9fabd852011-07-01 22:41:14 +00003811 Builder.defineMacro("__rtems__");
3812 Builder.defineMacro("__ELF__");
3813 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003814
Douglas Gregor9fabd852011-07-01 22:41:14 +00003815public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003816 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3817 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003818
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003819 switch (Triple.getArch()) {
3820 default:
3821 case llvm::Triple::x86:
3822 // this->MCountName = ".mcount";
3823 break;
3824 case llvm::Triple::mips:
3825 case llvm::Triple::mipsel:
3826 case llvm::Triple::ppc:
3827 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003828 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003829 // this->MCountName = "_mcount";
3830 break;
3831 case llvm::Triple::arm:
3832 // this->MCountName = "__mcount";
3833 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003834 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003835 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003836};
3837
Douglas Gregor9fabd852011-07-01 22:41:14 +00003838// x86-32 RTEMS target
3839class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3840public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003841 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003842 SizeType = UnsignedLong;
3843 IntPtrType = SignedLong;
3844 PtrDiffType = SignedLong;
3845 this->UserLabelPrefix = "";
3846 }
Craig Topper3164f332014-03-11 03:39:26 +00003847 void getTargetDefines(const LangOptions &Opts,
3848 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003849 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3850 Builder.defineMacro("__INTEL__");
3851 Builder.defineMacro("__rtems__");
3852 }
3853};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003854
Eli Friedman3fd920a2008-08-20 02:34:37 +00003855// x86-64 generic target
3856class X86_64TargetInfo : public X86TargetInfo {
3857public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003858 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003859 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003860 bool IsWinCOFF =
3861 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003862 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003863 LongDoubleWidth = 128;
3864 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003865 LargeArrayMinWidth = 128;
3866 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003867 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003868 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3869 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3870 IntPtrType = IsX32 ? SignedInt : SignedLong;
3871 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003872 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003873 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003874
Eric Christopher917e9522014-11-18 22:36:15 +00003875 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003876 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3877 : IsWinCOFF
3878 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3879 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003880
3881 // Use fpret only for long double.
3882 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003883
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003884 // Use fp2ret for _Complex long double.
3885 ComplexLongDoubleUsesFP2Ret = true;
3886
Charles Davisc7d5c942015-09-17 20:55:33 +00003887 // Make __builtin_ms_va_list available.
3888 HasBuiltinMSVaList = true;
3889
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003890 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003891 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003892 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003893 }
Craig Topper3164f332014-03-11 03:39:26 +00003894 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003895 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003896 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003897
Craig Topper3164f332014-03-11 03:39:26 +00003898 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003899 if (RegNo == 0) return 0;
3900 if (RegNo == 1) return 1;
3901 return -1;
3902 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003903
Craig Topper3164f332014-03-11 03:39:26 +00003904 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003905 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003906 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003907 CC == CC_IntelOclBicc ||
3908 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003909 }
3910
Craig Topper3164f332014-03-11 03:39:26 +00003911 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003912 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003913 }
3914
Pavel Chupinfd223e12014-08-04 12:39:43 +00003915 // for x32 we need it here explicitly
3916 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003917};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003918
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003919// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003920class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003921public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003922 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3923 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003924 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003925 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003926 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003927 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003928 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003929 SizeType = UnsignedLongLong;
3930 PtrDiffType = SignedLongLong;
3931 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003932 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003933 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003934
Craig Topper3164f332014-03-11 03:39:26 +00003935 void getTargetDefines(const LangOptions &Opts,
3936 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003937 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003938 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003939 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003940
Craig Topper3164f332014-03-11 03:39:26 +00003941 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003942 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003943 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003944
Craig Topper3164f332014-03-11 03:39:26 +00003945 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003946 switch (CC) {
3947 case CC_X86StdCall:
3948 case CC_X86ThisCall:
3949 case CC_X86FastCall:
3950 return CCCR_Ignore;
3951 case CC_C:
3952 case CC_X86VectorCall:
3953 case CC_IntelOclBicc:
3954 case CC_X86_64SysV:
3955 return CCCR_OK;
3956 default:
3957 return CCCR_Warning;
3958 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003959 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003960};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003961
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003962// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003963class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003964public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003965 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003966 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003967 LongDoubleWidth = LongDoubleAlign = 64;
3968 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003969 }
Craig Topper3164f332014-03-11 03:39:26 +00003970 void getTargetDefines(const LangOptions &Opts,
3971 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003972 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3973 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00003974 Builder.defineMacro("_M_X64", "100");
3975 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003976 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003977};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003978
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003979// x86-64 MinGW target
3980class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3981public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003982 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Yaron Keren480bc9f2015-08-20 21:51:46 +00003983 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003984 void getTargetDefines(const LangOptions &Opts,
3985 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003986 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003987 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003988 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003989 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003990
3991 // GCC defines this macro when it is using __gxx_personality_seh0.
3992 if (!Opts.SjLjExceptions)
3993 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003994 }
3995};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003996
Yaron Kerend030d112015-07-22 17:38:19 +00003997// x86-64 Cygwin target
3998class CygwinX86_64TargetInfo : public X86_64TargetInfo {
3999public:
4000 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4001 : X86_64TargetInfo(Triple) {
4002 TLSSupported = false;
4003 WCharType = UnsignedShort;
4004 }
4005 void getTargetDefines(const LangOptions &Opts,
4006 MacroBuilder &Builder) const override {
4007 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4008 Builder.defineMacro("__x86_64__");
4009 Builder.defineMacro("__CYGWIN__");
4010 Builder.defineMacro("__CYGWIN64__");
4011 addCygMingDefines(Opts, Builder);
4012 DefineStd(Builder, "unix", Opts);
4013 if (Opts.CPlusPlus)
4014 Builder.defineMacro("_GNU_SOURCE");
4015
4016 // GCC defines this macro when it is using __gxx_personality_seh0.
4017 if (!Opts.SjLjExceptions)
4018 Builder.defineMacro("__SEH__");
4019 }
4020};
4021
Eli Friedman2857ccb2009-07-01 03:36:11 +00004022class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4023public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004024 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4025 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004026 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004027 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4028 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004029 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004030 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004031 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004032 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004033
4034 bool handleTargetFeatures(std::vector<std::string> &Features,
4035 DiagnosticsEngine &Diags) override {
4036 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4037 Diags))
4038 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004039 // We now know the features we have: we can decide how to align vectors.
4040 MaxVectorAlign =
4041 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004042 return true;
4043 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004044};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004045
Eli Friedman245f2292009-07-05 22:31:18 +00004046class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4047public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004048 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4049 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004050 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004051 Int64Type = SignedLongLong;
4052 }
4053};
Eli Friedman245f2292009-07-05 22:31:18 +00004054
Eli Friedman9fa28852012-08-08 23:57:20 +00004055class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4056public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004057 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4058 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4059 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004060 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004061 }
4062};
Tim Northover9bb857a2013-01-31 12:13:10 +00004063
Eli Friedmanf05b7722008-08-20 07:44:10 +00004064class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004065 // Possible FPU choices.
4066 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004067 VFP2FPU = (1 << 0),
4068 VFP3FPU = (1 << 1),
4069 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004070 NeonFPU = (1 << 3),
4071 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004072 };
4073
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004074 // Possible HWDiv features.
4075 enum HWDivMode {
4076 HWDivThumb = (1 << 0),
4077 HWDivARM = (1 << 1)
4078 };
4079
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004080 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004081 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004082 }
4083
4084 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4085 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004086
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004087 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004088
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004089 StringRef DefaultCPU;
4090 StringRef CPUProfile;
4091 StringRef CPUAttr;
4092
Rafael Espindolaeb265472013-08-21 21:59:03 +00004093 enum {
4094 FP_Default,
4095 FP_VFP,
4096 FP_Neon
4097 } FPMath;
4098
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004099 unsigned ArchISA;
4100 unsigned ArchKind;
4101 unsigned ArchProfile;
4102 unsigned ArchVersion;
4103
Bernard Ogdenda13af32013-10-24 18:32:51 +00004104 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004105
Logan Chien57086ce2012-10-10 06:56:20 +00004106 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004107 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004108
4109 // Initialized via features.
4110 unsigned SoftFloat : 1;
4111 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004112
Bernard Ogden18b57012013-10-29 09:47:51 +00004113 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004114 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004115 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004116 unsigned Unaligned : 1;
4117
4118 enum {
4119 LDREX_B = (1 << 0), /// byte (8-bit)
4120 LDREX_H = (1 << 1), /// half (16-bit)
4121 LDREX_W = (1 << 2), /// word (32-bit)
4122 LDREX_D = (1 << 3), /// double (64-bit)
4123 };
4124
4125 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004126
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004127 // ACLE 6.5.1 Hardware floating point
4128 enum {
4129 HW_FP_HP = (1 << 1), /// half (16-bit)
4130 HW_FP_SP = (1 << 2), /// single (32-bit)
4131 HW_FP_DP = (1 << 3), /// double (64-bit)
4132 };
4133 uint32_t HW_FP;
4134
Chris Lattner5cc15e02010-03-03 19:03:45 +00004135 static const Builtin::Info BuiltinInfo[];
4136
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004137 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004138 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004139
4140 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004141 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004142
Renato Golin9ba39232015-02-27 16:35:48 +00004143 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4144 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4145 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004146 SizeType = UnsignedLong;
4147 else
4148 SizeType = UnsignedInt;
4149
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004150 switch (T.getOS()) {
4151 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004152 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004153 break;
4154 case llvm::Triple::Win32:
4155 WCharType = UnsignedShort;
4156 break;
4157 case llvm::Triple::Linux:
4158 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004159 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4160 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004161 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004162 }
4163
4164 UseBitFieldTypeAlignment = true;
4165
4166 ZeroLengthBitfieldBoundary = 0;
4167
Tim Northover147cd2f2014-10-14 22:12:21 +00004168 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4169 // so set preferred for small types to 32.
4170 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004171 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004172 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4173 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4174 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004175 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004176 DataLayoutString = "e"
4177 "-m:w"
4178 "-p:32:32"
4179 "-i64:64"
4180 "-v128:64:128"
4181 "-a:0:32"
4182 "-n32"
4183 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004184 } else if (T.isOSNaCl()) {
4185 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004186 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004187 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004188 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004189 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4190 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004191 }
4192
4193 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004194 }
4195
4196 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004197 const llvm::Triple &T = getTriple();
4198
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004199 IsAAPCS = false;
4200
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004201 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004202
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004203 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004204 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004205 SizeType = UnsignedInt;
4206 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004207 SizeType = UnsignedLong;
4208
4209 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4210 WCharType = SignedInt;
4211
4212 // Do not respect the alignment of bit-field types when laying out
4213 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4214 UseBitFieldTypeAlignment = false;
4215
4216 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4217 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4218 /// gcc.
4219 ZeroLengthBitfieldBoundary = 32;
4220
Tim Northover147cd2f2014-10-14 22:12:21 +00004221 if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004222 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004223 BigEndian
4224 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4225 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4226 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004227 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004228 BigEndian
4229 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4230 : "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 +00004231
4232 // FIXME: Override "preferred align" for double and long long.
4233 }
4234
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004235 void setArchInfo() {
4236 StringRef ArchName = getTriple().getArchName();
4237
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004238 ArchISA = llvm::ARM::parseArchISA(ArchName);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004239 DefaultCPU = getDefaultCPU(ArchName);
4240
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004241 unsigned ArchKind = llvm::ARM::parseArch(ArchName);
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004242 if (ArchKind == llvm::ARM::AK_INVALID)
4243 // set arch of the CPU, either provided explicitly or hardcoded default
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004244 ArchKind = llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004245 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004246 }
4247
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004248 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004249 StringRef SubArch;
4250
4251 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004252 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004253 SubArch = llvm::ARM::getSubArch(ArchKind);
4254 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4255 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004256
4257 // cache CPU related strings
4258 CPUAttr = getCPUAttr();
4259 CPUProfile = getCPUProfile();
4260 }
4261
4262 void setAtomic() {
4263 // when triple does not specify a sub arch,
4264 // then we are not using inline atomics
4265 bool ShouldUseInlineAtomic = DefaultCPU.empty() ?
4266 false :
4267 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4268 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
4269 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4270 if (ArchProfile == llvm::ARM::PK_M) {
4271 MaxAtomicPromoteWidth = 32;
4272 if (ShouldUseInlineAtomic)
4273 MaxAtomicInlineWidth = 32;
4274 }
4275 else {
4276 MaxAtomicPromoteWidth = 64;
4277 if (ShouldUseInlineAtomic)
4278 MaxAtomicInlineWidth = 64;
4279 }
4280 }
4281
4282 bool isThumb() const {
4283 return (ArchISA == llvm::ARM::IK_THUMB);
4284 }
4285
4286 bool supportsThumb() const {
4287 return CPUAttr.count('T') || ArchVersion >= 6;
4288 }
4289
4290 bool supportsThumb2() const {
4291 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4292 }
4293
4294 StringRef getDefaultCPU(StringRef ArchName) const {
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004295 return llvm::ARM::getDefaultCPU(ArchName);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004296 }
4297
4298 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004299 // For most sub-arches, the build attribute CPU name is enough.
4300 // For Cortex variants, it's slightly different.
4301 switch(ArchKind) {
4302 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004303 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004304 case llvm::ARM::AK_ARMV6M:
4305 case llvm::ARM::AK_ARMV6SM:
4306 case llvm::ARM::AK_ARMV6HL:
4307 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004308 case llvm::ARM::AK_ARMV7S:
4309 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004310 case llvm::ARM::AK_ARMV7:
4311 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004312 case llvm::ARM::AK_ARMV7L:
4313 case llvm::ARM::AK_ARMV7HL:
4314 return "7A";
4315 case llvm::ARM::AK_ARMV7R:
4316 return "7R";
4317 case llvm::ARM::AK_ARMV7M:
4318 return "7M";
4319 case llvm::ARM::AK_ARMV7EM:
4320 return "7EM";
4321 case llvm::ARM::AK_ARMV8A:
4322 return "8A";
4323 case llvm::ARM::AK_ARMV8_1A:
4324 return "8_1A";
4325 }
4326 }
4327
4328 StringRef getCPUProfile() const {
4329 switch(ArchProfile) {
4330 case llvm::ARM::PK_A:
4331 return "A";
4332 case llvm::ARM::PK_R:
4333 return "R";
4334 case llvm::ARM::PK_M:
4335 return "M";
4336 default:
4337 return "";
4338 }
4339 }
4340
Chris Lattner17df24e2008-04-21 18:56:49 +00004341public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004342 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004343 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004344 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004345 BigEndian = IsBigEndian;
4346
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004347 switch (getTriple().getOS()) {
4348 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004349 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004350 break;
4351 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004352 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004353 break;
4354 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004355
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004356 // cache arch related info
4357 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004358
Chris Lattner1a8f3942010-04-23 16:29:58 +00004359 // {} in inline assembly are neon specifiers, not assembly variant
4360 // specifiers.
4361 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004362
Eric Christopher0e261882014-12-05 01:06:59 +00004363 // FIXME: This duplicates code from the driver that sets the -target-abi
4364 // option - this code is used if -target-abi isn't passed and should
4365 // be unified in some way.
4366 if (Triple.isOSBinFormatMachO()) {
4367 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4368 // the frontend matches that.
4369 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4370 Triple.getOS() == llvm::Triple::UnknownOS ||
4371 StringRef(CPU).startswith("cortex-m")) {
4372 setABI("aapcs");
4373 } else {
4374 setABI("apcs-gnu");
4375 }
4376 } else if (Triple.isOSWindows()) {
4377 // FIXME: this is invalid for WindowsCE
4378 setABI("aapcs");
4379 } else {
4380 // Select the default based on the platform.
4381 switch (Triple.getEnvironment()) {
4382 case llvm::Triple::Android:
4383 case llvm::Triple::GNUEABI:
4384 case llvm::Triple::GNUEABIHF:
4385 setABI("aapcs-linux");
4386 break;
4387 case llvm::Triple::EABIHF:
4388 case llvm::Triple::EABI:
4389 setABI("aapcs");
4390 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004391 case llvm::Triple::GNU:
4392 setABI("apcs-gnu");
4393 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004394 default:
4395 if (Triple.getOS() == llvm::Triple::NetBSD)
4396 setABI("apcs-gnu");
4397 else
4398 setABI("aapcs");
4399 break;
4400 }
4401 }
John McCall86353412010-08-21 22:46:04 +00004402
4403 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004404 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004405
Renato Golin15b86152015-07-03 16:41:13 +00004406 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004407 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004408
James Molloya7139222012-03-12 09:14:10 +00004409 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004410 // the alignment of the zero-length bitfield is greater than the member
4411 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004412 // zero length bitfield.
4413 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004414 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004415
Alp Toker4925ba72014-06-07 23:30:42 +00004416 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004417
Craig Topper3164f332014-03-11 03:39:26 +00004418 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004419 ABI = Name;
4420
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004421 // The defaults (above) are for AAPCS, check if we need to change them.
4422 //
4423 // FIXME: We need support for -meabi... we could just mangle it into the
4424 // name.
4425 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004426 setABIAPCS();
4427 return true;
4428 }
4429 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4430 setABIAAPCS();
4431 return true;
4432 }
4433 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004434 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004435
Renato Golinf5c4dec2015-05-27 13:33:00 +00004436 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopheref1e2952015-08-28 02:13:58 +00004437 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4438 StringRef CPU,
Eric Christopher007b0a02015-08-28 22:32:01 +00004439 std::vector<std::string> &FeaturesVec) const override {
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004440
4441 std::vector<const char*> TargetFeatures;
4442
4443 // get default FPU features
4444 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU);
4445 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4446
4447 // get default Extension features
4448 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU);
4449 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4450
4451 for (const char *Feature : TargetFeatures)
4452 if (Feature[0] == '+')
4453 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004454
4455 if (ArchVersion < 6 ||
4456 (ArchVersion == 6 && ArchProfile == llvm::ARM::PK_M))
4457 Features["strict-align"] = true;
4458
Eric Christopher007b0a02015-08-28 22:32:01 +00004459 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004460 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004461
Craig Topper3164f332014-03-11 03:39:26 +00004462 bool handleTargetFeatures(std::vector<std::string> &Features,
4463 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004464 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004465 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004466 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004467 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004468 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004469 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004470 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004471
Ranjeet Singhac08e532015-06-24 23:39:25 +00004472 // This does not diagnose illegal cases like having both
4473 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4474 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004475 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004476 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004477 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004478 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004479 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004480 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004481 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004482 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004483 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004484 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004485 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004486 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004487 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004488 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004489 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004490 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004491 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004492 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004493 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004494 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004495 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004496 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004497 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004498 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004499 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004500 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004501 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004502 Crypto = 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004503 } else if (Feature == "+t2dsp") {
4504 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004505 } else if (Feature == "+fp-only-sp") {
Ranjeet Singhac08e532015-06-24 23:39:25 +00004506 HW_FP_remove |= HW_FP_DP | HW_FP_HP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004507 } else if (Feature == "+strict-align") {
4508 Unaligned = 0;
4509 } else if (Feature == "+fp16") {
4510 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004511 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004512 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004513 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004514
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004515 switch (ArchVersion) {
4516 case 6:
4517 if (ArchProfile == llvm::ARM::PK_M)
4518 LDREX = 0;
4519 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4520 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4521 else
4522 LDREX = LDREX_W;
4523 break;
4524 case 7:
4525 if (ArchProfile == llvm::ARM::PK_M)
4526 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4527 else
4528 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4529 break;
4530 case 8:
4531 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4532 }
4533
Rafael Espindolaeb265472013-08-21 21:59:03 +00004534 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4535 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4536 return false;
4537 }
4538
4539 if (FPMath == FP_Neon)
4540 Features.push_back("+neonfp");
4541 else if (FPMath == FP_VFP)
4542 Features.push_back("-neonfp");
4543
Daniel Dunbar893d4752009-12-19 04:15:38 +00004544 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004545 auto Feature =
4546 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4547 if (Feature != Features.end())
4548 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004549
Rafael Espindolaeb265472013-08-21 21:59:03 +00004550 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004551 }
4552
Craig Topper3164f332014-03-11 03:39:26 +00004553 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004554 return llvm::StringSwitch<bool>(Feature)
4555 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004556 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004557 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004558 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004559 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004560 .Case("hwdiv", HWDiv & HWDivThumb)
4561 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004562 .Default(false);
4563 }
Renato Golin15b86152015-07-03 16:41:13 +00004564
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004565 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004566 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004567 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004568
Renato Golin15b86152015-07-03 16:41:13 +00004569 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004570 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004571 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004572 CPU = Name;
4573 return true;
4574 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004575
Craig Topper3164f332014-03-11 03:39:26 +00004576 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004577
Craig Topper3164f332014-03-11 03:39:26 +00004578 void getTargetDefines(const LangOptions &Opts,
4579 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004580 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004581 Builder.defineMacro("__arm");
4582 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004583
Chris Lattnerecd49032009-03-02 22:27:17 +00004584 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004585 Builder.defineMacro("__REGISTER_PREFIX__", "");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004586 if (!CPUAttr.empty())
4587 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004588
4589 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004590 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004591 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004592
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004593 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004594 // ACLE 6.5.7 Crypto Extension
4595 if (Crypto)
4596 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4597 // ACLE 6.5.8 CRC32 Extension
4598 if (CRC)
4599 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4600 // ACLE 6.5.10 Numeric Maximum and Minimum
4601 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4602 // ACLE 6.5.9 Directed Rounding
4603 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004604 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004605
4606 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4607 // is not defined for the M-profile.
4608 // NOTE that the deffault profile is assumed to be 'A'
4609 if (CPUProfile.empty() || CPUProfile != "M")
4610 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4611
4612 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4613 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4614 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004615 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004616 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004617 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004618 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4619
4620 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4621 // instruction set such as ARM or Thumb.
4622 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4623
4624 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4625
4626 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004627 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004628 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004629
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004630 // ACLE 6.4.3 Unaligned access supported in hardware
4631 if (Unaligned)
4632 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
4633
4634 // ACLE 6.4.4 LDREX/STREX
4635 if (LDREX)
4636 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4637
4638 // ACLE 6.4.5 CLZ
4639 if (ArchVersion == 5 ||
4640 (ArchVersion == 6 && CPUProfile != "M") ||
4641 ArchVersion > 6)
4642 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4643
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004644 // ACLE 6.5.1 Hardware Floating Point
4645 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004646 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004647
Yi Konga44c4d72014-06-27 21:25:42 +00004648 // ACLE predefines.
4649 Builder.defineMacro("__ARM_ACLE", "200");
4650
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004651 // FP16 support (we currently only support IEEE format).
4652 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4653 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4654
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004655 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4656 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4657 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4658
Mike Stump9d54bd72009-04-08 02:07:04 +00004659 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004660
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004661 // FIXME: It's more complicated than this and we don't really support
4662 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004663 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004664 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004665 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004666
David Tweed8f676532012-10-25 13:33:01 +00004667 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004668 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004669 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4670 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004671 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004672 Builder.defineMacro("__ARM_PCS", "1");
4673
David Tweed8f676532012-10-25 13:33:01 +00004674 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004675 Builder.defineMacro("__ARM_PCS_VFP", "1");
4676 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004677
Daniel Dunbar893d4752009-12-19 04:15:38 +00004678 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004679 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004680
4681 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004682 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004683
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004684 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004685 Builder.defineMacro("__THUMBEL__");
4686 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004687 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004688 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004689 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004690
4691 // ACLE 6.4.9 32-bit SIMD instructions
4692 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4693 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4694
4695 // ACLE 6.4.10 Hardware Integer Divide
4696 if (((HWDiv & HWDivThumb) && isThumb()) || ((HWDiv & HWDivARM) && !isThumb())) {
4697 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004698 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004699 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004700
4701 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004702 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004703
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004704 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004705 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004706 if (FPU & VFP2FPU)
4707 Builder.defineMacro("__ARM_VFPV2__");
4708 if (FPU & VFP3FPU)
4709 Builder.defineMacro("__ARM_VFPV3__");
4710 if (FPU & VFP4FPU)
4711 Builder.defineMacro("__ARM_VFPV4__");
4712 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004713
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004714 // This only gets set when Neon instructions are actually available, unlike
4715 // the VFP define, hence the soft float and arch check. This is subtly
4716 // different from gcc, we follow the intent which was that it should be set
4717 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004718 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004719 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004720 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004721 // current AArch32 NEON implementations do not support double-precision
4722 // floating-point even when it is present in VFP.
4723 Builder.defineMacro("__ARM_NEON_FP", "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004724 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004725
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004726 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4727 Opts.ShortWChar ? "2" : "4");
4728
4729 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4730 Opts.ShortEnums ? "1" : "4");
4731
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004732 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004733 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4734 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4735 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4736 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4737 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004738
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004739 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004740 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004741 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004742 }
4743
4744 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004745 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004746 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4747 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004748 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004749 }
4750
4751 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004752 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004753 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004754 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004755
Craig Topper3164f332014-03-11 03:39:26 +00004756 void getTargetBuiltins(const Builtin::Info *&Records,
4757 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004758 Records = BuiltinInfo;
4759 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004760 }
Craig Topper3164f332014-03-11 03:39:26 +00004761 bool isCLZForZeroUndef() const override { return false; }
4762 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004763 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004764 }
Craig Topper3164f332014-03-11 03:39:26 +00004765 void getGCCRegNames(const char * const *&Names,
4766 unsigned &NumNames) const override;
4767 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4768 unsigned &NumAliases) const override;
4769 bool validateAsmConstraint(const char *&Name,
4770 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004771 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004772 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004773 case 'l': // r0-r7
4774 case 'h': // r8-r15
4775 case 'w': // VFP Floating point register single precision
4776 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004777 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004778 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004779 case 'I':
4780 case 'J':
4781 case 'K':
4782 case 'L':
4783 case 'M':
4784 // FIXME
4785 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004786 case 'Q': // A memory address that is a single base register.
4787 Info.setAllowsMemory();
4788 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004789 case 'U': // a memory reference...
4790 switch (Name[1]) {
4791 case 'q': // ...ARMV4 ldrsb
4792 case 'v': // ...VFP load/store (reg+constant offset)
4793 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004794 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004795 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004796 case 'n': // valid address for Neon doubleword vector load/store
4797 case 'm': // valid address for Neon element and structure load/store
4798 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004799 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004800 Info.setAllowsMemory();
4801 Name++;
4802 return true;
4803 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004804 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004805 return false;
4806 }
Craig Topper3164f332014-03-11 03:39:26 +00004807 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004808 std::string R;
4809 switch (*Constraint) {
4810 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004811 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004812 Constraint++;
4813 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004814 case 'p': // 'p' should be translated to 'r' by default.
4815 R = std::string("r");
4816 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004817 default:
4818 return std::string(1, *Constraint);
4819 }
4820 return R;
4821 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004822 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004823 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004824 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004825 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004826 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004827
Bill Wendling9d1ee112012-10-25 23:28:48 +00004828 // Strip off constraint modifiers.
4829 while (Constraint[0] == '=' ||
4830 Constraint[0] == '+' ||
4831 Constraint[0] == '&')
4832 Constraint = Constraint.substr(1);
4833
4834 switch (Constraint[0]) {
4835 default: break;
4836 case 'r': {
4837 switch (Modifier) {
4838 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004839 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004840 case 'q':
4841 // A register of size 32 cannot fit a vector type.
4842 return false;
4843 }
4844 }
4845 }
4846
4847 return true;
4848 }
Craig Topper3164f332014-03-11 03:39:26 +00004849 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004850 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004851 return "";
4852 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004853
Craig Topper3164f332014-03-11 03:39:26 +00004854 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004855 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4856 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004857
Craig Topper3164f332014-03-11 03:39:26 +00004858 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004859 if (RegNo == 0) return 0;
4860 if (RegNo == 1) return 1;
4861 return -1;
4862 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004863
4864 bool hasSjLjLowering() const override {
4865 return true;
4866 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004867};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004868
Rafael Espindolaeb265472013-08-21 21:59:03 +00004869bool ARMTargetInfo::setFPMath(StringRef Name) {
4870 if (Name == "neon") {
4871 FPMath = FP_Neon;
4872 return true;
4873 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4874 Name == "vfp4") {
4875 FPMath = FP_VFP;
4876 return true;
4877 }
4878 return false;
4879}
4880
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004881const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004882 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004883 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004884 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4885
4886 // Float registers
4887 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4888 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4889 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004890 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004891
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004892 // Double registers
4893 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4894 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004895 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4896 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004897
4898 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004899 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4900 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004901};
4902
4903void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004904 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004905 Names = GCCRegNames;
4906 NumNames = llvm::array_lengthof(GCCRegNames);
4907}
4908
4909const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004910 { { "a1" }, "r0" },
4911 { { "a2" }, "r1" },
4912 { { "a3" }, "r2" },
4913 { { "a4" }, "r3" },
4914 { { "v1" }, "r4" },
4915 { { "v2" }, "r5" },
4916 { { "v3" }, "r6" },
4917 { { "v4" }, "r7" },
4918 { { "v5" }, "r8" },
4919 { { "v6", "rfp" }, "r9" },
4920 { { "sl" }, "r10" },
4921 { { "fp" }, "r11" },
4922 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004923 { { "r13" }, "sp" },
4924 { { "r14" }, "lr" },
4925 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004926 // The S, D and Q registers overlap, but aren't really aliases; we
4927 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004928};
4929
4930void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4931 unsigned &NumAliases) const {
4932 Aliases = GCCRegAliases;
4933 NumAliases = llvm::array_lengthof(GCCRegAliases);
4934}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004935
4936const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00004937#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004938 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004939#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4940 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00004941#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004942
Craig Topper07d3b622015-08-07 05:14:44 +00004943#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004944 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004945#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004946 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004947#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4948 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004949#include "clang/Basic/BuiltinsARM.def"
4950};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004951
4952class ARMleTargetInfo : public ARMTargetInfo {
4953public:
4954 ARMleTargetInfo(const llvm::Triple &Triple)
4955 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004956 void getTargetDefines(const LangOptions &Opts,
4957 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004958 Builder.defineMacro("__ARMEL__");
4959 ARMTargetInfo::getTargetDefines(Opts, Builder);
4960 }
4961};
4962
4963class ARMbeTargetInfo : public ARMTargetInfo {
4964public:
4965 ARMbeTargetInfo(const llvm::Triple &Triple)
4966 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004967 void getTargetDefines(const LangOptions &Opts,
4968 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004969 Builder.defineMacro("__ARMEB__");
4970 Builder.defineMacro("__ARM_BIG_ENDIAN");
4971 ARMTargetInfo::getTargetDefines(Opts, Builder);
4972 }
4973};
Chris Lattner17df24e2008-04-21 18:56:49 +00004974
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004975class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4976 const llvm::Triple Triple;
4977public:
4978 WindowsARMTargetInfo(const llvm::Triple &Triple)
4979 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4980 TLSSupported = false;
4981 WCharType = UnsignedShort;
4982 SizeType = UnsignedInt;
4983 UserLabelPrefix = "";
4984 }
4985 void getVisualStudioDefines(const LangOptions &Opts,
4986 MacroBuilder &Builder) const {
4987 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4988
4989 // FIXME: this is invalid for WindowsCE
4990 Builder.defineMacro("_M_ARM_NT", "1");
4991 Builder.defineMacro("_M_ARMT", "_M_ARM");
4992 Builder.defineMacro("_M_THUMB", "_M_ARM");
4993
4994 assert((Triple.getArch() == llvm::Triple::arm ||
4995 Triple.getArch() == llvm::Triple::thumb) &&
4996 "invalid architecture for Windows ARM target info");
4997 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4998 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4999
5000 // TODO map the complete set of values
5001 // 31: VFPv3 40: VFPv4
5002 Builder.defineMacro("_M_ARM_FP", "31");
5003 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005004 BuiltinVaListKind getBuiltinVaListKind() const override {
5005 return TargetInfo::CharPtrBuiltinVaList;
5006 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005007 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5008 switch (CC) {
5009 case CC_X86StdCall:
5010 case CC_X86ThisCall:
5011 case CC_X86FastCall:
5012 case CC_X86VectorCall:
5013 return CCCR_Ignore;
5014 case CC_C:
5015 return CCCR_OK;
5016 default:
5017 return CCCR_Warning;
5018 }
5019 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005020};
5021
5022// Windows ARM + Itanium C++ ABI Target
5023class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5024public:
5025 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5026 : WindowsARMTargetInfo(Triple) {
5027 TheCXXABI.set(TargetCXXABI::GenericARM);
5028 }
5029
5030 void getTargetDefines(const LangOptions &Opts,
5031 MacroBuilder &Builder) const override {
5032 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5033
5034 if (Opts.MSVCCompat)
5035 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5036 }
5037};
5038
5039// Windows ARM, MS (C++) ABI
5040class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5041public:
5042 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5043 : WindowsARMTargetInfo(Triple) {
5044 TheCXXABI.set(TargetCXXABI::Microsoft);
5045 }
5046
5047 void getTargetDefines(const LangOptions &Opts,
5048 MacroBuilder &Builder) const override {
5049 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5050 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5051 }
5052};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005053
Yaron Keren321249c2015-07-15 13:32:23 +00005054// ARM MinGW target
5055class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5056public:
5057 MinGWARMTargetInfo(const llvm::Triple &Triple)
5058 : WindowsARMTargetInfo(Triple) {
5059 TheCXXABI.set(TargetCXXABI::GenericARM);
5060 }
5061
5062 void getTargetDefines(const LangOptions &Opts,
5063 MacroBuilder &Builder) const override {
5064 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5065 DefineStd(Builder, "WIN32", Opts);
5066 DefineStd(Builder, "WINNT", Opts);
5067 Builder.defineMacro("_ARM_");
5068 addMinGWDefines(Opts, Builder);
5069 }
5070};
5071
5072// ARM Cygwin target
5073class CygwinARMTargetInfo : public ARMleTargetInfo {
5074public:
5075 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5076 TLSSupported = false;
5077 WCharType = UnsignedShort;
5078 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005079 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005080 }
5081 void getTargetDefines(const LangOptions &Opts,
5082 MacroBuilder &Builder) const override {
5083 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5084 Builder.defineMacro("_ARM_");
5085 Builder.defineMacro("__CYGWIN__");
5086 Builder.defineMacro("__CYGWIN32__");
5087 DefineStd(Builder, "unix", Opts);
5088 if (Opts.CPlusPlus)
5089 Builder.defineMacro("_GNU_SOURCE");
5090 }
5091};
5092
Mike Stump11289f42009-09-09 15:08:12 +00005093class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005094 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005095protected:
Craig Topper3164f332014-03-11 03:39:26 +00005096 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5097 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005098 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005099 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005100
Torok Edwinb2b37c62009-06-30 17:10:35 +00005101public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005102 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005103 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005104 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005105 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005106 // FIXME: This should be based off of the target features in
5107 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005108 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005109
5110 // Darwin on iOS uses a variant of the ARM C++ ABI.
5111 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005112 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005113};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005114
Tim Northover573cbee2014-05-24 12:52:07 +00005115class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005116 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005117 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5118 static const char *const GCCRegNames[];
5119
James Molloy75f5f9e2014-04-16 15:33:48 +00005120 enum FPUModeEnum {
5121 FPUMode,
5122 NeonMode
5123 };
5124
5125 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005126 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005127 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005128 unsigned Unaligned;
James Molloy75f5f9e2014-04-16 15:33:48 +00005129
Tim Northovera2ee4332014-03-29 15:09:45 +00005130 static const Builtin::Info BuiltinInfo[];
5131
5132 std::string ABI;
5133
5134public:
Tim Northover573cbee2014-05-24 12:52:07 +00005135 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005136 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005137
5138 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5139 WCharType = SignedInt;
5140
5141 // NetBSD apparently prefers consistency across ARM targets to consistency
5142 // across 64-bit targets.
5143 Int64Type = SignedLongLong;
5144 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005145 } else {
5146 WCharType = UnsignedInt;
5147 Int64Type = SignedLong;
5148 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005149 }
5150
Tim Northovera2ee4332014-03-29 15:09:45 +00005151 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005152 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005153 MaxAtomicInlineWidth = 128;
5154 MaxAtomicPromoteWidth = 128;
5155
Tim Northovera6a19f12015-02-06 01:25:07 +00005156 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005157 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5158
Tim Northovera2ee4332014-03-29 15:09:45 +00005159 // {} in inline assembly are neon specifiers, not assembly variant
5160 // specifiers.
5161 NoAsmVariants = true;
5162
Tim Northover7ad87af2015-01-16 18:44:04 +00005163 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5164 // contributes to the alignment of the containing aggregate in the same way
5165 // a plain (non bit-field) member of that type would, without exception for
5166 // zero-sized or anonymous bit-fields."
5167 UseBitFieldTypeAlignment = true;
5168 UseZeroLengthBitfieldAlignment = true;
5169
Tim Northover573cbee2014-05-24 12:52:07 +00005170 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005171 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5172 }
5173
Alp Toker4925ba72014-06-07 23:30:42 +00005174 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005175 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005176 if (Name != "aapcs" && Name != "darwinpcs")
5177 return false;
5178
5179 ABI = Name;
5180 return true;
5181 }
5182
David Blaikie1cbb9712014-11-14 19:09:44 +00005183 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005184 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005185 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005186 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005187 .Case("cyclone", true)
5188 .Default(false);
5189 return CPUKnown;
5190 }
5191
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005192 void getTargetDefines(const LangOptions &Opts,
5193 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005194 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005195 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005196
5197 // Target properties.
5198 Builder.defineMacro("_LP64");
5199 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005200
5201 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5202 Builder.defineMacro("__ARM_ACLE", "200");
5203 Builder.defineMacro("__ARM_ARCH", "8");
5204 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5205
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005206 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005207 Builder.defineMacro("__ARM_PCS_AAPCS64");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005208 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005209
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005210 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5211 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5212 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5213 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005214 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005215 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5216 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005217
5218 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5219
5220 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005221 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005222
5223 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5224 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005225 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5226 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005227
5228 if (Opts.FastMath || Opts.FiniteMathOnly)
5229 Builder.defineMacro("__ARM_FP_FAST");
5230
Richard Smithab506ad2014-10-20 23:26:58 +00005231 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00005232 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
5233
5234 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5235
5236 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5237 Opts.ShortEnums ? "1" : "4");
5238
James Molloy75f5f9e2014-04-16 15:33:48 +00005239 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005240 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005241 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005242 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005243 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005244
Bradley Smith418c5932014-05-02 15:17:51 +00005245 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005246 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005247
James Molloy75f5f9e2014-04-16 15:33:48 +00005248 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005249 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5250
5251 if (Unaligned)
5252 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005253
5254 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5255 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5256 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5257 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5258 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005259 }
5260
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005261 void getTargetBuiltins(const Builtin::Info *&Records,
5262 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005263 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00005264 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00005265 }
5266
David Blaikie1cbb9712014-11-14 19:09:44 +00005267 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005268 return Feature == "aarch64" ||
5269 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005270 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005271 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005272 }
5273
James Molloy5e73df52014-04-16 15:06:20 +00005274 bool handleTargetFeatures(std::vector<std::string> &Features,
5275 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005276 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005277 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005278 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005279 Unaligned = 1;
5280
Eric Christopher610fe112015-08-26 08:21:55 +00005281 for (const auto &Feature : Features) {
5282 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005283 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005284 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005285 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005286 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005287 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005288 if (Feature == "+strict-align")
5289 Unaligned = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005290 }
5291
Eric Christopher964a5f32015-08-05 23:48:05 +00005292 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005293
5294 return true;
5295 }
5296
David Blaikie1cbb9712014-11-14 19:09:44 +00005297 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005298
David Blaikie1cbb9712014-11-14 19:09:44 +00005299 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005300 return TargetInfo::AArch64ABIBuiltinVaList;
5301 }
5302
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005303 void getGCCRegNames(const char *const *&Names,
5304 unsigned &NumNames) const override;
5305 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5306 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005307
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005308 bool validateAsmConstraint(const char *&Name,
5309 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005310 switch (*Name) {
5311 default:
5312 return false;
5313 case 'w': // Floating point and SIMD registers (V0-V31)
5314 Info.setAllowsRegister();
5315 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005316 case 'I': // Constant that can be used with an ADD instruction
5317 case 'J': // Constant that can be used with a SUB instruction
5318 case 'K': // Constant that can be used with a 32-bit logical instruction
5319 case 'L': // Constant that can be used with a 64-bit logical instruction
5320 case 'M': // Constant that can be used as a 32-bit MOV immediate
5321 case 'N': // Constant that can be used as a 64-bit MOV immediate
5322 case 'Y': // Floating point constant zero
5323 case 'Z': // Integer constant zero
5324 return true;
5325 case 'Q': // A memory reference with base register and no offset
5326 Info.setAllowsMemory();
5327 return true;
5328 case 'S': // A symbolic address
5329 Info.setAllowsRegister();
5330 return true;
5331 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005332 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5333 // Utf: A memory address suitable for ldp/stp in TF mode.
5334 // Usa: An absolute symbolic address.
5335 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5336 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005337 case 'z': // Zero register, wzr or xzr
5338 Info.setAllowsRegister();
5339 return true;
5340 case 'x': // Floating point and SIMD registers (V0-V15)
5341 Info.setAllowsRegister();
5342 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005343 }
5344 return false;
5345 }
5346
Akira Hatanaka987f1862014-08-22 06:05:21 +00005347 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005348 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005349 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005350 // Strip off constraint modifiers.
5351 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5352 Constraint = Constraint.substr(1);
5353
5354 switch (Constraint[0]) {
5355 default:
5356 return true;
5357 case 'z':
5358 case 'r': {
5359 switch (Modifier) {
5360 case 'x':
5361 case 'w':
5362 // For now assume that the person knows what they're
5363 // doing with the modifier.
5364 return true;
5365 default:
5366 // By default an 'r' constraint will be in the 'x'
5367 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005368 if (Size == 64)
5369 return true;
5370
5371 SuggestedModifier = "w";
5372 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005373 }
5374 }
5375 }
5376 }
5377
David Blaikie1cbb9712014-11-14 19:09:44 +00005378 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005379
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005380 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005381 if (RegNo == 0)
5382 return 0;
5383 if (RegNo == 1)
5384 return 1;
5385 return -1;
5386 }
5387};
5388
Tim Northover573cbee2014-05-24 12:52:07 +00005389const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005390 // 32-bit Integer registers
5391 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5392 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5393 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5394
5395 // 64-bit Integer registers
5396 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5397 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5398 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5399
5400 // 32-bit floating point regsisters
5401 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5402 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5403 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5404
5405 // 64-bit floating point regsisters
5406 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5407 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5408 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5409
5410 // Vector registers
5411 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5412 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5413 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5414};
5415
Tim Northover573cbee2014-05-24 12:52:07 +00005416void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005417 unsigned &NumNames) const {
5418 Names = GCCRegNames;
5419 NumNames = llvm::array_lengthof(GCCRegNames);
5420}
5421
Tim Northover573cbee2014-05-24 12:52:07 +00005422const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005423 { { "w31" }, "wsp" },
5424 { { "x29" }, "fp" },
5425 { { "x30" }, "lr" },
5426 { { "x31" }, "sp" },
5427 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5428 // don't want to substitute one of these for a different-sized one.
5429};
5430
Tim Northover573cbee2014-05-24 12:52:07 +00005431void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005432 unsigned &NumAliases) const {
5433 Aliases = GCCRegAliases;
5434 NumAliases = llvm::array_lengthof(GCCRegAliases);
5435}
5436
Tim Northover573cbee2014-05-24 12:52:07 +00005437const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005438#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005439 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005440#include "clang/Basic/BuiltinsNEON.def"
5441
5442#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005443 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005444#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005445};
James Molloy5e73df52014-04-16 15:06:20 +00005446
Tim Northover573cbee2014-05-24 12:52:07 +00005447class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005448 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005449 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005450 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005451 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005452 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005453 }
5454
5455public:
Tim Northover573cbee2014-05-24 12:52:07 +00005456 AArch64leTargetInfo(const llvm::Triple &Triple)
5457 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005458 BigEndian = false;
5459 }
5460 void getTargetDefines(const LangOptions &Opts,
5461 MacroBuilder &Builder) const override {
5462 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005463 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005464 }
5465};
5466
Tim Northover573cbee2014-05-24 12:52:07 +00005467class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005468 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005469 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005470 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005471 }
5472
5473public:
Tim Northover573cbee2014-05-24 12:52:07 +00005474 AArch64beTargetInfo(const llvm::Triple &Triple)
5475 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005476 void getTargetDefines(const LangOptions &Opts,
5477 MacroBuilder &Builder) const override {
5478 Builder.defineMacro("__AARCH64EB__");
5479 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5480 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005481 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005482 }
5483};
Tim Northovera2ee4332014-03-29 15:09:45 +00005484
Tim Northover573cbee2014-05-24 12:52:07 +00005485class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005486protected:
5487 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5488 MacroBuilder &Builder) const override {
5489 Builder.defineMacro("__AARCH64_SIMD__");
5490 Builder.defineMacro("__ARM64_ARCH_8__");
5491 Builder.defineMacro("__ARM_NEON__");
5492 Builder.defineMacro("__LITTLE_ENDIAN__");
5493 Builder.defineMacro("__REGISTER_PREFIX__", "");
5494 Builder.defineMacro("__arm64", "1");
5495 Builder.defineMacro("__arm64__", "1");
5496
5497 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5498 }
5499
Tim Northovera2ee4332014-03-29 15:09:45 +00005500public:
Tim Northover573cbee2014-05-24 12:52:07 +00005501 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5502 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005503 Int64Type = SignedLongLong;
5504 WCharType = SignedInt;
5505 UseSignedCharForObjCBool = false;
5506
Tim Northovera6a19f12015-02-06 01:25:07 +00005507 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005508 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5509
5510 TheCXXABI.set(TargetCXXABI::iOS64);
5511 }
5512
David Blaikie1cbb9712014-11-14 19:09:44 +00005513 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005514 return TargetInfo::CharPtrBuiltinVaList;
5515 }
5516};
Tim Northovera2ee4332014-03-29 15:09:45 +00005517
Tony Linthicum76329bf2011-12-12 21:14:55 +00005518// Hexagon abstract base class
5519class HexagonTargetInfo : public TargetInfo {
5520 static const Builtin::Info BuiltinInfo[];
5521 static const char * const GCCRegNames[];
5522 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5523 std::string CPU;
5524public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005525 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005526 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00005527 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005528
5529 // {} in inline assembly are packet specifiers, not assembly variant
5530 // specifiers.
5531 NoAsmVariants = true;
5532 }
5533
Craig Topper3164f332014-03-11 03:39:26 +00005534 void getTargetBuiltins(const Builtin::Info *&Records,
5535 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005536 Records = BuiltinInfo;
5537 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5538 }
5539
Craig Topper3164f332014-03-11 03:39:26 +00005540 bool validateAsmConstraint(const char *&Name,
5541 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005542 return true;
5543 }
5544
Craig Topper3164f332014-03-11 03:39:26 +00005545 void getTargetDefines(const LangOptions &Opts,
5546 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005547
Craig Topper3164f332014-03-11 03:39:26 +00005548 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005549 return Feature == "hexagon";
5550 }
Craig Topper3164f332014-03-11 03:39:26 +00005551
5552 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005553 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005554 }
Craig Topper3164f332014-03-11 03:39:26 +00005555 void getGCCRegNames(const char * const *&Names,
5556 unsigned &NumNames) const override;
5557 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5558 unsigned &NumAliases) const override;
5559 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005560 return "";
5561 }
Sebastian Pop86500282012-01-13 20:37:10 +00005562
5563 static const char *getHexagonCPUSuffix(StringRef Name) {
5564 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005565 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005566 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005567 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005568 }
5569
Craig Topper3164f332014-03-11 03:39:26 +00005570 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005571 if (!getHexagonCPUSuffix(Name))
5572 return false;
5573
Tony Linthicum76329bf2011-12-12 21:14:55 +00005574 CPU = Name;
5575 return true;
5576 }
5577};
5578
5579void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5580 MacroBuilder &Builder) const {
5581 Builder.defineMacro("qdsp6");
5582 Builder.defineMacro("__qdsp6", "1");
5583 Builder.defineMacro("__qdsp6__", "1");
5584
5585 Builder.defineMacro("hexagon");
5586 Builder.defineMacro("__hexagon", "1");
5587 Builder.defineMacro("__hexagon__", "1");
5588
5589 if(CPU == "hexagonv1") {
5590 Builder.defineMacro("__HEXAGON_V1__");
5591 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5592 if(Opts.HexagonQdsp6Compat) {
5593 Builder.defineMacro("__QDSP6_V1__");
5594 Builder.defineMacro("__QDSP6_ARCH__", "1");
5595 }
5596 }
5597 else if(CPU == "hexagonv2") {
5598 Builder.defineMacro("__HEXAGON_V2__");
5599 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5600 if(Opts.HexagonQdsp6Compat) {
5601 Builder.defineMacro("__QDSP6_V2__");
5602 Builder.defineMacro("__QDSP6_ARCH__", "2");
5603 }
5604 }
5605 else if(CPU == "hexagonv3") {
5606 Builder.defineMacro("__HEXAGON_V3__");
5607 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5608 if(Opts.HexagonQdsp6Compat) {
5609 Builder.defineMacro("__QDSP6_V3__");
5610 Builder.defineMacro("__QDSP6_ARCH__", "3");
5611 }
5612 }
5613 else if(CPU == "hexagonv4") {
5614 Builder.defineMacro("__HEXAGON_V4__");
5615 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5616 if(Opts.HexagonQdsp6Compat) {
5617 Builder.defineMacro("__QDSP6_V4__");
5618 Builder.defineMacro("__QDSP6_ARCH__", "4");
5619 }
5620 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005621 else if(CPU == "hexagonv5") {
5622 Builder.defineMacro("__HEXAGON_V5__");
5623 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5624 if(Opts.HexagonQdsp6Compat) {
5625 Builder.defineMacro("__QDSP6_V5__");
5626 Builder.defineMacro("__QDSP6_ARCH__", "5");
5627 }
5628 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005629}
5630
5631const char * const HexagonTargetInfo::GCCRegNames[] = {
5632 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5633 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5634 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5635 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5636 "p0", "p1", "p2", "p3",
5637 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5638};
5639
5640void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5641 unsigned &NumNames) const {
5642 Names = GCCRegNames;
5643 NumNames = llvm::array_lengthof(GCCRegNames);
5644}
5645
5646
5647const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5648 { { "sp" }, "r29" },
5649 { { "fp" }, "r30" },
5650 { { "lr" }, "r31" },
5651 };
5652
5653void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5654 unsigned &NumAliases) const {
5655 Aliases = GCCRegAliases;
5656 NumAliases = llvm::array_lengthof(GCCRegAliases);
5657}
5658
5659
5660const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005661#define BUILTIN(ID, TYPE, ATTRS) \
5662 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5663#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5664 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005665#include "clang/Basic/BuiltinsHexagon.def"
5666};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005667
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005668// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5669class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005670 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5671 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005672 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005673public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005674 SparcTargetInfo(const llvm::Triple &Triple)
5675 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005676
Craig Topper3164f332014-03-11 03:39:26 +00005677 bool handleTargetFeatures(std::vector<std::string> &Features,
5678 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005679 // The backend doesn't actually handle soft float yet, but in case someone
5680 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005681 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5682 if (Feature != Features.end()) {
5683 SoftFloat = true;
5684 Features.erase(Feature);
5685 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005686 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005687 }
Craig Topper3164f332014-03-11 03:39:26 +00005688 void getTargetDefines(const LangOptions &Opts,
5689 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005690 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005691 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005692
5693 if (SoftFloat)
5694 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005695 }
Craig Topper3164f332014-03-11 03:39:26 +00005696
5697 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005698 return llvm::StringSwitch<bool>(Feature)
5699 .Case("softfloat", SoftFloat)
5700 .Case("sparc", true)
5701 .Default(false);
5702 }
Craig Topper3164f332014-03-11 03:39:26 +00005703
5704 void getTargetBuiltins(const Builtin::Info *&Records,
5705 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005706 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005707 }
Craig Topper3164f332014-03-11 03:39:26 +00005708 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005709 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005710 }
Craig Topper3164f332014-03-11 03:39:26 +00005711 void getGCCRegNames(const char * const *&Names,
5712 unsigned &NumNames) const override;
5713 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5714 unsigned &NumAliases) const override;
5715 bool validateAsmConstraint(const char *&Name,
5716 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005717 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005718 switch (*Name) {
5719 case 'I': // Signed 13-bit constant
5720 case 'J': // Zero
5721 case 'K': // 32-bit constant with the low 12 bits clear
5722 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5723 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5724 case 'N': // Same as 'K' but zext (required for SIMode)
5725 case 'O': // The constant 4096
5726 return true;
5727 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005728 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005729 }
Craig Topper3164f332014-03-11 03:39:26 +00005730 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005731 // FIXME: Implement!
5732 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005733 }
5734};
5735
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005736const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005737 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5738 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5739 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5740 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5741};
5742
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005743void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5744 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005745 Names = GCCRegNames;
5746 NumNames = llvm::array_lengthof(GCCRegNames);
5747}
5748
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005749const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005750 { { "g0" }, "r0" },
5751 { { "g1" }, "r1" },
5752 { { "g2" }, "r2" },
5753 { { "g3" }, "r3" },
5754 { { "g4" }, "r4" },
5755 { { "g5" }, "r5" },
5756 { { "g6" }, "r6" },
5757 { { "g7" }, "r7" },
5758 { { "o0" }, "r8" },
5759 { { "o1" }, "r9" },
5760 { { "o2" }, "r10" },
5761 { { "o3" }, "r11" },
5762 { { "o4" }, "r12" },
5763 { { "o5" }, "r13" },
5764 { { "o6", "sp" }, "r14" },
5765 { { "o7" }, "r15" },
5766 { { "l0" }, "r16" },
5767 { { "l1" }, "r17" },
5768 { { "l2" }, "r18" },
5769 { { "l3" }, "r19" },
5770 { { "l4" }, "r20" },
5771 { { "l5" }, "r21" },
5772 { { "l6" }, "r22" },
5773 { { "l7" }, "r23" },
5774 { { "i0" }, "r24" },
5775 { { "i1" }, "r25" },
5776 { { "i2" }, "r26" },
5777 { { "i3" }, "r27" },
5778 { { "i4" }, "r28" },
5779 { { "i5" }, "r29" },
5780 { { "i6", "fp" }, "r30" },
5781 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005782};
5783
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005784void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5785 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005786 Aliases = GCCRegAliases;
5787 NumAliases = llvm::array_lengthof(GCCRegAliases);
5788}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005789
5790// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5791class SparcV8TargetInfo : public SparcTargetInfo {
5792public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005793 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005794 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00005795 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
5796 switch (getTriple().getOS()) {
5797 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00005798 SizeType = UnsignedInt;
5799 IntPtrType = SignedInt;
5800 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00005801 break;
5802 case llvm::Triple::NetBSD:
5803 case llvm::Triple::OpenBSD:
5804 SizeType = UnsignedLong;
5805 IntPtrType = SignedLong;
5806 PtrDiffType = SignedLong;
5807 break;
Brad Smith56495d52015-08-13 22:00:53 +00005808 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005809 }
5810
Craig Topper3164f332014-03-11 03:39:26 +00005811 void getTargetDefines(const LangOptions &Opts,
5812 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005813 SparcTargetInfo::getTargetDefines(Opts, Builder);
5814 Builder.defineMacro("__sparcv8");
5815 }
5816};
5817
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005818// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5819class SparcV8elTargetInfo : public SparcV8TargetInfo {
5820 public:
5821 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005822 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005823 BigEndian = false;
5824 }
5825};
5826
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005827// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5828class SparcV9TargetInfo : public SparcTargetInfo {
5829public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005830 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005831 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00005832 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005833 // This is an LP64 platform.
5834 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005835
5836 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005837 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005838 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005839 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005840 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005841 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005842
5843 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5844 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5845 LongDoubleWidth = 128;
5846 LongDoubleAlign = 128;
5847 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005848 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005849 }
5850
Craig Topper3164f332014-03-11 03:39:26 +00005851 void getTargetDefines(const LangOptions &Opts,
5852 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005853 SparcTargetInfo::getTargetDefines(Opts, Builder);
5854 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005855 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005856 // Solaris doesn't need these variants, but the BSDs do.
5857 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005858 Builder.defineMacro("__sparc64__");
5859 Builder.defineMacro("__sparc_v9__");
5860 Builder.defineMacro("__sparcv9__");
5861 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005862 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005863
Craig Topper3164f332014-03-11 03:39:26 +00005864 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005865 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5866 .Case("v9", true)
5867 .Case("ultrasparc", true)
5868 .Case("ultrasparc3", true)
5869 .Case("niagara", true)
5870 .Case("niagara2", true)
5871 .Case("niagara3", true)
5872 .Case("niagara4", true)
5873 .Default(false);
5874
5875 // No need to store the CPU yet. There aren't any CPU-specific
5876 // macros to define.
5877 return CPUKnown;
5878 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005879};
5880
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005881class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005882 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005883 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005884 std::string CPU;
5885 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005886 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005887
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005888public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005889 SystemZTargetInfo(const llvm::Triple &Triple)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005890 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005891 IntMaxType = SignedLong;
5892 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005893 TLSSupported = true;
5894 IntWidth = IntAlign = 32;
5895 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5896 PointerWidth = PointerAlign = 64;
5897 LongDoubleWidth = 128;
5898 LongDoubleAlign = 64;
5899 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005900 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005901 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00005902 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 +00005903 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5904 }
5905 void getTargetDefines(const LangOptions &Opts,
5906 MacroBuilder &Builder) const override {
5907 Builder.defineMacro("__s390__");
5908 Builder.defineMacro("__s390x__");
5909 Builder.defineMacro("__zarch__");
5910 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005911 if (HasTransactionalExecution)
5912 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005913 if (Opts.ZVector)
5914 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005915 }
5916 void getTargetBuiltins(const Builtin::Info *&Records,
5917 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005918 Records = BuiltinInfo;
5919 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005920 }
5921
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005922 void getGCCRegNames(const char *const *&Names,
5923 unsigned &NumNames) const override;
5924 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5925 unsigned &NumAliases) const override {
5926 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005927 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005928 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005929 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005930 bool validateAsmConstraint(const char *&Name,
5931 TargetInfo::ConstraintInfo &info) const override;
5932 const char *getClobbers() const override {
5933 // FIXME: Is this really right?
5934 return "";
5935 }
5936 BuiltinVaListKind getBuiltinVaListKind() const override {
5937 return TargetInfo::SystemZBuiltinVaList;
5938 }
5939 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005940 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005941 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5942 .Case("z10", true)
5943 .Case("z196", true)
5944 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005945 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005946 .Default(false);
5947
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005948 return CPUKnown;
5949 }
Eric Christopheref1e2952015-08-28 02:13:58 +00005950 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
Eric Christophera8a14c32015-08-31 18:39:16 +00005951 StringRef CPU,
5952 std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005953 if (CPU == "zEC12")
5954 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005955 if (CPU == "z13") {
5956 Features["transactional-execution"] = true;
5957 Features["vector"] = true;
5958 }
Eric Christopher007b0a02015-08-28 22:32:01 +00005959 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005960 }
5961
5962 bool handleTargetFeatures(std::vector<std::string> &Features,
5963 DiagnosticsEngine &Diags) override {
5964 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00005965 for (const auto &Feature : Features) {
5966 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005967 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00005968 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005969 HasVector = true;
5970 }
5971 // If we use the vector ABI, vector types are 64-bit aligned.
5972 if (HasVector) {
5973 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005974 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5975 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005976 }
5977 return true;
5978 }
5979
5980 bool hasFeature(StringRef Feature) const override {
5981 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005982 .Case("systemz", true)
5983 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005984 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005985 .Default(false);
5986 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005987
5988 StringRef getABI() const override {
5989 if (HasVector)
5990 return "vector";
5991 return "";
5992 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00005993
5994 bool useFloat128ManglingForLongDouble() const override {
5995 return true;
5996 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005997};
5998
5999const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6000#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006001 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006002#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006003};
6004
6005const char *const SystemZTargetInfo::GCCRegNames[] = {
6006 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6007 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6008 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6009 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6010};
6011
6012void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
6013 unsigned &NumNames) const {
6014 Names = GCCRegNames;
6015 NumNames = llvm::array_lengthof(GCCRegNames);
6016}
6017
6018bool SystemZTargetInfo::
6019validateAsmConstraint(const char *&Name,
6020 TargetInfo::ConstraintInfo &Info) const {
6021 switch (*Name) {
6022 default:
6023 return false;
6024
6025 case 'a': // Address register
6026 case 'd': // Data register (equivalent to 'r')
6027 case 'f': // Floating-point register
6028 Info.setAllowsRegister();
6029 return true;
6030
6031 case 'I': // Unsigned 8-bit constant
6032 case 'J': // Unsigned 12-bit constant
6033 case 'K': // Signed 16-bit constant
6034 case 'L': // Signed 20-bit displacement (on all targets we support)
6035 case 'M': // 0x7fffffff
6036 return true;
6037
6038 case 'Q': // Memory with base and unsigned 12-bit displacement
6039 case 'R': // Likewise, plus an index
6040 case 'S': // Memory with base and signed 20-bit displacement
6041 case 'T': // Likewise, plus an index
6042 Info.setAllowsMemory();
6043 return true;
6044 }
6045}
Ulrich Weigand47445072013-05-06 16:26:41 +00006046
Eric Christopherc48497a2015-09-18 21:26:24 +00006047class MSP430TargetInfo : public TargetInfo {
6048 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006049
Eric Christopherc48497a2015-09-18 21:26:24 +00006050public:
6051 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6052 BigEndian = false;
6053 TLSSupported = false;
6054 IntWidth = 16;
6055 IntAlign = 16;
6056 LongWidth = 32;
6057 LongLongWidth = 64;
6058 LongAlign = LongLongAlign = 16;
6059 PointerWidth = 16;
6060 PointerAlign = 16;
6061 SuitableAlign = 16;
6062 SizeType = UnsignedInt;
6063 IntMaxType = SignedLongLong;
6064 IntPtrType = SignedInt;
6065 PtrDiffType = SignedInt;
6066 SigAtomicType = SignedLong;
6067 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006068 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006069 void getTargetDefines(const LangOptions &Opts,
6070 MacroBuilder &Builder) const override {
6071 Builder.defineMacro("MSP430");
6072 Builder.defineMacro("__MSP430__");
6073 // FIXME: defines for different 'flavours' of MCU
6074 }
6075 void getTargetBuiltins(const Builtin::Info *&Records,
6076 unsigned &NumRecords) const override {
6077 // FIXME: Implement.
6078 Records = nullptr;
6079 NumRecords = 0;
6080 }
6081 bool hasFeature(StringRef Feature) const override {
6082 return Feature == "msp430";
6083 }
6084 void getGCCRegNames(const char *const *&Names,
6085 unsigned &NumNames) const override;
6086 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6087 unsigned &NumAliases) const override {
6088 // No aliases.
6089 Aliases = nullptr;
6090 NumAliases = 0;
6091 }
6092 bool validateAsmConstraint(const char *&Name,
6093 TargetInfo::ConstraintInfo &info) const override {
6094 // FIXME: implement
6095 switch (*Name) {
6096 case 'K': // the constant 1
6097 case 'L': // constant -1^20 .. 1^19
6098 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006099 return true;
6100 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006101 // No target constraints for now.
6102 return false;
6103 }
6104 const char *getClobbers() const override {
6105 // FIXME: Is this really right?
6106 return "";
6107 }
6108 BuiltinVaListKind getBuiltinVaListKind() const override {
6109 // FIXME: implement
6110 return TargetInfo::CharPtrBuiltinVaList;
6111 }
6112};
6113
6114const char *const MSP430TargetInfo::GCCRegNames[] = {
6115 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6116 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6117
6118void MSP430TargetInfo::getGCCRegNames(const char *const *&Names,
6119 unsigned &NumNames) const {
6120 Names = GCCRegNames;
6121 NumNames = llvm::array_lengthof(GCCRegNames);
6122}
6123
6124// LLVM and Clang cannot be used directly to output native binaries for
6125// target, but is used to compile C code to llvm bitcode with correct
6126// type and alignment information.
6127//
6128// TCE uses the llvm bitcode as input and uses it for generating customized
6129// target processor and program binary. TCE co-design environment is
6130// publicly available in http://tce.cs.tut.fi
6131
6132static const unsigned TCEOpenCLAddrSpaceMap[] = {
6133 3, // opencl_global
6134 4, // opencl_local
6135 5, // opencl_constant
6136 // FIXME: generic has to be added to the target
6137 0, // opencl_generic
6138 0, // cuda_device
6139 0, // cuda_constant
6140 0 // cuda_shared
6141};
6142
6143class TCETargetInfo : public TargetInfo {
6144public:
6145 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6146 TLSSupported = false;
6147 IntWidth = 32;
6148 LongWidth = LongLongWidth = 32;
6149 PointerWidth = 32;
6150 IntAlign = 32;
6151 LongAlign = LongLongAlign = 32;
6152 PointerAlign = 32;
6153 SuitableAlign = 32;
6154 SizeType = UnsignedInt;
6155 IntMaxType = SignedLong;
6156 IntPtrType = SignedInt;
6157 PtrDiffType = SignedInt;
6158 FloatWidth = 32;
6159 FloatAlign = 32;
6160 DoubleWidth = 32;
6161 DoubleAlign = 32;
6162 LongDoubleWidth = 32;
6163 LongDoubleAlign = 32;
6164 FloatFormat = &llvm::APFloat::IEEEsingle;
6165 DoubleFormat = &llvm::APFloat::IEEEsingle;
6166 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6167 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6168 "-f64:32-v64:32-v128:32-a:0:32-n32";
6169 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6170 UseAddrSpaceMapMangling = true;
6171 }
6172
6173 void getTargetDefines(const LangOptions &Opts,
6174 MacroBuilder &Builder) const override {
6175 DefineStd(Builder, "tce", Opts);
6176 Builder.defineMacro("__TCE__");
6177 Builder.defineMacro("__TCE_V1__");
6178 }
6179 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6180
6181 void getTargetBuiltins(const Builtin::Info *&Records,
6182 unsigned &NumRecords) const override {}
6183 const char *getClobbers() const override { return ""; }
6184 BuiltinVaListKind getBuiltinVaListKind() const override {
6185 return TargetInfo::VoidPtrBuiltinVaList;
6186 }
6187 void getGCCRegNames(const char *const *&Names,
6188 unsigned &NumNames) const override {}
6189 bool validateAsmConstraint(const char *&Name,
6190 TargetInfo::ConstraintInfo &info) const override {
6191 return true;
6192 }
6193 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6194 unsigned &NumAliases) const override {}
6195};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006196
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006197class BPFTargetInfo : public TargetInfo {
6198public:
6199 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6200 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6201 SizeType = UnsignedLong;
6202 PtrDiffType = SignedLong;
6203 IntPtrType = SignedLong;
6204 IntMaxType = SignedLong;
6205 Int64Type = SignedLong;
6206 RegParmMax = 5;
6207 if (Triple.getArch() == llvm::Triple::bpfeb) {
6208 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006209 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006210 } else {
6211 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006212 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006213 }
6214 MaxAtomicPromoteWidth = 64;
6215 MaxAtomicInlineWidth = 64;
6216 TLSSupported = false;
6217 }
6218 void getTargetDefines(const LangOptions &Opts,
6219 MacroBuilder &Builder) const override {
6220 DefineStd(Builder, "bpf", Opts);
6221 Builder.defineMacro("__BPF__");
6222 }
6223 bool hasFeature(StringRef Feature) const override {
6224 return Feature == "bpf";
6225 }
6226
6227 void getTargetBuiltins(const Builtin::Info *&Records,
6228 unsigned &NumRecords) const override {}
6229 const char *getClobbers() const override {
6230 return "";
6231 }
6232 BuiltinVaListKind getBuiltinVaListKind() const override {
6233 return TargetInfo::VoidPtrBuiltinVaList;
6234 }
6235 void getGCCRegNames(const char * const *&Names,
6236 unsigned &NumNames) const override {
6237 Names = nullptr;
6238 NumNames = 0;
6239 }
6240 bool validateAsmConstraint(const char *&Name,
6241 TargetInfo::ConstraintInfo &info) const override {
6242 return true;
6243 }
6244 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6245 unsigned &NumAliases) const override {
6246 Aliases = nullptr;
6247 NumAliases = 0;
6248 }
6249};
6250
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006251class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006252 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006253
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006254 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006255 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006256 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006257 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006258 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006259 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006260 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006261 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006262 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006263 enum DspRevEnum {
6264 NoDSP, DSP1, DSP2
6265 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006266 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006267
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006268protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006269 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006270 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006271
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006272public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006273 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6274 const std::string &CPUStr)
6275 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006276 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006277 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6278 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6279 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006280
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006281 bool isNaN2008Default() const {
6282 return CPU == "mips32r6" || CPU == "mips64r6";
6283 }
6284
6285 bool isFP64Default() const {
6286 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6287 }
6288
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006289 bool isNan2008() const override {
6290 return IsNan2008;
6291 }
6292
Alp Toker4925ba72014-06-07 23:30:42 +00006293 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006294 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006295 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6296 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006297 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006298 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006299 .Case("mips1", IsMips32)
6300 .Case("mips2", IsMips32)
6301 .Case("mips3", true)
6302 .Case("mips4", true)
6303 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006304 .Case("mips32", IsMips32)
6305 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006306 .Case("mips32r3", IsMips32)
6307 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006308 .Case("mips32r6", IsMips32)
6309 .Case("mips64", true)
6310 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006311 .Case("mips64r3", true)
6312 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006313 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006314 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006315 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006316 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006317 const std::string& getCPU() const { return CPU; }
Eric Christopheref1e2952015-08-28 02:13:58 +00006318 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
Eric Christophera8a14c32015-08-31 18:39:16 +00006319 StringRef CPU,
6320 std::vector<std::string> &FeaturesVec) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006321 if (CPU == "octeon")
6322 Features["mips64r2"] = Features["cnmips"] = true;
6323 else
6324 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006325 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006326 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006327
Craig Topper3164f332014-03-11 03:39:26 +00006328 void getTargetDefines(const LangOptions &Opts,
6329 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006330 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006331 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006332 if (Opts.GNUMode)
6333 Builder.defineMacro("mips");
6334
Simon Atanasyan683535b2012-08-29 19:14:58 +00006335 Builder.defineMacro("__REGISTER_PREFIX__", "");
6336
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006337 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006338 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006339 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006340 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006341 case SoftFloat:
6342 Builder.defineMacro("__mips_soft_float", Twine(1));
6343 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006344 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006345
Simon Atanasyan16071912013-04-14 14:07:30 +00006346 if (IsSingleFloat)
6347 Builder.defineMacro("__mips_single_float", Twine(1));
6348
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006349 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6350 Builder.defineMacro("_MIPS_FPSET",
6351 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6352
Simon Atanasyan72244b62012-07-05 16:06:06 +00006353 if (IsMips16)
6354 Builder.defineMacro("__mips16", Twine(1));
6355
Simon Atanasyan60777612013-04-14 14:07:51 +00006356 if (IsMicromips)
6357 Builder.defineMacro("__mips_micromips", Twine(1));
6358
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006359 if (IsNan2008)
6360 Builder.defineMacro("__mips_nan2008", Twine(1));
6361
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006362 switch (DspRev) {
6363 default:
6364 break;
6365 case DSP1:
6366 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6367 Builder.defineMacro("__mips_dsp", Twine(1));
6368 break;
6369 case DSP2:
6370 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6371 Builder.defineMacro("__mips_dspr2", Twine(1));
6372 Builder.defineMacro("__mips_dsp", Twine(1));
6373 break;
6374 }
6375
Jack Carter44ff1e52013-08-12 17:20:29 +00006376 if (HasMSA)
6377 Builder.defineMacro("__mips_msa", Twine(1));
6378
Simon Atanasyan26f19672012-04-05 19:28:31 +00006379 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6380 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6381 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006382
6383 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6384 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006385 }
6386
Craig Topper3164f332014-03-11 03:39:26 +00006387 void getTargetBuiltins(const Builtin::Info *&Records,
6388 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006389 Records = BuiltinInfo;
6390 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006391 }
Craig Topper3164f332014-03-11 03:39:26 +00006392 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006393 return llvm::StringSwitch<bool>(Feature)
6394 .Case("mips", true)
6395 .Case("fp64", HasFP64)
6396 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006397 }
Craig Topper3164f332014-03-11 03:39:26 +00006398 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006399 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006400 }
Craig Topper3164f332014-03-11 03:39:26 +00006401 void getGCCRegNames(const char * const *&Names,
6402 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006403 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006404 // CPU register names
6405 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006406 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6407 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6408 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006409 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6410 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006411 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6412 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6413 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6414 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006415 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006416 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006417 "$fcc5","$fcc6","$fcc7",
6418 // MSA register names
6419 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6420 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6421 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6422 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6423 // MSA control register names
6424 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6425 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006426 };
6427 Names = GCCRegNames;
6428 NumNames = llvm::array_lengthof(GCCRegNames);
6429 }
Craig Topper3164f332014-03-11 03:39:26 +00006430 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6431 unsigned &NumAliases) const override = 0;
6432 bool validateAsmConstraint(const char *&Name,
6433 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006434 switch (*Name) {
6435 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006436 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006437 case 'r': // CPU registers.
6438 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006439 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006440 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006441 case 'c': // $25 for indirect jumps
6442 case 'l': // lo register
6443 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006444 Info.setAllowsRegister();
6445 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006446 case 'I': // Signed 16-bit constant
6447 case 'J': // Integer 0
6448 case 'K': // Unsigned 16-bit constant
6449 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6450 case 'M': // Constants not loadable via lui, addiu, or ori
6451 case 'N': // Constant -1 to -65535
6452 case 'O': // A signed 15-bit constant
6453 case 'P': // A constant between 1 go 65535
6454 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006455 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006456 Info.setAllowsMemory();
6457 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006458 case 'Z':
6459 if (Name[1] == 'C') { // An address usable by ll, and sc.
6460 Info.setAllowsMemory();
6461 Name++; // Skip over 'Z'.
6462 return true;
6463 }
6464 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006465 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006466 }
6467
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006468 std::string convertConstraint(const char *&Constraint) const override {
6469 std::string R;
6470 switch (*Constraint) {
6471 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6472 if (Constraint[1] == 'C') {
6473 R = std::string("^") + std::string(Constraint, 2);
6474 Constraint++;
6475 return R;
6476 }
6477 break;
6478 }
6479 return TargetInfo::convertConstraint(Constraint);
6480 }
6481
Craig Topper3164f332014-03-11 03:39:26 +00006482 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006483 // In GCC, $1 is not widely used in generated code (it's used only in a few
6484 // specific situations), so there is no real need for users to add it to
6485 // the clobbers list if they want to use it in their inline assembly code.
6486 //
6487 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6488 // code generation, so using it in inline assembly without adding it to the
6489 // clobbers list can cause conflicts between the inline assembly code and
6490 // the surrounding generated code.
6491 //
6492 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6493 // operands, which will conflict with the ".set at" assembler option (which
6494 // we use only for inline assembly, in order to maintain compatibility with
6495 // GCC) and will also conflict with the user's usage of $1.
6496 //
6497 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6498 // register for generated code is to automatically clobber $1 for all inline
6499 // assembly code.
6500 //
6501 // FIXME: We should automatically clobber $1 only for inline assembly code
6502 // which actually uses it. This would allow LLVM to use $1 for inline
6503 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006504 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006505 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006506
Craig Topper3164f332014-03-11 03:39:26 +00006507 bool handleTargetFeatures(std::vector<std::string> &Features,
6508 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006509 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006510 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006511 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006512 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006513 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006514 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006515 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006516
Eric Christopher610fe112015-08-26 08:21:55 +00006517 for (const auto &Feature : Features) {
6518 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006519 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006520 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006521 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006522 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006523 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006524 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006525 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006526 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006527 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006528 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006529 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006530 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006531 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006532 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006533 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006534 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006535 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006536 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006537 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006538 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006539 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006540 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006541
Eric Christopher964a5f32015-08-05 23:48:05 +00006542 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006543
Rafael Espindolaeb265472013-08-21 21:59:03 +00006544 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006545 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006546
Craig Topper3164f332014-03-11 03:39:26 +00006547 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006548 if (RegNo == 0) return 4;
6549 if (RegNo == 1) return 5;
6550 return -1;
6551 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006552
6553 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006554};
6555
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006556const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006557#define BUILTIN(ID, TYPE, ATTRS) \
6558 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6559#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6560 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006561#include "clang/Basic/BuiltinsMips.def"
6562};
6563
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006564class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006565public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006566 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006567 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006568 SizeType = UnsignedInt;
6569 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006570 Int64Type = SignedLongLong;
6571 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006572 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006573 }
Craig Topper3164f332014-03-11 03:39:26 +00006574 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006575 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006576 ABI = Name;
6577 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006578 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006579 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006580 }
Craig Topper3164f332014-03-11 03:39:26 +00006581 void getTargetDefines(const LangOptions &Opts,
6582 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006583 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006584
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006585 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006586 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6587
6588 const std::string& CPUStr = getCPU();
6589 if (CPUStr == "mips32")
6590 Builder.defineMacro("__mips_isa_rev", "1");
6591 else if (CPUStr == "mips32r2")
6592 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006593 else if (CPUStr == "mips32r3")
6594 Builder.defineMacro("__mips_isa_rev", "3");
6595 else if (CPUStr == "mips32r5")
6596 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006597 else if (CPUStr == "mips32r6")
6598 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006599
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006600 if (ABI == "o32") {
6601 Builder.defineMacro("__mips_o32");
6602 Builder.defineMacro("_ABIO32", "1");
6603 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6604 }
6605 else if (ABI == "eabi")
6606 Builder.defineMacro("__mips_eabi");
6607 else
David Blaikie83d382b2011-09-23 05:06:16 +00006608 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006609 }
Craig Topper3164f332014-03-11 03:39:26 +00006610 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6611 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006612 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6613 { { "at" }, "$1" },
6614 { { "v0" }, "$2" },
6615 { { "v1" }, "$3" },
6616 { { "a0" }, "$4" },
6617 { { "a1" }, "$5" },
6618 { { "a2" }, "$6" },
6619 { { "a3" }, "$7" },
6620 { { "t0" }, "$8" },
6621 { { "t1" }, "$9" },
6622 { { "t2" }, "$10" },
6623 { { "t3" }, "$11" },
6624 { { "t4" }, "$12" },
6625 { { "t5" }, "$13" },
6626 { { "t6" }, "$14" },
6627 { { "t7" }, "$15" },
6628 { { "s0" }, "$16" },
6629 { { "s1" }, "$17" },
6630 { { "s2" }, "$18" },
6631 { { "s3" }, "$19" },
6632 { { "s4" }, "$20" },
6633 { { "s5" }, "$21" },
6634 { { "s6" }, "$22" },
6635 { { "s7" }, "$23" },
6636 { { "t8" }, "$24" },
6637 { { "t9" }, "$25" },
6638 { { "k0" }, "$26" },
6639 { { "k1" }, "$27" },
6640 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006641 { { "sp","$sp" }, "$29" },
6642 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006643 { { "ra" }, "$31" }
6644 };
6645 Aliases = GCCRegAliases;
6646 NumAliases = llvm::array_lengthof(GCCRegAliases);
6647 }
6648};
6649
6650class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006651 void setDataLayoutString() override {
6652 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006653 }
6654
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006655public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006656 Mips32EBTargetInfo(const llvm::Triple &Triple)
6657 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006658 }
Craig Topper3164f332014-03-11 03:39:26 +00006659 void getTargetDefines(const LangOptions &Opts,
6660 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006661 DefineStd(Builder, "MIPSEB", Opts);
6662 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006663 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006664 }
6665};
6666
6667class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006668 void setDataLayoutString() override {
6669 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006670 }
6671
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006672public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006673 Mips32ELTargetInfo(const llvm::Triple &Triple)
6674 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006675 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006676 }
Craig Topper3164f332014-03-11 03:39:26 +00006677 void getTargetDefines(const LangOptions &Opts,
6678 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006679 DefineStd(Builder, "MIPSEL", Opts);
6680 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006681 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006682 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006683};
Akira Hatanakabef17452011-09-20 19:21:49 +00006684
6685class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006686public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006687 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006688 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006689 LongDoubleWidth = LongDoubleAlign = 128;
6690 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006691 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6692 LongDoubleWidth = LongDoubleAlign = 64;
6693 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6694 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006695 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006696 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006697 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006698 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006699
6700 void setN64ABITypes() {
6701 LongWidth = LongAlign = 64;
6702 PointerWidth = PointerAlign = 64;
6703 SizeType = UnsignedLong;
6704 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006705 Int64Type = SignedLong;
6706 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006707 }
6708
6709 void setN32ABITypes() {
6710 LongWidth = LongAlign = 32;
6711 PointerWidth = PointerAlign = 32;
6712 SizeType = UnsignedInt;
6713 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006714 Int64Type = SignedLongLong;
6715 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006716 }
6717
Craig Topper3164f332014-03-11 03:39:26 +00006718 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006719 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006720 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006721 ABI = Name;
6722 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006723 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006724 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006725 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006726 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006727 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006728 }
6729 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006730 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006731
Craig Topper3164f332014-03-11 03:39:26 +00006732 void getTargetDefines(const LangOptions &Opts,
6733 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006734 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006735
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006736 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006737 Builder.defineMacro("__mips64");
6738 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006739 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6740
6741 const std::string& CPUStr = getCPU();
6742 if (CPUStr == "mips64")
6743 Builder.defineMacro("__mips_isa_rev", "1");
6744 else if (CPUStr == "mips64r2")
6745 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006746 else if (CPUStr == "mips64r3")
6747 Builder.defineMacro("__mips_isa_rev", "3");
6748 else if (CPUStr == "mips64r5")
6749 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006750 else if (CPUStr == "mips64r6")
6751 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006752
Akira Hatanakabef17452011-09-20 19:21:49 +00006753 if (ABI == "n32") {
6754 Builder.defineMacro("__mips_n32");
6755 Builder.defineMacro("_ABIN32", "2");
6756 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6757 }
6758 else if (ABI == "n64") {
6759 Builder.defineMacro("__mips_n64");
6760 Builder.defineMacro("_ABI64", "3");
6761 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6762 }
6763 else
David Blaikie83d382b2011-09-23 05:06:16 +00006764 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006765 }
Craig Topper3164f332014-03-11 03:39:26 +00006766 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6767 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006768 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6769 { { "at" }, "$1" },
6770 { { "v0" }, "$2" },
6771 { { "v1" }, "$3" },
6772 { { "a0" }, "$4" },
6773 { { "a1" }, "$5" },
6774 { { "a2" }, "$6" },
6775 { { "a3" }, "$7" },
6776 { { "a4" }, "$8" },
6777 { { "a5" }, "$9" },
6778 { { "a6" }, "$10" },
6779 { { "a7" }, "$11" },
6780 { { "t0" }, "$12" },
6781 { { "t1" }, "$13" },
6782 { { "t2" }, "$14" },
6783 { { "t3" }, "$15" },
6784 { { "s0" }, "$16" },
6785 { { "s1" }, "$17" },
6786 { { "s2" }, "$18" },
6787 { { "s3" }, "$19" },
6788 { { "s4" }, "$20" },
6789 { { "s5" }, "$21" },
6790 { { "s6" }, "$22" },
6791 { { "s7" }, "$23" },
6792 { { "t8" }, "$24" },
6793 { { "t9" }, "$25" },
6794 { { "k0" }, "$26" },
6795 { { "k1" }, "$27" },
6796 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006797 { { "sp","$sp" }, "$29" },
6798 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006799 { { "ra" }, "$31" }
6800 };
6801 Aliases = GCCRegAliases;
6802 NumAliases = llvm::array_lengthof(GCCRegAliases);
6803 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006804
6805 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006806};
6807
6808class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006809 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006810 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006811 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 +00006812 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006813 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006814
Akira Hatanakabef17452011-09-20 19:21:49 +00006815 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006816
Akira Hatanakabef17452011-09-20 19:21:49 +00006817public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006818 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006819 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006820 void getTargetDefines(const LangOptions &Opts,
6821 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006822 DefineStd(Builder, "MIPSEB", Opts);
6823 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006824 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006825 }
6826};
6827
6828class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006829 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006830 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006831 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 +00006832 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006833 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006834 }
6835public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006836 Mips64ELTargetInfo(const llvm::Triple &Triple)
6837 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006838 // Default ABI is n64.
6839 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006840 }
Craig Topper3164f332014-03-11 03:39:26 +00006841 void getTargetDefines(const LangOptions &Opts,
6842 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006843 DefineStd(Builder, "MIPSEL", Opts);
6844 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006845 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006846 }
6847};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006848
Ivan Krasindd7403e2011-08-24 20:22:22 +00006849class PNaClTargetInfo : public TargetInfo {
6850public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006851 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006852 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006853 this->UserLabelPrefix = "";
6854 this->LongAlign = 32;
6855 this->LongWidth = 32;
6856 this->PointerAlign = 32;
6857 this->PointerWidth = 32;
6858 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006859 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006860 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006861 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006862 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006863 this->SizeType = TargetInfo::UnsignedInt;
6864 this->PtrDiffType = TargetInfo::SignedInt;
6865 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006866 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006867 }
6868
Craig Toppere6f17d02014-03-11 04:07:52 +00006869 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006870 Builder.defineMacro("__le32__");
6871 Builder.defineMacro("__pnacl__");
6872 }
Craig Topper3164f332014-03-11 03:39:26 +00006873 void getTargetDefines(const LangOptions &Opts,
6874 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006875 getArchDefines(Opts, Builder);
6876 }
Craig Topper3164f332014-03-11 03:39:26 +00006877 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006878 return Feature == "pnacl";
6879 }
Craig Topper3164f332014-03-11 03:39:26 +00006880 void getTargetBuiltins(const Builtin::Info *&Records,
6881 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006882 }
Craig Topper3164f332014-03-11 03:39:26 +00006883 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006884 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006885 }
Craig Topper3164f332014-03-11 03:39:26 +00006886 void getGCCRegNames(const char * const *&Names,
6887 unsigned &NumNames) const override;
6888 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6889 unsigned &NumAliases) const override;
6890 bool validateAsmConstraint(const char *&Name,
6891 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006892 return false;
6893 }
6894
Craig Topper3164f332014-03-11 03:39:26 +00006895 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006896 return "";
6897 }
6898};
6899
6900void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6901 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006902 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006903 NumNames = 0;
6904}
6905
6906void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6907 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006908 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006909 NumAliases = 0;
6910}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006911
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006912// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6913class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6914public:
6915 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00006916 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006917 }
6918
6919 BuiltinVaListKind getBuiltinVaListKind() const override {
6920 return TargetInfo::PNaClABIBuiltinVaList;
6921 }
6922};
6923
JF Bastien643817d2014-09-12 17:52:47 +00006924class Le64TargetInfo : public TargetInfo {
6925 static const Builtin::Info BuiltinInfo[];
6926
6927public:
6928 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6929 BigEndian = false;
6930 NoAsmVariants = true;
6931 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6932 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006933 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006934 }
6935
6936 void getTargetDefines(const LangOptions &Opts,
6937 MacroBuilder &Builder) const override {
6938 DefineStd(Builder, "unix", Opts);
6939 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6940 Builder.defineMacro("__ELF__");
6941 }
6942 void getTargetBuiltins(const Builtin::Info *&Records,
6943 unsigned &NumRecords) const override {
6944 Records = BuiltinInfo;
6945 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6946 }
6947 BuiltinVaListKind getBuiltinVaListKind() const override {
6948 return TargetInfo::PNaClABIBuiltinVaList;
6949 }
6950 const char *getClobbers() const override { return ""; }
6951 void getGCCRegNames(const char *const *&Names,
6952 unsigned &NumNames) const override {
6953 Names = nullptr;
6954 NumNames = 0;
6955 }
6956 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6957 unsigned &NumAliases) const override {
6958 Aliases = nullptr;
6959 NumAliases = 0;
6960 }
6961 bool validateAsmConstraint(const char *&Name,
6962 TargetInfo::ConstraintInfo &Info) const override {
6963 return false;
6964 }
6965
6966 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006967};
Dan Gohmanc2853072015-09-03 22:51:53 +00006968
6969class WebAssemblyTargetInfo : public TargetInfo {
6970 static const Builtin::Info BuiltinInfo[];
6971
6972 enum SIMDEnum {
6973 NoSIMD,
6974 SIMD128,
6975 } SIMDLevel;
6976
6977public:
6978 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
6979 : TargetInfo(T), SIMDLevel(NoSIMD) {
6980 BigEndian = false;
6981 NoAsmVariants = true;
6982 SuitableAlign = 128;
6983 LargeArrayMinWidth = 128;
6984 LargeArrayAlign = 128;
6985 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00006986 SigAtomicType = SignedLong;
Dan Gohmanc2853072015-09-03 22:51:53 +00006987 }
6988
6989protected:
6990 void getTargetDefines(const LangOptions &Opts,
6991 MacroBuilder &Builder) const override {
6992 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
6993 if (SIMDLevel >= SIMD128)
6994 Builder.defineMacro("__wasm_simd128__");
6995 }
6996
6997private:
6998 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6999 StringRef CPU,
7000 std::vector<std::string> &FeaturesVec) const override {
7001 if (CPU == "bleeding-edge")
7002 Features["simd128"] = true;
7003 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7004 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007005 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007006 return llvm::StringSwitch<bool>(Feature)
7007 .Case("simd128", SIMDLevel >= SIMD128)
7008 .Default(false);
7009 }
7010 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007011 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007012 for (const auto &Feature : Features) {
7013 if (Feature == "+simd128") {
7014 SIMDLevel = std::max(SIMDLevel, SIMD128);
7015 continue;
7016 }
7017 if (Feature == "-simd128") {
7018 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7019 continue;
7020 }
7021
7022 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7023 << "-target-feature";
7024 return false;
7025 }
7026 return true;
7027 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007028 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007029 return llvm::StringSwitch<bool>(Name)
7030 .Case("mvp", true)
7031 .Case("bleeding-edge", true)
7032 .Case("generic", true)
7033 .Default(false);
7034 }
7035 void getTargetBuiltins(const Builtin::Info *&Records,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007036 unsigned &NumRecords) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007037 Records = BuiltinInfo;
7038 NumRecords = clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin;
7039 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007040 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007041 // TODO: Implement va_list properly.
7042 return VoidPtrBuiltinVaList;
7043 }
7044 void getGCCRegNames(const char *const *&Names,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007045 unsigned &NumNames) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007046 Names = nullptr;
7047 NumNames = 0;
7048 }
7049 void getGCCRegAliases(const GCCRegAlias *&Aliases,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007050 unsigned &NumAliases) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007051 Aliases = nullptr;
7052 NumAliases = 0;
7053 }
7054 bool
7055 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007056 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007057 return false;
7058 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007059 const char *getClobbers() const final { return ""; }
7060 bool isCLZForZeroUndef() const final { return false; }
7061 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007062 IntType getIntTypeByWidth(unsigned BitWidth,
7063 bool IsSigned) const final {
7064 // WebAssembly prefers long long for explicitly 64-bit integers.
7065 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7066 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7067 }
7068 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7069 bool IsSigned) const final {
7070 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7071 return BitWidth == 64
7072 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7073 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7074 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007075};
7076
7077const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7078#define BUILTIN(ID, TYPE, ATTRS) \
7079 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7080#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7081 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7082#include "clang/Basic/BuiltinsWebAssembly.def"
7083};
7084
7085class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7086public:
7087 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7088 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007089 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohmanc2853072015-09-03 22:51:53 +00007090 DataLayoutString = "e-p:32:32-i64:64-n32:64-S128";
7091 }
7092
7093protected:
7094 void getTargetDefines(const LangOptions &Opts,
7095 MacroBuilder &Builder) const override {
7096 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7097 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7098 }
7099};
7100
7101class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7102public:
7103 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7104 : WebAssemblyTargetInfo(T) {
7105 LongAlign = LongWidth = 64;
7106 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007107 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohmanc2853072015-09-03 22:51:53 +00007108 DataLayoutString = "e-p:64:64-i64:64-n32:64-S128";
7109 }
7110
7111protected:
7112 void getTargetDefines(const LangOptions &Opts,
7113 MacroBuilder &Builder) const override {
7114 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7115 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7116 }
7117};
7118
JF Bastien643817d2014-09-12 17:52:47 +00007119const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7120#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007121 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007122#include "clang/Basic/BuiltinsLe64.def"
7123};
7124
Eric Christopherc48497a2015-09-18 21:26:24 +00007125static const unsigned SPIRAddrSpaceMap[] = {
7126 1, // opencl_global
7127 3, // opencl_local
7128 2, // opencl_constant
7129 4, // opencl_generic
7130 0, // cuda_device
7131 0, // cuda_constant
7132 0 // cuda_shared
7133};
7134class SPIRTargetInfo : public TargetInfo {
7135public:
7136 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7137 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7138 "SPIR target must use unknown OS");
7139 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7140 "SPIR target must use unknown environment type");
7141 BigEndian = false;
7142 TLSSupported = false;
7143 LongWidth = LongAlign = 64;
7144 AddrSpaceMap = &SPIRAddrSpaceMap;
7145 UseAddrSpaceMapMangling = true;
7146 // Define available target features
7147 // These must be defined in sorted order!
7148 NoAsmVariants = true;
7149 }
7150 void getTargetDefines(const LangOptions &Opts,
7151 MacroBuilder &Builder) const override {
7152 DefineStd(Builder, "SPIR", Opts);
7153 }
7154 bool hasFeature(StringRef Feature) const override {
7155 return Feature == "spir";
7156 }
Craig Topper3164f332014-03-11 03:39:26 +00007157
Eric Christopherc48497a2015-09-18 21:26:24 +00007158 void getTargetBuiltins(const Builtin::Info *&Records,
7159 unsigned &NumRecords) const override {}
7160 const char *getClobbers() const override { return ""; }
7161 void getGCCRegNames(const char *const *&Names,
7162 unsigned &NumNames) const override {}
7163 bool validateAsmConstraint(const char *&Name,
7164 TargetInfo::ConstraintInfo &info) const override {
7165 return true;
7166 }
7167 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7168 unsigned &NumAliases) const override {}
7169 BuiltinVaListKind getBuiltinVaListKind() const override {
7170 return TargetInfo::VoidPtrBuiltinVaList;
7171 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007172
Eric Christopherc48497a2015-09-18 21:26:24 +00007173 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7174 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7175 : CCCR_Warning;
7176 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007177
Eric Christopherc48497a2015-09-18 21:26:24 +00007178 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7179 return CC_SpirFunction;
7180 }
7181};
Guy Benyeib798fc92012-12-11 21:38:14 +00007182
Eric Christopherc48497a2015-09-18 21:26:24 +00007183class SPIR32TargetInfo : public SPIRTargetInfo {
7184public:
7185 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7186 PointerWidth = PointerAlign = 32;
7187 SizeType = TargetInfo::UnsignedInt;
7188 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7189 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7190 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7191 }
7192 void getTargetDefines(const LangOptions &Opts,
7193 MacroBuilder &Builder) const override {
7194 DefineStd(Builder, "SPIR32", Opts);
7195 }
7196};
Guy Benyeib798fc92012-12-11 21:38:14 +00007197
Eric Christopherc48497a2015-09-18 21:26:24 +00007198class SPIR64TargetInfo : public SPIRTargetInfo {
7199public:
7200 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7201 PointerWidth = PointerAlign = 64;
7202 SizeType = TargetInfo::UnsignedLong;
7203 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7204 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7205 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7206 }
7207 void getTargetDefines(const LangOptions &Opts,
7208 MacroBuilder &Builder) const override {
7209 DefineStd(Builder, "SPIR64", Opts);
7210 }
7211};
Guy Benyeib798fc92012-12-11 21:38:14 +00007212
Robert Lytton0e076492013-08-13 09:43:10 +00007213class XCoreTargetInfo : public TargetInfo {
7214 static const Builtin::Info BuiltinInfo[];
7215public:
7216 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7217 BigEndian = false;
7218 NoAsmVariants = true;
7219 LongLongAlign = 32;
7220 SuitableAlign = 32;
7221 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007222 SizeType = UnsignedInt;
7223 PtrDiffType = SignedInt;
7224 IntPtrType = SignedInt;
7225 WCharType = UnsignedChar;
7226 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007227 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007228 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7229 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007230 }
Craig Topper3164f332014-03-11 03:39:26 +00007231 void getTargetDefines(const LangOptions &Opts,
7232 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007233 Builder.defineMacro("__XS1B__");
7234 }
Craig Topper3164f332014-03-11 03:39:26 +00007235 void getTargetBuiltins(const Builtin::Info *&Records,
7236 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007237 Records = BuiltinInfo;
7238 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
7239 }
Craig Topper3164f332014-03-11 03:39:26 +00007240 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007241 return TargetInfo::VoidPtrBuiltinVaList;
7242 }
Craig Topper3164f332014-03-11 03:39:26 +00007243 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007244 return "";
7245 }
Craig Topper3164f332014-03-11 03:39:26 +00007246 void getGCCRegNames(const char * const *&Names,
7247 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007248 static const char * const GCCRegNames[] = {
7249 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7250 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7251 };
7252 Names = GCCRegNames;
7253 NumNames = llvm::array_lengthof(GCCRegNames);
7254 }
Craig Topper3164f332014-03-11 03:39:26 +00007255 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7256 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00007257 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00007258 NumAliases = 0;
7259 }
Craig Topper3164f332014-03-11 03:39:26 +00007260 bool validateAsmConstraint(const char *&Name,
7261 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007262 return false;
7263 }
Craig Topper3164f332014-03-11 03:39:26 +00007264 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007265 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7266 return (RegNo < 2)? RegNo : -1;
7267 }
Robert Lytton0e076492013-08-13 09:43:10 +00007268};
7269
7270const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007271#define BUILTIN(ID, TYPE, ATTRS) \
7272 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7273#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7274 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007275#include "clang/Basic/BuiltinsXCore.def"
7276};
Robert Lytton0e076492013-08-13 09:43:10 +00007277
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007278// x86_32 Android target
7279class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7280public:
7281 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7282 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7283 SuitableAlign = 32;
7284 LongDoubleWidth = 64;
7285 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7286 }
7287};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007288
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007289// x86_64 Android target
7290class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7291public:
7292 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7293 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7294 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7295 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007296
7297 bool useFloat128ManglingForLongDouble() const override {
7298 return true;
7299 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007300};
7301} // end anonymous namespace
7302
Chris Lattner5ba61f02006-10-14 07:39:34 +00007303//===----------------------------------------------------------------------===//
7304// Driver code
7305//===----------------------------------------------------------------------===//
7306
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007307static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007308 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007309
Daniel Dunbar52322032009-08-18 05:47:58 +00007310 switch (Triple.getArch()) {
7311 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007312 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007313
Tim Northover2a0783d2014-05-30 14:14:07 +00007314 case llvm::Triple::xcore:
7315 return new XCoreTargetInfo(Triple);
7316
7317 case llvm::Triple::hexagon:
7318 return new HexagonTargetInfo(Triple);
7319
7320 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007321 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007322 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007323
7324 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007325 case llvm::Triple::FreeBSD:
7326 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007327 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007328 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007329 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007330 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007331 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007332 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007333 }
7334
Christian Pirker9b019ae2014-02-25 13:51:00 +00007335 case llvm::Triple::aarch64_be:
7336 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007337 case llvm::Triple::FreeBSD:
7338 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007339 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007340 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007341 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007342 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007343 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007344 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007345 }
7346
Daniel Dunbar52322032009-08-18 05:47:58 +00007347 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007348 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007349 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007350 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007351
Daniel Dunbar52322032009-08-18 05:47:58 +00007352 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007353 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007354 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007355 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007356 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007357 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007358 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007359 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007360 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007361 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007362 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007363 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007364 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007365 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007366 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007367 case llvm::Triple::Win32:
7368 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007369 case llvm::Triple::Cygnus:
7370 return new CygwinARMTargetInfo(Triple);
7371 case llvm::Triple::GNU:
7372 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007373 case llvm::Triple::Itanium:
7374 return new ItaniumWindowsARMleTargetInfo(Triple);
7375 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007376 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007377 return new MicrosoftARMleTargetInfo(Triple);
7378 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007379 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007380 return new ARMleTargetInfo(Triple);
7381 }
7382
7383 case llvm::Triple::armeb:
7384 case llvm::Triple::thumbeb:
7385 if (Triple.isOSDarwin())
7386 return new DarwinARMTargetInfo(Triple);
7387
7388 switch (os) {
7389 case llvm::Triple::Linux:
7390 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7391 case llvm::Triple::FreeBSD:
7392 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7393 case llvm::Triple::NetBSD:
7394 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7395 case llvm::Triple::OpenBSD:
7396 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7397 case llvm::Triple::Bitrig:
7398 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7399 case llvm::Triple::RTEMS:
7400 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7401 case llvm::Triple::NaCl:
7402 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7403 default:
7404 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007405 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007406
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007407 case llvm::Triple::bpfeb:
7408 case llvm::Triple::bpfel:
7409 return new BPFTargetInfo(Triple);
7410
Daniel Dunbar52322032009-08-18 05:47:58 +00007411 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007412 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007413
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007414 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007415 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007416 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007417 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007418 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007419 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007420 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007421 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007422 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007423 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007424 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007425 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007426 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007427
7428 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007429 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007430 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007431 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007432 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007433 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007434 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007435 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007436 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007437 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007438 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007439 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007440 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007441 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007442 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007443
Akira Hatanakabef17452011-09-20 19:21:49 +00007444 case llvm::Triple::mips64:
7445 switch (os) {
7446 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007447 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007448 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007449 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007450 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007451 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007452 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007453 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007454 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007455 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007456 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007457 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007458 }
7459
7460 case llvm::Triple::mips64el:
7461 switch (os) {
7462 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007463 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007464 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007465 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007466 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007467 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007468 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007469 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007470 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007471 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007472 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007473 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007474 }
7475
Ivan Krasindd7403e2011-08-24 20:22:22 +00007476 case llvm::Triple::le32:
7477 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007478 case llvm::Triple::NaCl:
7479 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7480 default:
7481 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007482 }
7483
JF Bastien643817d2014-09-12 17:52:47 +00007484 case llvm::Triple::le64:
7485 return new Le64TargetInfo(Triple);
7486
Daniel Dunbar52322032009-08-18 05:47:58 +00007487 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007488 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007489 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007490 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007491 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007492 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007493 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007494 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007495 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007496 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007497 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007498 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007499 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007500 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007501 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007502 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007503 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007504
7505 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007506 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007507 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007508 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007509 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007510 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007511 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007512 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007513 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007514 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007515 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007516 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007517 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007518 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007519 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007520
Bill Schmidt778d3872013-07-26 01:36:11 +00007521 case llvm::Triple::ppc64le:
7522 switch (os) {
7523 case llvm::Triple::Linux:
7524 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007525 case llvm::Triple::NetBSD:
7526 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007527 default:
7528 return new PPC64TargetInfo(Triple);
7529 }
7530
Peter Collingbournec947aae2012-05-20 23:28:41 +00007531 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007532 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007533 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007534 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007535
Tom Stellardd8e38a32015-01-06 20:34:47 +00007536 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007537 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007538 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007539
Daniel Dunbar52322032009-08-18 05:47:58 +00007540 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007541 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007542 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007543 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007544 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007545 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007546 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007547 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007548 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007549 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007550 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007551 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007552 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007553 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007554 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007555
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007556 // The 'sparcel' architecture copies all the above cases except for Solaris.
7557 case llvm::Triple::sparcel:
7558 switch (os) {
7559 case llvm::Triple::Linux:
7560 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7561 case llvm::Triple::NetBSD:
7562 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7563 case llvm::Triple::OpenBSD:
7564 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7565 case llvm::Triple::RTEMS:
7566 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7567 default:
7568 return new SparcV8elTargetInfo(Triple);
7569 }
7570
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007571 case llvm::Triple::sparcv9:
7572 switch (os) {
7573 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007574 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007575 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007576 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007577 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007578 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007579 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007580 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007581 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007582 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007583 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007584 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007585 }
7586
Ulrich Weigand47445072013-05-06 16:26:41 +00007587 case llvm::Triple::systemz:
7588 switch (os) {
7589 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007590 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007591 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007592 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007593 }
7594
Eli Friedmana9c3d712009-08-19 20:47:07 +00007595 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007596 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007597
Daniel Dunbar52322032009-08-18 05:47:58 +00007598 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007599 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007600 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007601
Daniel Dunbar52322032009-08-18 05:47:58 +00007602 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007603 case llvm::Triple::CloudABI:
7604 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007605 case llvm::Triple::Linux: {
7606 switch (Triple.getEnvironment()) {
7607 default:
7608 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7609 case llvm::Triple::Android:
7610 return new AndroidX86_32TargetInfo(Triple);
7611 }
7612 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007613 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007614 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007615 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007616 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007617 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007618 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007619 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007620 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007621 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007622 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007623 case llvm::Triple::KFreeBSD:
7624 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007625 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007626 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007627 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007628 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007629 case llvm::Triple::Win32: {
7630 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007631 case llvm::Triple::Cygnus:
7632 return new CygwinX86_32TargetInfo(Triple);
7633 case llvm::Triple::GNU:
7634 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007635 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007636 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007637 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007638 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007639 }
7640 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007641 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007642 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007643 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007644 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007645 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007646 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007647 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007648 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007649 }
7650
7651 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007652 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007653 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007654
Daniel Dunbar52322032009-08-18 05:47:58 +00007655 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007656 case llvm::Triple::CloudABI:
7657 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007658 case llvm::Triple::Linux: {
7659 switch (Triple.getEnvironment()) {
7660 default:
7661 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7662 case llvm::Triple::Android:
7663 return new AndroidX86_64TargetInfo(Triple);
7664 }
7665 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007666 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007667 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007668 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007669 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007670 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007671 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007672 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007673 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007674 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007675 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007676 case llvm::Triple::KFreeBSD:
7677 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007678 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007679 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007680 case llvm::Triple::Win32: {
7681 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007682 case llvm::Triple::Cygnus:
7683 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007684 case llvm::Triple::GNU:
7685 return new MinGWX86_64TargetInfo(Triple);
7686 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007687 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007688 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007689 }
7690 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007691 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007692 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007693 case llvm::Triple::PS4:
7694 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007695 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007696 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007697 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007698
Douglas Katzman78d7c542015-05-12 21:18:10 +00007699 case llvm::Triple::spir: {
7700 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7701 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7702 return nullptr;
7703 return new SPIR32TargetInfo(Triple);
7704 }
7705 case llvm::Triple::spir64: {
7706 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7707 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7708 return nullptr;
7709 return new SPIR64TargetInfo(Triple);
7710 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007711 case llvm::Triple::wasm32:
7712 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7713 return nullptr;
7714 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7715 case llvm::Triple::wasm64:
7716 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7717 return nullptr;
7718 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007719 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007720}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007721
7722/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007723/// options.
Alp Toker80758082014-07-06 05:26:44 +00007724TargetInfo *
7725TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7726 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007727 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007728
7729 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007730 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007731 if (!Target) {
7732 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007733 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007734 }
Alp Toker80758082014-07-06 05:26:44 +00007735 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007736
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007737 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007738 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7739 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007740 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007741 }
7742
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007743 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007744 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7745 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007746 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007747 }
7748
Rafael Espindolaeb265472013-08-21 21:59:03 +00007749 // Set the fp math unit.
7750 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7751 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007752 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007753 }
7754
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007755 // Compute the default target features, we need the target to handle this
7756 // because features may have dependencies on one another.
7757 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00007758 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
7759 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00007760 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007761
7762 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007763 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007764 for (const auto &F : Features)
7765 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7766
Eric Christopher3ff21b32013-10-16 21:26:26 +00007767 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007768 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007769
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007770 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007771}