blob: acbfaba9d78858493e774d96acdf1313ac91e834 [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
Daniel Dunbard86666f2010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000091 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000092 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000094 // AddressSanitizer doesn't play well with source fortification, which is on
95 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +000096 if (Opts.Sanitize.has(SanitizerKind::Address))
97 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000098
John McCall5d36a8c2011-06-16 00:03:19 +000099 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000100 // __weak is always defined, for use in blocks and with objc pointers.
101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000102
John McCall31168b02011-06-15 23:02:42 +0000103 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000104 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
106 else
107 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000108
John McCall31168b02011-06-15 23:02:42 +0000109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
110 // allow this in C, since one might have block pointers in structs that
111 // are used in pure C code and in Objective-C ARC.
112 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000113 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000114
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000115 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000116 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000117 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000119
120 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000121 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000122
Daniel Dunbarecf13562011-04-19 21:40:34 +0000123 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000124 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000125 if (Triple.isMacOSX()) {
126 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000127 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000129 Triple.getOSVersion(Maj, Min, Rev);
130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000131 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000132
Sebastian Pop422377c2012-01-20 22:01:23 +0000133 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000134 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
136 if (PlatformName == "win32") {
137 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138 return;
139 }
140
Evan Cheng31dd9a62014-01-26 23:12:43 +0000141 // Set the appropriate OS version define.
142 if (Triple.isiOS()) {
143 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
144 char Str[6];
145 Str[0] = '0' + Maj;
146 Str[1] = '0' + (Min / 10);
147 Str[2] = '0' + (Min % 10);
148 Str[3] = '0' + (Rev / 10);
149 Str[4] = '0' + (Rev % 10);
150 Str[5] = '\0';
151 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
152 Str);
153 } else if (Triple.isMacOSX()) {
154 // Note that the Driver allows versions which aren't representable in the
155 // define (because we only get a single digit for the minor and micro
156 // revision numbers). So, we limit them to the maximum representable
157 // version.
158 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000159 char Str[7];
160 if (Maj < 10 || (Maj == 10 && Min < 10)) {
161 Str[0] = '0' + (Maj / 10);
162 Str[1] = '0' + (Maj % 10);
163 Str[2] = '0' + std::min(Min, 9U);
164 Str[3] = '0' + std::min(Rev, 9U);
165 Str[4] = '\0';
166 } else {
167 // Handle versions > 10.9.
168 Str[0] = '0' + (Maj / 10);
169 Str[1] = '0' + (Maj % 10);
170 Str[2] = '0' + (Min / 10);
171 Str[3] = '0' + (Min % 10);
172 Str[4] = '0' + (Rev / 10);
173 Str[5] = '0' + (Rev % 10);
174 Str[6] = '\0';
175 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000176 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000177 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000178
Tim Northover157d9112014-01-16 08:48:16 +0000179 // Tell users about the kernel if there is one.
180 if (Triple.isOSDarwin())
181 Builder.defineMacro("__MACH__");
182
Daniel Dunbarecf13562011-04-19 21:40:34 +0000183 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000184}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000185
Ed Schoutenf33c6072015-03-11 08:42:46 +0000186// CloudABI Target
187template <typename Target>
188class CloudABITargetInfo : public OSTargetInfo<Target> {
189protected:
190 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
191 MacroBuilder &Builder) const override {
192 Builder.defineMacro("__CloudABI__");
193 Builder.defineMacro("__ELF__");
194
195 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
196 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
197 Builder.defineMacro("__STDC_UTF_16__");
198 Builder.defineMacro("__STDC_UTF_32__");
199 }
200
201public:
202 CloudABITargetInfo(const llvm::Triple &Triple)
203 : OSTargetInfo<Target>(Triple) {
204 this->UserLabelPrefix = "";
205 }
206};
207
Torok Edwinb2b37c62009-06-30 17:10:35 +0000208template<typename Target>
209class DarwinTargetInfo : public OSTargetInfo<Target> {
210protected:
Craig Topper3164f332014-03-11 03:39:26 +0000211 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
212 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000213 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000214 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000215 }
Mike Stump11289f42009-09-09 15:08:12 +0000216
Torok Edwinb2b37c62009-06-30 17:10:35 +0000217public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000218 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
219 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
220 this->MCountName = "\01mcount";
221 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222
Craig Topper3164f332014-03-11 03:39:26 +0000223 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000224 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000225 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000226 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000227 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000228 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000229 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000230 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000231
Craig Topper3164f332014-03-11 03:39:26 +0000232 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000233 // FIXME: We should return 0 when building kexts.
234 return "__TEXT,__StaticInit,regular,pure_instructions";
235 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000236
John McCalleed64c72012-01-29 01:20:30 +0000237 /// Darwin does not support protected visibility. Darwin's "default"
238 /// is very similar to ELF's "protected"; Darwin requires a "weak"
239 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000240 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000241 return false;
242 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243};
244
Chris Lattner30ba6742009-08-10 19:03:04 +0000245
Torok Edwinb2b37c62009-06-30 17:10:35 +0000246// DragonFlyBSD Target
247template<typename Target>
248class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
249protected:
Craig Topper3164f332014-03-11 03:39:26 +0000250 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
251 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000252 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000253 Builder.defineMacro("__DragonFly__");
254 Builder.defineMacro("__DragonFly_cc_version", "100001");
255 Builder.defineMacro("__ELF__");
256 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
257 Builder.defineMacro("__tune_i386__");
258 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000259 }
260public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000261 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
262 : OSTargetInfo<Target>(Triple) {
263 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000264
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000265 switch (Triple.getArch()) {
266 default:
267 case llvm::Triple::x86:
268 case llvm::Triple::x86_64:
269 this->MCountName = ".mcount";
270 break;
271 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000272 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000273};
274
275// FreeBSD Target
276template<typename Target>
277class FreeBSDTargetInfo : public OSTargetInfo<Target> {
278protected:
Craig Topper3164f332014-03-11 03:39:26 +0000279 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
280 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000281 // FreeBSD defines; list based off of gcc output
282
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000283 unsigned Release = Triple.getOSMajorVersion();
284 if (Release == 0U)
285 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000286
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000287 Builder.defineMacro("__FreeBSD__", Twine(Release));
288 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000289 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
290 DefineStd(Builder, "unix", Opts);
291 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000292
293 // On FreeBSD, wchar_t contains the number of the code point as
294 // used by the character set of the locale. These character sets are
295 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000296 //
297 // FIXME: This is wrong; the macro refers to the numerical values
298 // of wchar_t *literals*, which are not locale-dependent. However,
299 // FreeBSD systems apparently depend on us getting this wrong, and
300 // setting this to 1 is conforming even if all the basic source
301 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000302 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 }
304public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000305 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
306 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000307
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000308 switch (Triple.getArch()) {
309 default:
310 case llvm::Triple::x86:
311 case llvm::Triple::x86_64:
312 this->MCountName = ".mcount";
313 break;
314 case llvm::Triple::mips:
315 case llvm::Triple::mipsel:
316 case llvm::Triple::ppc:
317 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000318 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000319 this->MCountName = "_mcount";
320 break;
321 case llvm::Triple::arm:
322 this->MCountName = "__mcount";
323 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000324 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000325 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000326};
327
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000328// GNU/kFreeBSD Target
329template<typename Target>
330class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
331protected:
Craig Topper3164f332014-03-11 03:39:26 +0000332 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
333 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000334 // GNU/kFreeBSD defines; list based off of gcc output
335
336 DefineStd(Builder, "unix", Opts);
337 Builder.defineMacro("__FreeBSD_kernel__");
338 Builder.defineMacro("__GLIBC__");
339 Builder.defineMacro("__ELF__");
340 if (Opts.POSIXThreads)
341 Builder.defineMacro("_REENTRANT");
342 if (Opts.CPlusPlus)
343 Builder.defineMacro("_GNU_SOURCE");
344 }
345public:
Eric Christopher917e9522014-11-18 22:36:15 +0000346 KFreeBSDTargetInfo(const llvm::Triple &Triple)
347 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000348 this->UserLabelPrefix = "";
349 }
350};
351
Chris Lattner3e2ee142010-07-07 16:01:42 +0000352// Minix Target
353template<typename Target>
354class MinixTargetInfo : public OSTargetInfo<Target> {
355protected:
Craig Topper3164f332014-03-11 03:39:26 +0000356 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
357 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000358 // Minix defines
359
360 Builder.defineMacro("__minix", "3");
361 Builder.defineMacro("_EM_WSIZE", "4");
362 Builder.defineMacro("_EM_PSIZE", "4");
363 Builder.defineMacro("_EM_SSIZE", "2");
364 Builder.defineMacro("_EM_LSIZE", "4");
365 Builder.defineMacro("_EM_FSIZE", "4");
366 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000367 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000368 DefineStd(Builder, "unix", Opts);
369 }
370public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000371 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
372 this->UserLabelPrefix = "";
373 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000374};
375
Torok Edwinb2b37c62009-06-30 17:10:35 +0000376// Linux target
377template<typename Target>
378class LinuxTargetInfo : public OSTargetInfo<Target> {
379protected:
Craig Topper3164f332014-03-11 03:39:26 +0000380 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
381 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000382 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000383 DefineStd(Builder, "unix", Opts);
384 DefineStd(Builder, "linux", Opts);
385 Builder.defineMacro("__gnu_linux__");
386 Builder.defineMacro("__ELF__");
Dan Albert84aee012015-03-03 18:28:38 +0000387 if (Triple.getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000388 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000389 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000390 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000391 this->PlatformName = "android";
392 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
393 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000394 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000395 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000396 if (Opts.CPlusPlus)
397 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000398 }
399public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000400 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000401 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000402 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000403
404 switch (Triple.getArch()) {
405 default:
406 break;
407 case llvm::Triple::ppc:
408 case llvm::Triple::ppc64:
409 case llvm::Triple::ppc64le:
410 this->MCountName = "_mcount";
411 break;
412 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000413 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000414
Craig Topper3164f332014-03-11 03:39:26 +0000415 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000416 return ".text.startup";
417 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000418};
419
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000420// NetBSD Target
421template<typename Target>
422class NetBSDTargetInfo : public OSTargetInfo<Target> {
423protected:
Craig Topper3164f332014-03-11 03:39:26 +0000424 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
425 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000426 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000427 Builder.defineMacro("__NetBSD__");
428 Builder.defineMacro("__unix__");
429 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000430 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000431 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000432
433 switch (Triple.getArch()) {
434 default:
435 break;
436 case llvm::Triple::arm:
437 case llvm::Triple::armeb:
438 case llvm::Triple::thumb:
439 case llvm::Triple::thumbeb:
440 Builder.defineMacro("__ARM_DWARF_EH__");
441 break;
442 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000443 }
444public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000445 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
446 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000447 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000448 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// OpenBSD Target
452template<typename Target>
453class OpenBSDTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // OpenBSD defines; list based off of gcc output
458
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000459 Builder.defineMacro("__OpenBSD__");
460 DefineStd(Builder, "unix", Opts);
461 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000462 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000463 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000464 }
465public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000466 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
467 this->UserLabelPrefix = "";
468 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000469
Eli Friedman3715d1f2011-12-15 02:15:56 +0000470 switch (Triple.getArch()) {
471 default:
472 case llvm::Triple::x86:
473 case llvm::Triple::x86_64:
474 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000475 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000476 this->MCountName = "__mcount";
477 break;
478 case llvm::Triple::mips64:
479 case llvm::Triple::mips64el:
480 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000481 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000482 this->MCountName = "_mcount";
483 break;
484 }
485 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000486};
487
Eli Friedman9fa28852012-08-08 23:57:20 +0000488// Bitrig Target
489template<typename Target>
490class BitrigTargetInfo : public OSTargetInfo<Target> {
491protected:
Craig Topper3164f332014-03-11 03:39:26 +0000492 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
493 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000494 // Bitrig defines; list based off of gcc output
495
496 Builder.defineMacro("__Bitrig__");
497 DefineStd(Builder, "unix", Opts);
498 Builder.defineMacro("__ELF__");
499 if (Opts.POSIXThreads)
500 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000501
502 switch (Triple.getArch()) {
503 default:
504 break;
505 case llvm::Triple::arm:
506 case llvm::Triple::armeb:
507 case llvm::Triple::thumb:
508 case llvm::Triple::thumbeb:
509 Builder.defineMacro("__ARM_DWARF_EH__");
510 break;
511 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000512 }
513public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000514 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
515 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000516 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000517 }
518};
519
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000520// PSP Target
521template<typename Target>
522class PSPTargetInfo : public OSTargetInfo<Target> {
523protected:
Craig Topper3164f332014-03-11 03:39:26 +0000524 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
525 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000526 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000527 Builder.defineMacro("PSP");
528 Builder.defineMacro("_PSP");
529 Builder.defineMacro("__psp__");
530 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000531 }
532public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000533 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000534 this->UserLabelPrefix = "";
535 }
536};
537
John Thompsone467e192009-11-19 17:18:50 +0000538// PS3 PPU Target
539template<typename Target>
540class PS3PPUTargetInfo : public OSTargetInfo<Target> {
541protected:
Craig Topper3164f332014-03-11 03:39:26 +0000542 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
543 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000544 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000545 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000546 Builder.defineMacro("__PPU__");
547 Builder.defineMacro("__CELLOS_LV2__");
548 Builder.defineMacro("__ELF__");
549 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000550 Builder.defineMacro("_ARCH_PPC64");
551 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000552 }
553public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000554 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000555 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000556 this->LongWidth = this->LongAlign = 32;
557 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000558 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000559 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000560 this->SizeType = TargetInfo::UnsignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +0000561 this->DataLayoutString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000562 }
563};
564
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000565template <typename Target>
566class PS4OSTargetInfo : public OSTargetInfo<Target> {
567protected:
568 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
569 MacroBuilder &Builder) const override {
570 Builder.defineMacro("__FreeBSD__", "9");
571 Builder.defineMacro("__FreeBSD_cc_version", "900001");
572 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
573 DefineStd(Builder, "unix", Opts);
574 Builder.defineMacro("__ELF__");
575 Builder.defineMacro("__PS4__");
576 }
577public:
578 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
579 this->WCharType = this->UnsignedShort;
580
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000581 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
582 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000583 this->UserLabelPrefix = "";
584
585 switch (Triple.getArch()) {
586 default:
587 case llvm::Triple::x86_64:
588 this->MCountName = ".mcount";
589 break;
590 }
591 }
592};
593
Torok Edwinb2b37c62009-06-30 17:10:35 +0000594// Solaris target
595template<typename Target>
596class SolarisTargetInfo : public OSTargetInfo<Target> {
597protected:
Craig Topper3164f332014-03-11 03:39:26 +0000598 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
599 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000600 DefineStd(Builder, "sun", Opts);
601 DefineStd(Builder, "unix", Opts);
602 Builder.defineMacro("__ELF__");
603 Builder.defineMacro("__svr4__");
604 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000605 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
606 // newer, but to 500 for everything else. feature_test.h has a check to
607 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000608 // with a new version.
609 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000610 Builder.defineMacro("_XOPEN_SOURCE", "600");
611 else
612 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000613 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000614 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000615 Builder.defineMacro("_LARGEFILE_SOURCE");
616 Builder.defineMacro("_LARGEFILE64_SOURCE");
617 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000618 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000619 }
620public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000621 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000622 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000623 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000624 // FIXME: WIntType should be SignedLong
625 }
626};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000627
628// Windows target
629template<typename Target>
630class WindowsTargetInfo : public OSTargetInfo<Target> {
631protected:
Craig Topper3164f332014-03-11 03:39:26 +0000632 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
633 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000634 Builder.defineMacro("_WIN32");
635 }
636 void getVisualStudioDefines(const LangOptions &Opts,
637 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000638 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000639 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000640 Builder.defineMacro("_CPPRTTI");
641
Reid Kleckner16514352015-01-30 21:42:55 +0000642 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000643 Builder.defineMacro("_CPPUNWIND");
644 }
645
David Majnemer6a658902015-07-22 22:36:26 +0000646 if (Opts.Bool)
647 Builder.defineMacro("__BOOL_DEFINED");
648
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000649 if (!Opts.CharIsSigned)
650 Builder.defineMacro("_CHAR_UNSIGNED");
651
652 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
653 // but it works for now.
654 if (Opts.POSIXThreads)
655 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000656
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000657 if (Opts.MSCompatibilityVersion) {
658 Builder.defineMacro("_MSC_VER",
659 Twine(Opts.MSCompatibilityVersion / 100000));
660 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000661 // FIXME We cannot encode the revision information into 32-bits
662 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000663
David Majnemerb710a932015-05-11 03:57:49 +0000664 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000665 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000666 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000667
668 if (Opts.MicrosoftExt) {
669 Builder.defineMacro("_MSC_EXTENSIONS");
670
671 if (Opts.CPlusPlus11) {
672 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
673 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
674 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
675 }
676 }
677
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000678 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000679 }
680
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000681public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000682 WindowsTargetInfo(const llvm::Triple &Triple)
683 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000684};
685
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000686template <typename Target>
687class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000688protected:
Craig Topper3164f332014-03-11 03:39:26 +0000689 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
690 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000691 if (Opts.POSIXThreads)
692 Builder.defineMacro("_REENTRANT");
693 if (Opts.CPlusPlus)
694 Builder.defineMacro("_GNU_SOURCE");
695
696 DefineStd(Builder, "unix", Opts);
697 Builder.defineMacro("__ELF__");
698 Builder.defineMacro("__native_client__");
699 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000700
701public:
702 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000703 this->UserLabelPrefix = "";
704 this->LongAlign = 32;
705 this->LongWidth = 32;
706 this->PointerAlign = 32;
707 this->PointerWidth = 32;
708 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000709 this->Int64Type = TargetInfo::SignedLongLong;
710 this->DoubleAlign = 64;
711 this->LongDoubleWidth = 64;
712 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000713 this->LongLongWidth = 64;
714 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000715 this->SizeType = TargetInfo::UnsignedInt;
716 this->PtrDiffType = TargetInfo::SignedInt;
717 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000718 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000719 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000720 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000721 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000722 } else if (Triple.getArch() == llvm::Triple::x86) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000723 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000724 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000725 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000726 } else if (Triple.getArch() == llvm::Triple::mipsel) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000727 // Handled on mips' setDataLayoutString.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000728 } else {
729 assert(Triple.getArch() == llvm::Triple::le32);
Eric Christopher964a5f32015-08-05 23:48:05 +0000730 this->DataLayoutString = "e-p:32:32-i64:64";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000731 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000732 }
733};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000734
Dan Gohmanc2853072015-09-03 22:51:53 +0000735// WebAssembly target
736template <typename Target>
737class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
738 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000739 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000740 // A common platform macro.
741 if (Opts.POSIXThreads)
742 Builder.defineMacro("_REENTRANT");
743 // Follow g++ convention and predefine _GNU_SOURCE for C++.
744 if (Opts.CPlusPlus)
745 Builder.defineMacro("_GNU_SOURCE");
746 }
747
748 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000749 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000750 return ".text.__startup";
751 }
752
753public:
754 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
755 : OSTargetInfo<Target>(Triple) {
756 this->MCountName = "__mcount";
757 this->UserLabelPrefix = "";
758 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
759 }
760};
Dan Gohmanc2853072015-09-03 22:51:53 +0000761
Chris Lattner09d98f52008-10-05 21:50:58 +0000762//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000763// Specific target implementations.
764//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000765
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000766// PPC abstract base class
767class PPCTargetInfo : public TargetInfo {
768 static const Builtin::Info BuiltinInfo[];
769 static const char * const GCCRegNames[];
770 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000771 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000772
773 // Target cpu features.
774 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000775 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000776 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000777 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000778 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000779 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000780 bool HasBPERMD;
781 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000782
Ulrich Weigand8afad612014-07-28 13:17:52 +0000783protected:
784 std::string ABI;
785
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000786public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000787 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000788 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000789 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000790 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000791 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000792 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000793 LongDoubleWidth = LongDoubleAlign = 128;
794 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
795 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000796
Hal Finkel6b984f02012-07-03 16:51:04 +0000797 /// \brief Flags for architecture specific defines.
798 typedef enum {
799 ArchDefineNone = 0,
800 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
801 ArchDefinePpcgr = 1 << 1,
802 ArchDefinePpcsq = 1 << 2,
803 ArchDefine440 = 1 << 3,
804 ArchDefine603 = 1 << 4,
805 ArchDefine604 = 1 << 5,
806 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000807 ArchDefinePwr5 = 1 << 7,
808 ArchDefinePwr5x = 1 << 8,
809 ArchDefinePwr6 = 1 << 9,
810 ArchDefinePwr6x = 1 << 10,
811 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000812 ArchDefinePwr8 = 1 << 12,
813 ArchDefineA2 = 1 << 13,
814 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000815 } ArchDefineTypes;
816
Bill Schmidt38378a02013-02-01 20:23:10 +0000817 // Note: GCC recognizes the following additional cpus:
818 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
819 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
820 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000821 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000822 bool CPUKnown = llvm::StringSwitch<bool>(Name)
823 .Case("generic", true)
824 .Case("440", true)
825 .Case("450", true)
826 .Case("601", true)
827 .Case("602", true)
828 .Case("603", true)
829 .Case("603e", true)
830 .Case("603ev", true)
831 .Case("604", true)
832 .Case("604e", true)
833 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000834 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000835 .Case("g3", true)
836 .Case("7400", true)
837 .Case("g4", true)
838 .Case("7450", true)
839 .Case("g4+", true)
840 .Case("750", true)
841 .Case("970", true)
842 .Case("g5", true)
843 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000844 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000845 .Case("e500mc", true)
846 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000847 .Case("power3", true)
848 .Case("pwr3", true)
849 .Case("power4", true)
850 .Case("pwr4", true)
851 .Case("power5", true)
852 .Case("pwr5", true)
853 .Case("power5x", true)
854 .Case("pwr5x", true)
855 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000856 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000857 .Case("power6x", true)
858 .Case("pwr6x", true)
859 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000860 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000861 .Case("power8", true)
862 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000863 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000864 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000865 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000866 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000867 .Case("powerpc64le", true)
868 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000869 .Default(false);
870
871 if (CPUKnown)
872 CPU = Name;
873
874 return CPUKnown;
875 }
876
Ulrich Weigand8afad612014-07-28 13:17:52 +0000877
878 StringRef getABI() const override { return ABI; }
879
Craig Topper3164f332014-03-11 03:39:26 +0000880 void getTargetBuiltins(const Builtin::Info *&Records,
881 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000882 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000883 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000884 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000885
Craig Topper3164f332014-03-11 03:39:26 +0000886 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000887
Craig Topper3164f332014-03-11 03:39:26 +0000888 void getTargetDefines(const LangOptions &Opts,
889 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000890
Eric Christopheref1e2952015-08-28 02:13:58 +0000891 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
892 StringRef CPU,
Eric Christopher007b0a02015-08-28 22:32:01 +0000893 std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000894
Craig Topper3164f332014-03-11 03:39:26 +0000895 bool handleTargetFeatures(std::vector<std::string> &Features,
896 DiagnosticsEngine &Diags) override;
897 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000898 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
899 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000900
901 void getGCCRegNames(const char * const *&Names,
902 unsigned &NumNames) const override;
903 void getGCCRegAliases(const GCCRegAlias *&Aliases,
904 unsigned &NumAliases) const override;
905 bool validateAsmConstraint(const char *&Name,
906 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000907 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000908 default: return false;
909 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000910 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000911 case 'b': // Base register
912 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000913 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000914 break;
915 // FIXME: The following are added to allow parsing.
916 // I just took a guess at what the actions should be.
917 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000918 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000919 case 'v': // Altivec vector register
920 Info.setAllowsRegister();
921 break;
922 case 'w':
923 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000924 case 'd':// VSX vector register to hold vector double data
925 case 'f':// VSX vector register to hold vector float data
926 case 's':// VSX vector register to hold scalar float data
927 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000928 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000929 break;
930 default:
931 return false;
932 }
933 Info.setAllowsRegister();
934 Name++; // Skip over 'w'.
935 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000936 case 'h': // `MQ', `CTR', or `LINK' register
937 case 'q': // `MQ' register
938 case 'c': // `CTR' register
939 case 'l': // `LINK' register
940 case 'x': // `CR' register (condition register) number 0
941 case 'y': // `CR' register (condition register)
942 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000943 Info.setAllowsRegister();
944 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000945 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000946 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000947 // (use `L' instead for SImode constants)
948 case 'K': // Unsigned 16-bit constant
949 case 'L': // Signed 16-bit constant shifted left 16 bits
950 case 'M': // Constant larger than 31
951 case 'N': // Exact power of 2
952 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000953 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000954 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000955 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000956 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000957 break;
958 case 'm': // Memory operand. Note that on PowerPC targets, m can
959 // include addresses that update the base register. It
960 // is therefore only safe to use `m' in an asm statement
961 // if that asm statement accesses the operand exactly once.
962 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000963 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000964 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000965 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000966 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000967 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
968 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000969 // register to be updated.
970 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000971 if (Name[1] != 's')
972 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000973 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000974 // include any automodification of the base register. Unlike
975 // `m', this constraint can be used in asm statements that
976 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000977 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000978 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000979 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000980 break;
981 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000982 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000983 case 'Z': // Memory operand that is an indexed or indirect from a
984 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000985 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000986 Info.setAllowsMemory();
987 Info.setAllowsRegister();
988 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000989 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000990 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000991 // register (`p' is preferable for asm statements)
992 case 'S': // Constant suitable as a 64-bit mask operand
993 case 'T': // Constant suitable as a 32-bit mask operand
994 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000995 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000996 // instructions
997 case 'W': // Vector constant that does not require memory
998 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000999 break;
1000 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001001 }
John Thompson07a61a42010-06-24 22:44:13 +00001002 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001003 }
Craig Topper3164f332014-03-11 03:39:26 +00001004 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001005 std::string R;
1006 switch (*Constraint) {
1007 case 'e':
1008 case 'w':
1009 // Two-character constraint; add "^" hint for later parsing.
1010 R = std::string("^") + std::string(Constraint, 2);
1011 Constraint++;
1012 break;
1013 default:
1014 return TargetInfo::convertConstraint(Constraint);
1015 }
1016 return R;
1017 }
Craig Topper3164f332014-03-11 03:39:26 +00001018 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001019 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001020 }
Craig Topper3164f332014-03-11 03:39:26 +00001021 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001022 if (RegNo == 0) return 3;
1023 if (RegNo == 1) return 4;
1024 return -1;
1025 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001026
1027 bool hasSjLjLowering() const override {
1028 return true;
1029 }
David Majnemer2617ea62015-06-09 18:05:33 +00001030
1031 bool useFloat128ManglingForLongDouble() const override {
1032 return LongDoubleWidth == 128 &&
1033 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1034 getTriple().isOSBinFormatELF();
1035 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001036};
Anders Carlssonf511f642007-11-27 04:11:28 +00001037
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001038const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001039#define BUILTIN(ID, TYPE, ATTRS) \
1040 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1041#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1042 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001043#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001044};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001045
Eric Christopher917e9522014-11-18 22:36:15 +00001046/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001047/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001048bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001049 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001050 for (const auto &Feature : Features) {
1051 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001052 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001053 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001054 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001055 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001056 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001057 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001058 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001059 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001060 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001061 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001062 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001063 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001064 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001065 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001066 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001067 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001068 // TODO: Finish this list and add an assert that we've handled them
1069 // all.
1070 }
Eric Christopher02c33352015-08-25 00:59:11 +00001071
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001072 return true;
1073}
1074
Chris Lattnerecd49032009-03-02 22:27:17 +00001075/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1076/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001077void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001078 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001079 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001080 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001081 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001082 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001083 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001084 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001085 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001086 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001087 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001088 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001089 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001090 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001091
Chris Lattnerecd49032009-03-02 22:27:17 +00001092 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001093 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1094 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001095 } else {
1096 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1097 getTriple().getOS() != llvm::Triple::OpenBSD)
1098 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001099 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001100
Ulrich Weigand8afad612014-07-28 13:17:52 +00001101 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001102 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001103 Builder.defineMacro("_CALL_ELF", "1");
1104 if (ABI == "elfv2")
1105 Builder.defineMacro("_CALL_ELF", "2");
1106
Chris Lattnerecd49032009-03-02 22:27:17 +00001107 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001108 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1109 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001110
Chris Lattnerecd49032009-03-02 22:27:17 +00001111 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001112 if (LongDoubleWidth == 128)
1113 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001114
John Thompsone467e192009-11-19 17:18:50 +00001115 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001116 Builder.defineMacro("__VEC__", "10206");
1117 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001118 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001119
1120 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001121 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1122 .Case("440", ArchDefineName)
1123 .Case("450", ArchDefineName | ArchDefine440)
1124 .Case("601", ArchDefineName)
1125 .Case("602", ArchDefineName | ArchDefinePpcgr)
1126 .Case("603", ArchDefineName | ArchDefinePpcgr)
1127 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1128 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1129 .Case("604", ArchDefineName | ArchDefinePpcgr)
1130 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1131 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001132 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001133 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1134 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1135 .Case("750", ArchDefineName | ArchDefinePpcgr)
1136 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1137 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001138 .Case("a2", ArchDefineA2)
1139 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001140 .Case("pwr3", ArchDefinePpcgr)
1141 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1142 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1143 | ArchDefinePpcsq)
1144 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1145 | ArchDefinePpcgr | ArchDefinePpcsq)
1146 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1147 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1148 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1149 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1150 | ArchDefinePpcsq)
1151 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1152 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001153 | ArchDefinePpcgr | ArchDefinePpcsq)
1154 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1155 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1156 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001157 .Case("power3", ArchDefinePpcgr)
1158 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1159 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1160 | ArchDefinePpcsq)
1161 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1162 | ArchDefinePpcgr | ArchDefinePpcsq)
1163 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1164 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1165 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1166 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1167 | ArchDefinePpcsq)
1168 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1169 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001170 | ArchDefinePpcgr | ArchDefinePpcsq)
1171 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1172 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1173 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001174 .Default(ArchDefineNone);
1175
1176 if (defs & ArchDefineName)
1177 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1178 if (defs & ArchDefinePpcgr)
1179 Builder.defineMacro("_ARCH_PPCGR");
1180 if (defs & ArchDefinePpcsq)
1181 Builder.defineMacro("_ARCH_PPCSQ");
1182 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001183 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001184 if (defs & ArchDefine603)
1185 Builder.defineMacro("_ARCH_603");
1186 if (defs & ArchDefine604)
1187 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001188 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001189 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001190 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001191 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001192 if (defs & ArchDefinePwr5x)
1193 Builder.defineMacro("_ARCH_PWR5X");
1194 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001195 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001196 if (defs & ArchDefinePwr6x)
1197 Builder.defineMacro("_ARCH_PWR6X");
1198 if (defs & ArchDefinePwr7)
1199 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001200 if (defs & ArchDefinePwr8)
1201 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001202 if (defs & ArchDefineA2)
1203 Builder.defineMacro("_ARCH_A2");
1204 if (defs & ArchDefineA2q) {
1205 Builder.defineMacro("_ARCH_A2Q");
1206 Builder.defineMacro("_ARCH_QP");
1207 }
1208
1209 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1210 Builder.defineMacro("__bg__");
1211 Builder.defineMacro("__THW_BLUEGENE__");
1212 Builder.defineMacro("__bgq__");
1213 Builder.defineMacro("__TOS_BGQ__");
1214 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001215
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001216 if (HasVSX)
1217 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001218 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001219 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001220 if (HasP8Crypto)
1221 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001222 if (HasHTM)
1223 Builder.defineMacro("__HTM__");
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001224 if (getTriple().getArch() == llvm::Triple::ppc64le ||
Nemanja Ivanovice97e1112015-05-14 20:02:24 +00001225 (defs & ArchDefinePwr8) || (CPU == "pwr8")) {
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001226 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1227 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1228 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1229 if (PointerWidth == 64)
1230 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1231 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001232
Bill Schmidt38378a02013-02-01 20:23:10 +00001233 // FIXME: The following are not yet generated here by Clang, but are
1234 // generated by GCC:
1235 //
1236 // _SOFT_FLOAT_
1237 // __RECIP_PRECISION__
1238 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001239 // __RECIP__
1240 // __RECIPF__
1241 // __RSQRTE__
1242 // __RSQRTEF__
1243 // _SOFT_DOUBLE_
1244 // __NO_LWSYNC__
1245 // __HAVE_BSWAP__
1246 // __LONGDOUBLE128
1247 // __CMODEL_MEDIUM__
1248 // __CMODEL_LARGE__
1249 // _CALL_SYSV
1250 // _CALL_DARWIN
1251 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001252}
1253
Eric Christophera8a14c32015-08-31 18:39:16 +00001254// Handle explicit options being passed to the compiler here: if we've
1255// explicitly turned off vsx and turned on power8-vector or direct-move then
1256// go ahead and error since the customer has expressed a somewhat incompatible
1257// set of options.
1258static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
1259 std::vector<std::string> &FeaturesVec) {
1260
1261 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1262 FeaturesVec.end()) {
1263 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1264 FeaturesVec.end()) {
1265 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1266 << "-mno-vsx";
1267 return false;
1268 }
1269
1270 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1271 FeaturesVec.end()) {
1272 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1273 << "-mno-vsx";
1274 return false;
1275 }
1276 }
1277
1278 return true;
1279}
1280
1281bool PPCTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
1282 DiagnosticsEngine &Diags, StringRef CPU,
1283 std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001284 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1285 .Case("7400", true)
1286 .Case("g4", true)
1287 .Case("7450", true)
1288 .Case("g4+", true)
1289 .Case("970", true)
1290 .Case("g5", true)
1291 .Case("pwr6", true)
1292 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001293 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001294 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001295 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001296 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001297
1298 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001299 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1300 .Case("ppc64le", true)
1301 .Case("pwr8", true)
1302 .Default(false);
1303 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1304 .Case("ppc64le", true)
1305 .Case("pwr8", true)
1306 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001307 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1308 .Case("ppc64le", true)
1309 .Case("pwr8", true)
1310 .Case("pwr7", true)
1311 .Default(false);
1312 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1313 .Case("ppc64le", true)
1314 .Case("pwr8", true)
1315 .Case("pwr7", true)
1316 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001317 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1318 .Case("ppc64le", true)
1319 .Case("pwr8", true)
1320 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001321 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1322 .Case("ppc64le", true)
1323 .Case("pwr8", true)
1324 .Case("pwr7", true)
1325 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001326
Eric Christophera8a14c32015-08-31 18:39:16 +00001327 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1328 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001329
Eric Christopher007b0a02015-08-28 22:32:01 +00001330 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001331}
1332
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001333bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001334 return llvm::StringSwitch<bool>(Feature)
1335 .Case("powerpc", true)
1336 .Case("vsx", HasVSX)
1337 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001338 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001339 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001340 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001341 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001342 .Case("bpermd", HasBPERMD)
1343 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001344 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001345}
Chris Lattner17df24e2008-04-21 18:56:49 +00001346
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001347void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1348 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001349 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1350 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1351 // incompatible options.
1352 if (Enabled) {
1353 if (Name == "vsx") {
1354 Features[Name] = true;
1355 } else if (Name == "direct-move") {
1356 Features[Name] = Features["vsx"] = true;
1357 } else if (Name == "power8-vector") {
1358 Features[Name] = Features["vsx"] = true;
1359 } else {
1360 Features[Name] = true;
1361 }
1362 } else {
1363 if (Name == "vsx") {
1364 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1365 false;
1366 } else {
1367 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001368 }
1369 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001370}
1371
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001372const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001373 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1374 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1375 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1376 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1377 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1378 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1379 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1380 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001381 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001382 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001383 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001384 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1385 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1386 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1387 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001388 "vrsave", "vscr",
1389 "spe_acc", "spefscr",
1390 "sfp"
1391};
Chris Lattner10a5b382007-01-29 05:24:35 +00001392
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001393void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001394 unsigned &NumNames) const {
1395 Names = GCCRegNames;
1396 NumNames = llvm::array_lengthof(GCCRegNames);
1397}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001398
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001399const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1400 // While some of these aliases do map to different registers
1401 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001402 { { "0" }, "r0" },
1403 { { "1"}, "r1" },
1404 { { "2" }, "r2" },
1405 { { "3" }, "r3" },
1406 { { "4" }, "r4" },
1407 { { "5" }, "r5" },
1408 { { "6" }, "r6" },
1409 { { "7" }, "r7" },
1410 { { "8" }, "r8" },
1411 { { "9" }, "r9" },
1412 { { "10" }, "r10" },
1413 { { "11" }, "r11" },
1414 { { "12" }, "r12" },
1415 { { "13" }, "r13" },
1416 { { "14" }, "r14" },
1417 { { "15" }, "r15" },
1418 { { "16" }, "r16" },
1419 { { "17" }, "r17" },
1420 { { "18" }, "r18" },
1421 { { "19" }, "r19" },
1422 { { "20" }, "r20" },
1423 { { "21" }, "r21" },
1424 { { "22" }, "r22" },
1425 { { "23" }, "r23" },
1426 { { "24" }, "r24" },
1427 { { "25" }, "r25" },
1428 { { "26" }, "r26" },
1429 { { "27" }, "r27" },
1430 { { "28" }, "r28" },
1431 { { "29" }, "r29" },
1432 { { "30" }, "r30" },
1433 { { "31" }, "r31" },
1434 { { "fr0" }, "f0" },
1435 { { "fr1" }, "f1" },
1436 { { "fr2" }, "f2" },
1437 { { "fr3" }, "f3" },
1438 { { "fr4" }, "f4" },
1439 { { "fr5" }, "f5" },
1440 { { "fr6" }, "f6" },
1441 { { "fr7" }, "f7" },
1442 { { "fr8" }, "f8" },
1443 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001444 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001445 { { "fr11" }, "f11" },
1446 { { "fr12" }, "f12" },
1447 { { "fr13" }, "f13" },
1448 { { "fr14" }, "f14" },
1449 { { "fr15" }, "f15" },
1450 { { "fr16" }, "f16" },
1451 { { "fr17" }, "f17" },
1452 { { "fr18" }, "f18" },
1453 { { "fr19" }, "f19" },
1454 { { "fr20" }, "f20" },
1455 { { "fr21" }, "f21" },
1456 { { "fr22" }, "f22" },
1457 { { "fr23" }, "f23" },
1458 { { "fr24" }, "f24" },
1459 { { "fr25" }, "f25" },
1460 { { "fr26" }, "f26" },
1461 { { "fr27" }, "f27" },
1462 { { "fr28" }, "f28" },
1463 { { "fr29" }, "f29" },
1464 { { "fr30" }, "f30" },
1465 { { "fr31" }, "f31" },
1466 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001467};
1468
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001469void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001470 unsigned &NumAliases) const {
1471 Aliases = GCCRegAliases;
1472 NumAliases = llvm::array_lengthof(GCCRegAliases);
1473}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001474
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001475class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001476public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001477 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001478 DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001479
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001480 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001481 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001482 case llvm::Triple::FreeBSD:
1483 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001484 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001485 PtrDiffType = SignedInt;
1486 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001487 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001488 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001489 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001490 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001491
Roman Divacky3ffe7462012-03-13 19:20:17 +00001492 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1493 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001494 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001495 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001496
1497 // PPC32 supports atomics up to 4 bytes.
1498 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001499 }
1500
Craig Topper3164f332014-03-11 03:39:26 +00001501 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001502 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001503 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001504 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001505};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001506
Bill Schmidt778d3872013-07-26 01:36:11 +00001507// Note: ABI differences may eventually require us to have a separate
1508// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001509class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001510public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001511 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001512 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001513 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001514 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001515
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001516 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
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 = "elfv2";
1519 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001520 DataLayoutString = "E-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001521 ABI = "elfv1";
1522 }
1523
1524 switch (getTriple().getOS()) {
1525 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001526 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001527 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001528 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001529 case llvm::Triple::NetBSD:
1530 IntMaxType = SignedLongLong;
1531 Int64Type = SignedLongLong;
1532 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001533 default:
1534 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001535 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001536
1537 // PPC64 supports atomics up to 8 bytes.
1538 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001539 }
Craig Topper3164f332014-03-11 03:39:26 +00001540 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001541 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001542 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001543 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001544 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001545 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001546 ABI = Name;
1547 return true;
1548 }
1549 return false;
1550 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001551};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001552
Roman Divacky965b0b72011-01-06 08:27:10 +00001553class DarwinPPC32TargetInfo :
1554 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001555public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001556 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1557 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001558 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001559 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001560 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001561 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001562 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001563 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001564 }
Craig Topper3164f332014-03-11 03:39:26 +00001565 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001566 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001567 }
1568};
1569
1570class DarwinPPC64TargetInfo :
1571 public DarwinTargetInfo<PPC64TargetInfo> {
1572public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001573 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1574 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001575 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001576 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001577 DataLayoutString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001578 }
1579};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001580
Eric Christopherc48497a2015-09-18 21:26:24 +00001581static const unsigned NVPTXAddrSpaceMap[] = {
1582 1, // opencl_global
1583 3, // opencl_local
1584 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001585 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001586 0, // opencl_generic
1587 1, // cuda_device
1588 4, // cuda_constant
1589 3, // cuda_shared
1590};
1591
1592class NVPTXTargetInfo : public TargetInfo {
1593 static const char *const GCCRegNames[];
1594 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001595
1596 // The GPU profiles supported by the NVPTX backend
1597 enum GPUKind {
1598 GK_NONE,
1599 GK_SM20,
1600 GK_SM21,
1601 GK_SM30,
1602 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001603 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001604 } GPU;
1605
Eric Christopherc48497a2015-09-18 21:26:24 +00001606public:
1607 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1608 BigEndian = false;
1609 TLSSupported = false;
1610 LongWidth = LongAlign = 64;
1611 AddrSpaceMap = &NVPTXAddrSpaceMap;
1612 UseAddrSpaceMapMangling = true;
1613 // Define available target features
1614 // These must be defined in sorted order!
1615 NoAsmVariants = true;
1616 // Set the default GPU to sm20
1617 GPU = GK_SM20;
1618 }
1619 void getTargetDefines(const LangOptions &Opts,
1620 MacroBuilder &Builder) const override {
1621 Builder.defineMacro("__PTX__");
1622 Builder.defineMacro("__NVPTX__");
1623 if (Opts.CUDAIsDevice) {
1624 // Set __CUDA_ARCH__ for the GPU specified.
1625 std::string CUDAArchCode;
1626 switch (GPU) {
1627 case GK_SM20:
1628 CUDAArchCode = "200";
1629 break;
1630 case GK_SM21:
1631 CUDAArchCode = "210";
1632 break;
1633 case GK_SM30:
1634 CUDAArchCode = "300";
1635 break;
1636 case GK_SM35:
1637 CUDAArchCode = "350";
1638 break;
1639 case GK_SM37:
1640 CUDAArchCode = "370";
1641 break;
1642 default:
1643 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001644 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001645 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001646 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001647 }
1648 void getTargetBuiltins(const Builtin::Info *&Records,
1649 unsigned &NumRecords) const override {
1650 Records = BuiltinInfo;
1651 NumRecords = clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin;
1652 }
1653 bool hasFeature(StringRef Feature) const override {
1654 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001655 }
1656
Eric Christopherc48497a2015-09-18 21:26:24 +00001657 void getGCCRegNames(const char *const *&Names,
1658 unsigned &NumNames) const override;
1659 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1660 unsigned &NumAliases) const override {
1661 // No aliases.
1662 Aliases = nullptr;
1663 NumAliases = 0;
1664 }
1665 bool validateAsmConstraint(const char *&Name,
1666 TargetInfo::ConstraintInfo &Info) const override {
1667 switch (*Name) {
1668 default:
1669 return false;
1670 case 'c':
1671 case 'h':
1672 case 'r':
1673 case 'l':
1674 case 'f':
1675 case 'd':
1676 Info.setAllowsRegister();
1677 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001678 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001679 }
1680 const char *getClobbers() const override {
1681 // FIXME: Is this really right?
1682 return "";
1683 }
1684 BuiltinVaListKind getBuiltinVaListKind() const override {
1685 // FIXME: implement
1686 return TargetInfo::CharPtrBuiltinVaList;
1687 }
1688 bool setCPU(const std::string &Name) override {
1689 GPU = llvm::StringSwitch<GPUKind>(Name)
1690 .Case("sm_20", GK_SM20)
1691 .Case("sm_21", GK_SM21)
1692 .Case("sm_30", GK_SM30)
1693 .Case("sm_35", GK_SM35)
1694 .Case("sm_37", GK_SM37)
1695 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001696
Eric Christopherc48497a2015-09-18 21:26:24 +00001697 return GPU != GK_NONE;
1698 }
1699};
1700
1701const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1702#define BUILTIN(ID, TYPE, ATTRS) \
1703 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1704#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1705 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1706#include "clang/Basic/BuiltinsNVPTX.def"
1707};
1708
1709const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1710
1711void NVPTXTargetInfo::getGCCRegNames(const char *const *&Names,
1712 unsigned &NumNames) const {
1713 Names = GCCRegNames;
1714 NumNames = llvm::array_lengthof(GCCRegNames);
1715}
1716
1717class NVPTX32TargetInfo : public NVPTXTargetInfo {
1718public:
1719 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1720 PointerWidth = PointerAlign = 32;
1721 SizeType = TargetInfo::UnsignedInt;
1722 PtrDiffType = TargetInfo::SignedInt;
1723 IntPtrType = TargetInfo::SignedInt;
1724 DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
1725 }
1726};
1727
1728class NVPTX64TargetInfo : public NVPTXTargetInfo {
1729public:
1730 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1731 PointerWidth = PointerAlign = 64;
1732 SizeType = TargetInfo::UnsignedLong;
1733 PtrDiffType = TargetInfo::SignedLong;
1734 IntPtrType = TargetInfo::SignedLong;
1735 DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64";
1736 }
1737};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001738
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001739static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001740 1, // opencl_global
1741 3, // opencl_local
1742 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001743 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001744 1, // cuda_device
1745 2, // cuda_constant
1746 3 // cuda_shared
1747};
1748
Tom Stellarda96344b2014-08-21 13:58:40 +00001749// If you edit the description strings, make sure you update
1750// getPointerWidthV().
1751
Eric Christopher964a5f32015-08-05 23:48:05 +00001752static const char *DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001753 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1754 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001755
Eric Christopher964a5f32015-08-05 23:48:05 +00001756static const char *DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001757 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1758 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001759
Eric Christopher964a5f32015-08-05 23:48:05 +00001760static const char *DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001761 "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 +00001762 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1763 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001764
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001765class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001766 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001767 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001768
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001769 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001770 enum GPUKind {
1771 GK_NONE,
1772 GK_R600,
1773 GK_R600_DOUBLE_OPS,
1774 GK_R700,
1775 GK_R700_DOUBLE_OPS,
1776 GK_EVERGREEN,
1777 GK_EVERGREEN_DOUBLE_OPS,
1778 GK_NORTHERN_ISLANDS,
1779 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001780 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001781 GK_SEA_ISLANDS,
1782 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001783 } GPU;
1784
Jan Veselyeebeaea2015-05-04 19:53:36 +00001785 bool hasFP64:1;
1786 bool hasFMAF:1;
1787 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001788
Eli Friedmand13b41e2012-10-12 23:32:00 +00001789public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001790 AMDGPUTargetInfo(const llvm::Triple &Triple)
1791 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001792
1793 if (Triple.getArch() == llvm::Triple::amdgcn) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001794 DataLayoutString = DataLayoutStringSI;
Tom Stellardd99fb952015-01-28 15:38:44 +00001795 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001796 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001797 hasFMAF = true;
1798 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001799 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001800 DataLayoutString = DataLayoutStringR600;
Tom Stellardd99fb952015-01-28 15:38:44 +00001801 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001802 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001803 hasFMAF = false;
1804 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001805 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001806 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001807 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001808 }
1809
Tom Stellarda96344b2014-08-21 13:58:40 +00001810 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1811 if (GPU <= GK_CAYMAN)
1812 return 32;
1813
1814 switch(AddrSpace) {
1815 default:
1816 return 64;
1817 case 0:
1818 case 3:
1819 case 5:
1820 return 32;
1821 }
1822 }
1823
Craig Topper3164f332014-03-11 03:39:26 +00001824 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001825 return "";
1826 }
1827
Craig Topper3164f332014-03-11 03:39:26 +00001828 void getGCCRegNames(const char * const *&Names,
Tom Stellard7b1059b2015-04-14 14:36:56 +00001829 unsigned &NumNames) const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001830
Craig Topper3164f332014-03-11 03:39:26 +00001831 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1832 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001833 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001834 NumAliases = 0;
1835 }
1836
Craig Topper3164f332014-03-11 03:39:26 +00001837 bool validateAsmConstraint(const char *&Name,
1838 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001839 return true;
1840 }
1841
Craig Topper3164f332014-03-11 03:39:26 +00001842 void getTargetBuiltins(const Builtin::Info *&Records,
1843 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001844 Records = BuiltinInfo;
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001845 NumRecords = clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001846 }
1847
Craig Topper3164f332014-03-11 03:39:26 +00001848 void getTargetDefines(const LangOptions &Opts,
1849 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001850 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001851 if (hasFMAF)
1852 Builder.defineMacro("__HAS_FMAF__");
1853 if (hasLDEXPF)
1854 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001855 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001856 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001857 if (Opts.OpenCL) {
1858 if (GPU >= GK_NORTHERN_ISLANDS) {
1859 Builder.defineMacro("cl_khr_byte_addressable_store");
1860 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1861 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1862 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1863 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1864 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001865 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001866 }
1867
Craig Topper3164f332014-03-11 03:39:26 +00001868 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001869 return TargetInfo::CharPtrBuiltinVaList;
1870 }
1871
Craig Topper3164f332014-03-11 03:39:26 +00001872 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001873 GPU = llvm::StringSwitch<GPUKind>(Name)
1874 .Case("r600" , GK_R600)
1875 .Case("rv610", GK_R600)
1876 .Case("rv620", GK_R600)
1877 .Case("rv630", GK_R600)
1878 .Case("rv635", GK_R600)
1879 .Case("rs780", GK_R600)
1880 .Case("rs880", GK_R600)
1881 .Case("rv670", GK_R600_DOUBLE_OPS)
1882 .Case("rv710", GK_R700)
1883 .Case("rv730", GK_R700)
1884 .Case("rv740", GK_R700_DOUBLE_OPS)
1885 .Case("rv770", GK_R700_DOUBLE_OPS)
1886 .Case("palm", GK_EVERGREEN)
1887 .Case("cedar", GK_EVERGREEN)
1888 .Case("sumo", GK_EVERGREEN)
1889 .Case("sumo2", GK_EVERGREEN)
1890 .Case("redwood", GK_EVERGREEN)
1891 .Case("juniper", GK_EVERGREEN)
1892 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1893 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1894 .Case("barts", GK_NORTHERN_ISLANDS)
1895 .Case("turks", GK_NORTHERN_ISLANDS)
1896 .Case("caicos", GK_NORTHERN_ISLANDS)
1897 .Case("cayman", GK_CAYMAN)
1898 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001899 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001900 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1901 .Case("verde", GK_SOUTHERN_ISLANDS)
1902 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001903 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001904 .Case("bonaire", GK_SEA_ISLANDS)
1905 .Case("kabini", GK_SEA_ISLANDS)
1906 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001907 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001908 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001909 .Case("tonga", GK_VOLCANIC_ISLANDS)
1910 .Case("iceland", GK_VOLCANIC_ISLANDS)
1911 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001912 .Default(GK_NONE);
1913
1914 if (GPU == GK_NONE) {
1915 return false;
1916 }
1917
1918 // Set the correct data layout
1919 switch (GPU) {
1920 case GK_NONE:
1921 case GK_R600:
1922 case GK_R700:
1923 case GK_EVERGREEN:
1924 case GK_NORTHERN_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001925 DataLayoutString = DataLayoutStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001926 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001927 hasFMAF = false;
1928 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001929 break;
1930 case GK_R600_DOUBLE_OPS:
1931 case GK_R700_DOUBLE_OPS:
1932 case GK_EVERGREEN_DOUBLE_OPS:
1933 case GK_CAYMAN:
Eric Christopher964a5f32015-08-05 23:48:05 +00001934 DataLayoutString = DataLayoutStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001935 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001936 hasFMAF = true;
1937 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001938 break;
1939 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001940 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001941 case GK_VOLCANIC_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001942 DataLayoutString = DataLayoutStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001943 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001944 hasFMAF = true;
1945 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001946 break;
1947 }
1948
1949 return true;
1950 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001951};
1952
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001953const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001954#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001955 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001956#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001957};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001958const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001959 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1960 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1961 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1962 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1963 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1964 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1965 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1966 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1967 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1968 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1969 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1970 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1971 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1972 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1973 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1974 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1975 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1976 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1977 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1978 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1979 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1980 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1981 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1982 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1983 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1984 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1985 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1986 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1987 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1988 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1989 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1990 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1991 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1992 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1993 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1994 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1995 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1996 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1997 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1998 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1999 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2000 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2001 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2002 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2003 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2004 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2005 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
2006 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
2007 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
2008 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
2009};
2010
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002011void AMDGPUTargetInfo::getGCCRegNames(const char * const *&Names,
2012 unsigned &NumNames) const {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002013 Names = GCCRegNames;
2014 NumNames = llvm::array_lengthof(GCCRegNames);
2015}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002016
Eli Friedman3fd920a2008-08-20 02:34:37 +00002017// Namespace for x86 abstract base class
2018const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002019#define BUILTIN(ID, TYPE, ATTRS) \
2020 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002021#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002022 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002023#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002024 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002025#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002026};
Eli Friedmanb5366062008-05-20 14:21:01 +00002027
Nuno Lopescfca1f02009-12-23 17:49:57 +00002028static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002029 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2030 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002031 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002032 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2033 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2034 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002035 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002036 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2037 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002038};
2039
Eric Christophercdd36352011-06-21 00:05:20 +00002040const TargetInfo::AddlRegName AddlRegNames[] = {
2041 { { "al", "ah", "eax", "rax" }, 0 },
2042 { { "bl", "bh", "ebx", "rbx" }, 3 },
2043 { { "cl", "ch", "ecx", "rcx" }, 2 },
2044 { { "dl", "dh", "edx", "rdx" }, 1 },
2045 { { "esi", "rsi" }, 4 },
2046 { { "edi", "rdi" }, 5 },
2047 { { "esp", "rsp" }, 7 },
2048 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002049 { { "r8d", "r8w", "r8b" }, 38 },
2050 { { "r9d", "r9w", "r9b" }, 39 },
2051 { { "r10d", "r10w", "r10b" }, 40 },
2052 { { "r11d", "r11w", "r11b" }, 41 },
2053 { { "r12d", "r12w", "r12b" }, 42 },
2054 { { "r13d", "r13w", "r13b" }, 43 },
2055 { { "r14d", "r14w", "r14b" }, 44 },
2056 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002057};
2058
2059// X86 target abstract base class; x86-32 and x86-64 are very close, so
2060// most of the implementation can be shared.
2061class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002062 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002063 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00002064 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00002065 enum MMX3DNowEnum {
2066 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
2067 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002068 enum XOPEnum {
2069 NoXOP,
2070 SSE4A,
2071 FMA4,
2072 XOP
2073 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00002074
Eric Christophere1ddaf92010-04-02 23:50:19 +00002075 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00002076 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00002077 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00002078 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00002079 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00002080 bool HasBMI;
2081 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00002082 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00002083 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00002084 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00002085 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00002086 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002087 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00002088 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00002089 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00002090 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
2091 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00002092 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002093 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002094
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002095 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2096 ///
2097 /// Each enumeration represents a particular CPU supported by Clang. These
2098 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2099 enum CPUKind {
2100 CK_Generic,
2101
2102 /// \name i386
2103 /// i386-generation processors.
2104 //@{
2105 CK_i386,
2106 //@}
2107
2108 /// \name i486
2109 /// i486-generation processors.
2110 //@{
2111 CK_i486,
2112 CK_WinChipC6,
2113 CK_WinChip2,
2114 CK_C3,
2115 //@}
2116
2117 /// \name i586
2118 /// i586-generation processors, P5 microarchitecture based.
2119 //@{
2120 CK_i586,
2121 CK_Pentium,
2122 CK_PentiumMMX,
2123 //@}
2124
2125 /// \name i686
2126 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2127 //@{
2128 CK_i686,
2129 CK_PentiumPro,
2130 CK_Pentium2,
2131 CK_Pentium3,
2132 CK_Pentium3M,
2133 CK_PentiumM,
2134 CK_C3_2,
2135
2136 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2137 /// Clang however has some logic to suport this.
2138 // FIXME: Warn, deprecate, and potentially remove this.
2139 CK_Yonah,
2140 //@}
2141
2142 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002143 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002144 //@{
2145 CK_Pentium4,
2146 CK_Pentium4M,
2147 CK_Prescott,
2148 CK_Nocona,
2149 //@}
2150
2151 /// \name Core
2152 /// Core microarchitecture based processors.
2153 //@{
2154 CK_Core2,
2155
2156 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2157 /// codename which GCC no longer accepts as an option to -march, but Clang
2158 /// has some logic for recognizing it.
2159 // FIXME: Warn, deprecate, and potentially remove this.
2160 CK_Penryn,
2161 //@}
2162
2163 /// \name Atom
2164 /// Atom processors
2165 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002166 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002167 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002168 //@}
2169
2170 /// \name Nehalem
2171 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002172 CK_Nehalem,
2173
2174 /// \name Westmere
2175 /// Westmere microarchitecture based processors.
2176 CK_Westmere,
2177
2178 /// \name Sandy Bridge
2179 /// Sandy Bridge microarchitecture based processors.
2180 CK_SandyBridge,
2181
2182 /// \name Ivy Bridge
2183 /// Ivy Bridge microarchitecture based processors.
2184 CK_IvyBridge,
2185
2186 /// \name Haswell
2187 /// Haswell microarchitecture based processors.
2188 CK_Haswell,
2189
2190 /// \name Broadwell
2191 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002192 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002193
2194 /// \name Skylake
2195 /// Skylake microarchitecture based processors.
2196 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002197
Craig Topper449314e2013-08-20 07:09:39 +00002198 /// \name Knights Landing
2199 /// Knights Landing processor.
2200 CK_KNL,
2201
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002202 /// \name K6
2203 /// K6 architecture processors.
2204 //@{
2205 CK_K6,
2206 CK_K6_2,
2207 CK_K6_3,
2208 //@}
2209
2210 /// \name K7
2211 /// K7 architecture processors.
2212 //@{
2213 CK_Athlon,
2214 CK_AthlonThunderbird,
2215 CK_Athlon4,
2216 CK_AthlonXP,
2217 CK_AthlonMP,
2218 //@}
2219
2220 /// \name K8
2221 /// K8 architecture processors.
2222 //@{
2223 CK_Athlon64,
2224 CK_Athlon64SSE3,
2225 CK_AthlonFX,
2226 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002227 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002228 CK_Opteron,
2229 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002230 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002231 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002232
Benjamin Kramer569f2152012-01-10 11:50:18 +00002233 /// \name Bobcat
2234 /// Bobcat architecture processors.
2235 //@{
2236 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002237 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002238 //@}
2239
2240 /// \name Bulldozer
2241 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002242 //@{
2243 CK_BDVER1,
2244 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002245 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002246 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002247 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002248
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002249 /// This specification is deprecated and will be removed in the future.
2250 /// Users should prefer \see CK_K8.
2251 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002252 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002253 CK_x86_64,
2254 //@}
2255
2256 /// \name Geode
2257 /// Geode processors.
2258 //@{
2259 CK_Geode
2260 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002261 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002262
Eric Christopherc50738f2015-08-27 00:05:50 +00002263 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002264 return llvm::StringSwitch<CPUKind>(CPU)
2265 .Case("i386", CK_i386)
2266 .Case("i486", CK_i486)
2267 .Case("winchip-c6", CK_WinChipC6)
2268 .Case("winchip2", CK_WinChip2)
2269 .Case("c3", CK_C3)
2270 .Case("i586", CK_i586)
2271 .Case("pentium", CK_Pentium)
2272 .Case("pentium-mmx", CK_PentiumMMX)
2273 .Case("i686", CK_i686)
2274 .Case("pentiumpro", CK_PentiumPro)
2275 .Case("pentium2", CK_Pentium2)
2276 .Case("pentium3", CK_Pentium3)
2277 .Case("pentium3m", CK_Pentium3M)
2278 .Case("pentium-m", CK_PentiumM)
2279 .Case("c3-2", CK_C3_2)
2280 .Case("yonah", CK_Yonah)
2281 .Case("pentium4", CK_Pentium4)
2282 .Case("pentium4m", CK_Pentium4M)
2283 .Case("prescott", CK_Prescott)
2284 .Case("nocona", CK_Nocona)
2285 .Case("core2", CK_Core2)
2286 .Case("penryn", CK_Penryn)
2287 .Case("bonnell", CK_Bonnell)
2288 .Case("atom", CK_Bonnell) // Legacy name.
2289 .Case("silvermont", CK_Silvermont)
2290 .Case("slm", CK_Silvermont) // Legacy name.
2291 .Case("nehalem", CK_Nehalem)
2292 .Case("corei7", CK_Nehalem) // Legacy name.
2293 .Case("westmere", CK_Westmere)
2294 .Case("sandybridge", CK_SandyBridge)
2295 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2296 .Case("ivybridge", CK_IvyBridge)
2297 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2298 .Case("haswell", CK_Haswell)
2299 .Case("core-avx2", CK_Haswell) // Legacy name.
2300 .Case("broadwell", CK_Broadwell)
2301 .Case("skylake", CK_Skylake)
2302 .Case("skx", CK_Skylake) // Legacy name.
2303 .Case("knl", CK_KNL)
2304 .Case("k6", CK_K6)
2305 .Case("k6-2", CK_K6_2)
2306 .Case("k6-3", CK_K6_3)
2307 .Case("athlon", CK_Athlon)
2308 .Case("athlon-tbird", CK_AthlonThunderbird)
2309 .Case("athlon-4", CK_Athlon4)
2310 .Case("athlon-xp", CK_AthlonXP)
2311 .Case("athlon-mp", CK_AthlonMP)
2312 .Case("athlon64", CK_Athlon64)
2313 .Case("athlon64-sse3", CK_Athlon64SSE3)
2314 .Case("athlon-fx", CK_AthlonFX)
2315 .Case("k8", CK_K8)
2316 .Case("k8-sse3", CK_K8SSE3)
2317 .Case("opteron", CK_Opteron)
2318 .Case("opteron-sse3", CK_OpteronSSE3)
2319 .Case("barcelona", CK_AMDFAM10)
2320 .Case("amdfam10", CK_AMDFAM10)
2321 .Case("btver1", CK_BTVER1)
2322 .Case("btver2", CK_BTVER2)
2323 .Case("bdver1", CK_BDVER1)
2324 .Case("bdver2", CK_BDVER2)
2325 .Case("bdver3", CK_BDVER3)
2326 .Case("bdver4", CK_BDVER4)
2327 .Case("x86-64", CK_x86_64)
2328 .Case("geode", CK_Geode)
2329 .Default(CK_Generic);
2330 }
2331
Rafael Espindolaeb265472013-08-21 21:59:03 +00002332 enum FPMathKind {
2333 FP_Default,
2334 FP_SSE,
2335 FP_387
2336 } FPMath;
2337
Eli Friedman3fd920a2008-08-20 02:34:37 +00002338public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002339 X86TargetInfo(const llvm::Triple &Triple)
2340 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002341 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002342 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2343 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2344 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2345 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2346 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2347 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002348 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002349 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002350 }
Craig Topper3164f332014-03-11 03:39:26 +00002351 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002352 // X87 evaluates with 80 bits "long double" precision.
2353 return SSELevel == NoSSE ? 2 : 0;
2354 }
Craig Topper3164f332014-03-11 03:39:26 +00002355 void getTargetBuiltins(const Builtin::Info *&Records,
2356 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002357 Records = BuiltinInfo;
2358 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002359 }
Craig Topper3164f332014-03-11 03:39:26 +00002360 void getGCCRegNames(const char * const *&Names,
2361 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002362 Names = GCCRegNames;
2363 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002364 }
Craig Topper3164f332014-03-11 03:39:26 +00002365 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2366 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002367 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002368 NumAliases = 0;
2369 }
Craig Topper3164f332014-03-11 03:39:26 +00002370 void getGCCAddlRegNames(const AddlRegName *&Names,
2371 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002372 Names = AddlRegNames;
2373 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002374 }
Eric Christopherd9832702015-06-29 21:00:05 +00002375 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002376 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002377 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002378
Akira Hatanaka974131e2014-09-18 18:17:18 +00002379 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2380
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002381 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2382
Akira Hatanaka974131e2014-09-18 18:17:18 +00002383 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2384
Craig Topper3164f332014-03-11 03:39:26 +00002385 std::string convertConstraint(const char *&Constraint) const override;
2386 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002387 return "~{dirflag},~{fpsr},~{flags}";
2388 }
Craig Topper3164f332014-03-11 03:39:26 +00002389 void getTargetDefines(const LangOptions &Opts,
2390 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002391 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2392 bool Enabled);
2393 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2394 bool Enabled);
2395 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2396 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002397 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2398 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002399 setFeatureEnabledImpl(Features, Name, Enabled);
2400 }
2401 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002402 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002403 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2404 StringRef Name, bool Enabled);
Eric Christopheref1e2952015-08-28 02:13:58 +00002405 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2406 StringRef CPU,
Eric Christopher007b0a02015-08-28 22:32:01 +00002407 std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002408 bool hasFeature(StringRef Feature) const override;
2409 bool handleTargetFeatures(std::vector<std::string> &Features,
2410 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002411 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002412 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2413 return "avx512";
2414 else if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002415 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002416 else if (getTriple().getArch() == llvm::Triple::x86 &&
2417 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002418 return "no-mmx";
2419 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002420 }
Craig Topper3164f332014-03-11 03:39:26 +00002421 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002422 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002423
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002424 // Perform any per-CPU checks necessary to determine if this CPU is
2425 // acceptable.
2426 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2427 // invalid without explaining *why*.
2428 switch (CPU) {
2429 case CK_Generic:
2430 // No processor selected!
2431 return false;
2432
2433 case CK_i386:
2434 case CK_i486:
2435 case CK_WinChipC6:
2436 case CK_WinChip2:
2437 case CK_C3:
2438 case CK_i586:
2439 case CK_Pentium:
2440 case CK_PentiumMMX:
2441 case CK_i686:
2442 case CK_PentiumPro:
2443 case CK_Pentium2:
2444 case CK_Pentium3:
2445 case CK_Pentium3M:
2446 case CK_PentiumM:
2447 case CK_Yonah:
2448 case CK_C3_2:
2449 case CK_Pentium4:
2450 case CK_Pentium4M:
2451 case CK_Prescott:
2452 case CK_K6:
2453 case CK_K6_2:
2454 case CK_K6_3:
2455 case CK_Athlon:
2456 case CK_AthlonThunderbird:
2457 case CK_Athlon4:
2458 case CK_AthlonXP:
2459 case CK_AthlonMP:
2460 case CK_Geode:
2461 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002462 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002463 return false;
2464
2465 // Fallthrough
2466 case CK_Nocona:
2467 case CK_Core2:
2468 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002469 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002470 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002471 case CK_Nehalem:
2472 case CK_Westmere:
2473 case CK_SandyBridge:
2474 case CK_IvyBridge:
2475 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002476 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002477 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002478 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002479 case CK_Athlon64:
2480 case CK_Athlon64SSE3:
2481 case CK_AthlonFX:
2482 case CK_K8:
2483 case CK_K8SSE3:
2484 case CK_Opteron:
2485 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002486 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002487 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002488 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002489 case CK_BDVER1:
2490 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002491 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002492 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002493 case CK_x86_64:
2494 return true;
2495 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002496 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002497 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002498
Craig Topper3164f332014-03-11 03:39:26 +00002499 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002500
Craig Topper3164f332014-03-11 03:39:26 +00002501 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002502 // We accept all non-ARM calling conventions
2503 return (CC == CC_X86ThisCall ||
2504 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002505 CC == CC_X86StdCall ||
2506 CC == CC_X86VectorCall ||
2507 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002508 CC == CC_X86Pascal ||
2509 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002510 }
2511
Craig Topper3164f332014-03-11 03:39:26 +00002512 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002513 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002514 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002515
2516 bool hasSjLjLowering() const override {
2517 return true;
2518 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002519};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002520
Rafael Espindolaeb265472013-08-21 21:59:03 +00002521bool X86TargetInfo::setFPMath(StringRef Name) {
2522 if (Name == "387") {
2523 FPMath = FP_387;
2524 return true;
2525 }
2526 if (Name == "sse") {
2527 FPMath = FP_SSE;
2528 return true;
2529 }
2530 return false;
2531}
2532
Eric Christopher007b0a02015-08-28 22:32:01 +00002533bool X86TargetInfo::initFeatureMap(
2534 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
2535 std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002536 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002537 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002538 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002539 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002540
Eric Christopher2b4a7252015-08-27 00:05:52 +00002541 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002542 case CK_Generic:
2543 case CK_i386:
2544 case CK_i486:
2545 case CK_i586:
2546 case CK_Pentium:
2547 case CK_i686:
2548 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002549 break;
2550 case CK_PentiumMMX:
2551 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002552 case CK_K6:
2553 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002554 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002555 break;
2556 case CK_Pentium3:
2557 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002558 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002559 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002560 break;
2561 case CK_PentiumM:
2562 case CK_Pentium4:
2563 case CK_Pentium4M:
2564 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002565 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002566 break;
2567 case CK_Yonah:
2568 case CK_Prescott:
2569 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002570 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002571 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002572 break;
2573 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002574 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002575 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002576 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002577 break;
2578 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002579 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002580 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002581 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002582 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002583 setFeatureEnabledImpl(Features, "avx512f", true);
2584 setFeatureEnabledImpl(Features, "avx512cd", true);
2585 setFeatureEnabledImpl(Features, "avx512dq", true);
2586 setFeatureEnabledImpl(Features, "avx512bw", true);
2587 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002588 // FALLTHROUGH
2589 case CK_Broadwell:
2590 setFeatureEnabledImpl(Features, "rdseed", true);
2591 setFeatureEnabledImpl(Features, "adx", true);
2592 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002593 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002594 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002595 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002596 setFeatureEnabledImpl(Features, "bmi", true);
2597 setFeatureEnabledImpl(Features, "bmi2", true);
2598 setFeatureEnabledImpl(Features, "rtm", true);
2599 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002600 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002601 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002602 setFeatureEnabledImpl(Features, "rdrnd", true);
2603 setFeatureEnabledImpl(Features, "f16c", true);
2604 setFeatureEnabledImpl(Features, "fsgsbase", true);
2605 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002606 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002607 setFeatureEnabledImpl(Features, "avx", true);
2608 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002609 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002610 case CK_Silvermont:
2611 setFeatureEnabledImpl(Features, "aes", true);
2612 setFeatureEnabledImpl(Features, "pclmul", true);
2613 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002614 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002615 setFeatureEnabledImpl(Features, "sse4.2", true);
2616 setFeatureEnabledImpl(Features, "cx16", true);
2617 break;
2618 case CK_KNL:
2619 setFeatureEnabledImpl(Features, "avx512f", true);
2620 setFeatureEnabledImpl(Features, "avx512cd", true);
2621 setFeatureEnabledImpl(Features, "avx512er", true);
2622 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002623 setFeatureEnabledImpl(Features, "rdseed", true);
2624 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002625 setFeatureEnabledImpl(Features, "lzcnt", true);
2626 setFeatureEnabledImpl(Features, "bmi", true);
2627 setFeatureEnabledImpl(Features, "bmi2", true);
2628 setFeatureEnabledImpl(Features, "rtm", true);
2629 setFeatureEnabledImpl(Features, "fma", true);
2630 setFeatureEnabledImpl(Features, "rdrnd", true);
2631 setFeatureEnabledImpl(Features, "f16c", true);
2632 setFeatureEnabledImpl(Features, "fsgsbase", true);
2633 setFeatureEnabledImpl(Features, "aes", true);
2634 setFeatureEnabledImpl(Features, "pclmul", true);
2635 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002636 break;
2637 case CK_K6_2:
2638 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002639 case CK_WinChip2:
2640 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002641 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002642 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002643 case CK_Athlon:
2644 case CK_AthlonThunderbird:
2645 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002646 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002647 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002648 case CK_Athlon4:
2649 case CK_AthlonXP:
2650 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002651 setFeatureEnabledImpl(Features, "sse", true);
2652 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002653 break;
2654 case CK_K8:
2655 case CK_Opteron:
2656 case CK_Athlon64:
2657 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002658 setFeatureEnabledImpl(Features, "sse2", true);
2659 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002660 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002661 case CK_AMDFAM10:
2662 setFeatureEnabledImpl(Features, "sse4a", true);
2663 setFeatureEnabledImpl(Features, "lzcnt", true);
2664 setFeatureEnabledImpl(Features, "popcnt", true);
2665 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002666 case CK_K8SSE3:
2667 case CK_OpteronSSE3:
2668 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002669 setFeatureEnabledImpl(Features, "sse3", true);
2670 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002671 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002672 case CK_BTVER2:
2673 setFeatureEnabledImpl(Features, "avx", true);
2674 setFeatureEnabledImpl(Features, "aes", true);
2675 setFeatureEnabledImpl(Features, "pclmul", true);
2676 setFeatureEnabledImpl(Features, "bmi", true);
2677 setFeatureEnabledImpl(Features, "f16c", true);
2678 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002679 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002680 setFeatureEnabledImpl(Features, "ssse3", true);
2681 setFeatureEnabledImpl(Features, "sse4a", true);
2682 setFeatureEnabledImpl(Features, "lzcnt", true);
2683 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002684 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002685 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002686 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002687 case CK_BDVER4:
2688 setFeatureEnabledImpl(Features, "avx2", true);
2689 setFeatureEnabledImpl(Features, "bmi2", true);
2690 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002691 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002692 setFeatureEnabledImpl(Features, "fsgsbase", true);
2693 // FALLTHROUGH
2694 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002695 setFeatureEnabledImpl(Features, "bmi", true);
2696 setFeatureEnabledImpl(Features, "fma", true);
2697 setFeatureEnabledImpl(Features, "f16c", true);
2698 setFeatureEnabledImpl(Features, "tbm", true);
2699 // FALLTHROUGH
2700 case CK_BDVER1:
2701 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002702 setFeatureEnabledImpl(Features, "xop", true);
2703 setFeatureEnabledImpl(Features, "lzcnt", true);
2704 setFeatureEnabledImpl(Features, "aes", true);
2705 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002706 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002707 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002708 break;
Eli Friedman33465822011-07-08 23:31:17 +00002709 }
Eric Christopher007b0a02015-08-28 22:32:01 +00002710 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002711}
2712
Rafael Espindolae62e2792013-08-20 13:44:29 +00002713void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002714 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002715 if (Enabled) {
2716 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002717 case AVX512F:
2718 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002719 case AVX2:
2720 Features["avx2"] = true;
2721 case AVX:
2722 Features["avx"] = true;
2723 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002724 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002725 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002726 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002727 case SSSE3:
2728 Features["ssse3"] = true;
2729 case SSE3:
2730 Features["sse3"] = true;
2731 case SSE2:
2732 Features["sse2"] = true;
2733 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002734 Features["sse"] = true;
2735 case NoSSE:
2736 break;
2737 }
2738 return;
2739 }
2740
2741 switch (Level) {
2742 case NoSSE:
2743 case SSE1:
2744 Features["sse"] = false;
2745 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002746 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2747 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002748 case SSE3:
2749 Features["sse3"] = false;
2750 setXOPLevel(Features, NoXOP, false);
2751 case SSSE3:
2752 Features["ssse3"] = false;
2753 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002754 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002755 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002756 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002757 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002758 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002759 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002760 case AVX2:
2761 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002762 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002763 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002764 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2765 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002766 }
2767}
2768
2769void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002770 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002771 if (Enabled) {
2772 switch (Level) {
2773 case AMD3DNowAthlon:
2774 Features["3dnowa"] = true;
2775 case AMD3DNow:
2776 Features["3dnow"] = true;
2777 case MMX:
2778 Features["mmx"] = true;
2779 case NoMMX3DNow:
2780 break;
2781 }
2782 return;
2783 }
2784
2785 switch (Level) {
2786 case NoMMX3DNow:
2787 case MMX:
2788 Features["mmx"] = false;
2789 case AMD3DNow:
2790 Features["3dnow"] = false;
2791 case AMD3DNowAthlon:
2792 Features["3dnowa"] = false;
2793 }
2794}
2795
2796void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002797 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002798 if (Enabled) {
2799 switch (Level) {
2800 case XOP:
2801 Features["xop"] = true;
2802 case FMA4:
2803 Features["fma4"] = true;
2804 setSSELevel(Features, AVX, true);
2805 case SSE4A:
2806 Features["sse4a"] = true;
2807 setSSELevel(Features, SSE3, true);
2808 case NoXOP:
2809 break;
2810 }
2811 return;
2812 }
2813
2814 switch (Level) {
2815 case NoXOP:
2816 case SSE4A:
2817 Features["sse4a"] = false;
2818 case FMA4:
2819 Features["fma4"] = false;
2820 case XOP:
2821 Features["xop"] = false;
2822 }
2823}
2824
Craig Topper86d79ef2013-09-17 04:51:29 +00002825void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2826 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002827 // This is a bit of a hack to deal with the sse4 target feature when used
2828 // as part of the target attribute. We handle sse4 correctly everywhere
2829 // else. See below for more information on how we handle the sse4 options.
2830 if (Name != "sse4")
2831 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002832
Craig Topper29561122013-09-19 01:13:07 +00002833 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002834 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002835 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002836 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002837 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002838 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002839 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002840 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002841 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002842 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002843 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002844 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002845 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002846 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002847 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002848 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002849 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002850 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002851 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002852 if (Enabled)
2853 setSSELevel(Features, SSE2, Enabled);
2854 } else if (Name == "pclmul") {
2855 if (Enabled)
2856 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002857 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002858 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002859 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002860 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002861 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002862 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002863 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2864 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002865 if (Enabled)
2866 setSSELevel(Features, AVX512F, Enabled);
2867 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002868 if (Enabled)
2869 setSSELevel(Features, AVX, Enabled);
2870 } else if (Name == "fma4") {
2871 setXOPLevel(Features, FMA4, Enabled);
2872 } else if (Name == "xop") {
2873 setXOPLevel(Features, XOP, Enabled);
2874 } else if (Name == "sse4a") {
2875 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002876 } else if (Name == "f16c") {
2877 if (Enabled)
2878 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002879 } else if (Name == "sha") {
2880 if (Enabled)
2881 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002882 } else if (Name == "sse4") {
2883 // We can get here via the __target__ attribute since that's not controlled
2884 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2885 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2886 // disabled.
2887 if (Enabled)
2888 setSSELevel(Features, SSE42, Enabled);
2889 else
2890 setSSELevel(Features, SSE41, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002891 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002892}
2893
Eric Christopher3ff21b32013-10-16 21:26:26 +00002894/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002895/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002896bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002897 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00002898 for (const auto &Feature : Features) {
2899 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00002900 continue;
2901
Eric Christopher610fe112015-08-26 08:21:55 +00002902 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002903 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002904 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00002905 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002906 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002907 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002908 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002909 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002910 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00002911 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002912 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002913 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002914 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002915 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002916 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002917 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002918 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00002919 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002920 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00002921 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002922 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00002923 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002924 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00002925 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002926 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002927 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002928 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00002929 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002930 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00002931 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002932 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00002933 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002934 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00002935 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002936 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002937 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002938 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002939 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002940 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002941 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002942 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002943 HasAVX512VL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002944 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00002945 HasSHA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002946 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00002947 HasCX16 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002948 }
2949
Benjamin Kramer27402c62012-03-05 15:10:44 +00002950 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002951 .Case("+avx512f", AVX512F)
2952 .Case("+avx2", AVX2)
2953 .Case("+avx", AVX)
2954 .Case("+sse4.2", SSE42)
2955 .Case("+sse4.1", SSE41)
2956 .Case("+ssse3", SSSE3)
2957 .Case("+sse3", SSE3)
2958 .Case("+sse2", SSE2)
2959 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002960 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002961 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002962
Eli Friedman33465822011-07-08 23:31:17 +00002963 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002964 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002965 .Case("+3dnowa", AMD3DNowAthlon)
2966 .Case("+3dnow", AMD3DNow)
2967 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00002968 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002969 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002970
2971 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002972 .Case("+xop", XOP)
2973 .Case("+fma4", FMA4)
2974 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002975 .Default(NoXOP);
2976 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002977 }
Eli Friedman33465822011-07-08 23:31:17 +00002978
Craig Topper7481d8a2013-09-10 06:55:47 +00002979 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2980 // Can't do this earlier because we need to be able to explicitly enable
2981 // popcnt and still disable sse4.2.
2982 if (!HasPOPCNT && SSELevel >= SSE42 &&
2983 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2984 HasPOPCNT = true;
2985 Features.push_back("+popcnt");
2986 }
2987
Yunzhong Gao61089362013-10-16 19:07:02 +00002988 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2989 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2990 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2991 HasPRFCHW = true;
2992 Features.push_back("+prfchw");
2993 }
2994
Rafael Espindolaeb265472013-08-21 21:59:03 +00002995 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2996 // matches the selected sse level.
2997 if (FPMath == FP_SSE && SSELevel < SSE1) {
2998 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2999 return false;
3000 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
3001 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
3002 return false;
3003 }
3004
Eli Friedman33465822011-07-08 23:31:17 +00003005 // Don't tell the backend if we're turning off mmx; it will end up disabling
3006 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00003007 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3008 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00003009 std::vector<std::string>::iterator it;
3010 it = std::find(Features.begin(), Features.end(), "-mmx");
3011 if (it != Features.end())
3012 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00003013 else if (SSELevel > NoSSE)
3014 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Alexey Bataev00396512015-07-02 03:40:19 +00003015
3016 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003017 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003018 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003019}
Chris Lattnerecd49032009-03-02 22:27:17 +00003020
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003021/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3022/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003023void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003024 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003025 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003026 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003027 Builder.defineMacro("__amd64__");
3028 Builder.defineMacro("__amd64");
3029 Builder.defineMacro("__x86_64");
3030 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003031 if (getTriple().getArchName() == "x86_64h") {
3032 Builder.defineMacro("__x86_64h");
3033 Builder.defineMacro("__x86_64h__");
3034 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003035 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003036 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003037 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003038
Chris Lattnerecd49032009-03-02 22:27:17 +00003039 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003040 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3041 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003042 switch (CPU) {
3043 case CK_Generic:
3044 break;
3045 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003046 // The rest are coming from the i386 define above.
3047 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003048 break;
3049 case CK_i486:
3050 case CK_WinChipC6:
3051 case CK_WinChip2:
3052 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003053 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003054 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003055 case CK_PentiumMMX:
3056 Builder.defineMacro("__pentium_mmx__");
3057 Builder.defineMacro("__tune_pentium_mmx__");
3058 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003059 case CK_i586:
3060 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003061 defineCPUMacros(Builder, "i586");
3062 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003063 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003064 case CK_Pentium3:
3065 case CK_Pentium3M:
3066 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003067 Builder.defineMacro("__tune_pentium3__");
3068 // Fallthrough
3069 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003070 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003071 Builder.defineMacro("__tune_pentium2__");
3072 // Fallthrough
3073 case CK_PentiumPro:
3074 Builder.defineMacro("__tune_i686__");
3075 Builder.defineMacro("__tune_pentiumpro__");
3076 // Fallthrough
3077 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003078 Builder.defineMacro("__i686");
3079 Builder.defineMacro("__i686__");
3080 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3081 Builder.defineMacro("__pentiumpro");
3082 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003083 break;
3084 case CK_Pentium4:
3085 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003086 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003087 break;
3088 case CK_Yonah:
3089 case CK_Prescott:
3090 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003091 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003092 break;
3093 case CK_Core2:
3094 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003095 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003096 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003097 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003098 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003099 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003100 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003101 defineCPUMacros(Builder, "slm");
3102 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003103 case CK_Nehalem:
3104 case CK_Westmere:
3105 case CK_SandyBridge:
3106 case CK_IvyBridge:
3107 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003108 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003109 // FIXME: Historically, we defined this legacy name, it would be nice to
3110 // remove it at some point. We've never exposed fine-grained names for
3111 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003112 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003113 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003114 case CK_Skylake:
3115 // FIXME: Historically, we defined this legacy name, it would be nice to
3116 // remove it at some point. This is the only fine-grained CPU macro in the
3117 // main intel CPU line, and it would be better to not have these and force
3118 // people to use ISA macros.
3119 defineCPUMacros(Builder, "skx");
3120 break;
Craig Topper449314e2013-08-20 07:09:39 +00003121 case CK_KNL:
3122 defineCPUMacros(Builder, "knl");
3123 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003124 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003125 Builder.defineMacro("__k6_2__");
3126 Builder.defineMacro("__tune_k6_2__");
3127 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003128 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003129 if (CPU != CK_K6_2) { // In case of fallthrough
3130 // FIXME: GCC may be enabling these in cases where some other k6
3131 // architecture is specified but -m3dnow is explicitly provided. The
3132 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003133 Builder.defineMacro("__k6_3__");
3134 Builder.defineMacro("__tune_k6_3__");
3135 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003136 // Fallthrough
3137 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003138 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003139 break;
3140 case CK_Athlon:
3141 case CK_AthlonThunderbird:
3142 case CK_Athlon4:
3143 case CK_AthlonXP:
3144 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003145 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003146 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003147 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003148 Builder.defineMacro("__tune_athlon_sse__");
3149 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003150 break;
3151 case CK_K8:
3152 case CK_K8SSE3:
3153 case CK_x86_64:
3154 case CK_Opteron:
3155 case CK_OpteronSSE3:
3156 case CK_Athlon64:
3157 case CK_Athlon64SSE3:
3158 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003159 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003160 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003161 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003162 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003163 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003164 case CK_BTVER1:
3165 defineCPUMacros(Builder, "btver1");
3166 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003167 case CK_BTVER2:
3168 defineCPUMacros(Builder, "btver2");
3169 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003170 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003171 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003172 break;
3173 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003174 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003175 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003176 case CK_BDVER3:
3177 defineCPUMacros(Builder, "bdver3");
3178 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003179 case CK_BDVER4:
3180 defineCPUMacros(Builder, "bdver4");
3181 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003182 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003183 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003184 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003185 }
Chris Lattner96e43572009-03-02 22:40:39 +00003186
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003187 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003188 Builder.defineMacro("__REGISTER_PREFIX__", "");
3189
Chris Lattner6df41af2009-04-19 17:32:33 +00003190 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3191 // functions in glibc header files that use FP Stack inline asm which the
3192 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003193 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003194
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003195 if (HasAES)
3196 Builder.defineMacro("__AES__");
3197
Craig Topper3f122a72012-05-31 05:18:48 +00003198 if (HasPCLMUL)
3199 Builder.defineMacro("__PCLMUL__");
3200
Craig Topper22967d42011-12-25 05:06:45 +00003201 if (HasLZCNT)
3202 Builder.defineMacro("__LZCNT__");
3203
Benjamin Kramer1e250392012-07-07 09:39:18 +00003204 if (HasRDRND)
3205 Builder.defineMacro("__RDRND__");
3206
Craig Topper8c7f2512014-11-03 06:51:41 +00003207 if (HasFSGSBASE)
3208 Builder.defineMacro("__FSGSBASE__");
3209
Craig Topper22967d42011-12-25 05:06:45 +00003210 if (HasBMI)
3211 Builder.defineMacro("__BMI__");
3212
3213 if (HasBMI2)
3214 Builder.defineMacro("__BMI2__");
3215
Craig Topper1de83482011-12-29 16:10:46 +00003216 if (HasPOPCNT)
3217 Builder.defineMacro("__POPCNT__");
3218
Michael Liao625a8752012-11-10 05:17:46 +00003219 if (HasRTM)
3220 Builder.defineMacro("__RTM__");
3221
Michael Liao74f4eaf2013-03-26 17:52:08 +00003222 if (HasPRFCHW)
3223 Builder.defineMacro("__PRFCHW__");
3224
Michael Liaoffaae352013-03-29 05:17:55 +00003225 if (HasRDSEED)
3226 Builder.defineMacro("__RDSEED__");
3227
Robert Khasanov50e6f582014-09-19 09:53:48 +00003228 if (HasADX)
3229 Builder.defineMacro("__ADX__");
3230
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003231 if (HasTBM)
3232 Builder.defineMacro("__TBM__");
3233
Rafael Espindolae62e2792013-08-20 13:44:29 +00003234 switch (XOPLevel) {
3235 case XOP:
3236 Builder.defineMacro("__XOP__");
3237 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003238 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003239 case SSE4A:
3240 Builder.defineMacro("__SSE4A__");
3241 case NoXOP:
3242 break;
3243 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003244
Craig Topperbba778b2012-06-03 21:46:30 +00003245 if (HasFMA)
3246 Builder.defineMacro("__FMA__");
3247
Manman Rena45358c2012-10-11 00:59:55 +00003248 if (HasF16C)
3249 Builder.defineMacro("__F16C__");
3250
Craig Topper679b53a2013-08-21 05:29:10 +00003251 if (HasAVX512CD)
3252 Builder.defineMacro("__AVX512CD__");
3253 if (HasAVX512ER)
3254 Builder.defineMacro("__AVX512ER__");
3255 if (HasAVX512PF)
3256 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003257 if (HasAVX512DQ)
3258 Builder.defineMacro("__AVX512DQ__");
3259 if (HasAVX512BW)
3260 Builder.defineMacro("__AVX512BW__");
3261 if (HasAVX512VL)
3262 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003263
Ben Langmuir58078d02013-09-19 13:22:04 +00003264 if (HasSHA)
3265 Builder.defineMacro("__SHA__");
3266
Nick Lewycky50e8f482013-10-05 20:14:27 +00003267 if (HasCX16)
3268 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3269
Chris Lattner96e43572009-03-02 22:40:39 +00003270 // Each case falls through to the previous one here.
3271 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003272 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003273 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003274 case AVX2:
3275 Builder.defineMacro("__AVX2__");
3276 case AVX:
3277 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003278 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003279 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003280 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003281 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003282 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003283 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003284 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003285 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003286 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003287 Builder.defineMacro("__SSE2__");
3288 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003289 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003290 Builder.defineMacro("__SSE__");
3291 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003292 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003293 break;
3294 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003295
Derek Schuffc7dd7222012-10-11 15:52:22 +00003296 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003297 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003298 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003299 case AVX2:
3300 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003301 case SSE42:
3302 case SSE41:
3303 case SSSE3:
3304 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003305 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003306 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003307 break;
3308 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003309 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003310 break;
3311 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003312 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003313 }
3314 }
3315
Anders Carlssone437c682010-01-27 03:47:49 +00003316 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003317 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003318 case AMD3DNowAthlon:
3319 Builder.defineMacro("__3dNOW_A__");
3320 case AMD3DNow:
3321 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003322 case MMX:
3323 Builder.defineMacro("__MMX__");
3324 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003325 break;
3326 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003327
3328 if (CPU >= CK_i486) {
3329 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3330 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3331 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3332 }
3333 if (CPU >= CK_i586)
3334 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003335}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003336
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003337bool X86TargetInfo::hasFeature(StringRef Feature) const {
3338 return llvm::StringSwitch<bool>(Feature)
3339 .Case("aes", HasAES)
3340 .Case("avx", SSELevel >= AVX)
3341 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003342 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003343 .Case("avx512cd", HasAVX512CD)
3344 .Case("avx512er", HasAVX512ER)
3345 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003346 .Case("avx512dq", HasAVX512DQ)
3347 .Case("avx512bw", HasAVX512BW)
3348 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003349 .Case("bmi", HasBMI)
3350 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003351 .Case("cx16", HasCX16)
3352 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003353 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003354 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003355 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003356 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003357 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3358 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3359 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003360 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003361 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003362 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003363 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003364 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003365 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003366 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003367 .Case("sse", SSELevel >= SSE1)
3368 .Case("sse2", SSELevel >= SSE2)
3369 .Case("sse3", SSELevel >= SSE3)
3370 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003371 .Case("sse4.1", SSELevel >= SSE41)
3372 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003373 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003374 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003375 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003376 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3377 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003378 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003379 .Default(false);
3380}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003381
Eric Christopherd9832702015-06-29 21:00:05 +00003382// We can't use a generic validation scheme for the features accepted here
3383// versus subtarget features accepted in the target attribute because the
3384// bitfield structure that's initialized in the runtime only supports the
3385// below currently rather than the full range of subtarget features. (See
3386// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3387bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3388 return llvm::StringSwitch<bool>(FeatureStr)
3389 .Case("cmov", true)
3390 .Case("mmx", true)
3391 .Case("popcnt", true)
3392 .Case("sse", true)
3393 .Case("sse2", true)
3394 .Case("sse3", true)
3395 .Case("sse4.1", true)
3396 .Case("sse4.2", true)
3397 .Case("avx", true)
3398 .Case("avx2", true)
3399 .Case("sse4a", true)
3400 .Case("fma4", true)
3401 .Case("xop", true)
3402 .Case("fma", true)
3403 .Case("avx512f", true)
3404 .Case("bmi", true)
3405 .Case("bmi2", true)
3406 .Default(false);
3407}
3408
Eli Friedman3fd920a2008-08-20 02:34:37 +00003409bool
Anders Carlsson58436352009-02-28 17:11:49 +00003410X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003411 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003412 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003413 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003414 // Constant constraints.
3415 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3416 // instructions.
3417 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3418 // x86_64 instructions.
3419 case 's':
3420 Info.setRequiresImmediate();
3421 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003422 case 'I':
3423 Info.setRequiresImmediate(0, 31);
3424 return true;
3425 case 'J':
3426 Info.setRequiresImmediate(0, 63);
3427 return true;
3428 case 'K':
3429 Info.setRequiresImmediate(-128, 127);
3430 return true;
3431 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003432 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003433 return true;
3434 case 'M':
3435 Info.setRequiresImmediate(0, 3);
3436 return true;
3437 case 'N':
3438 Info.setRequiresImmediate(0, 255);
3439 return true;
3440 case 'O':
3441 Info.setRequiresImmediate(0, 127);
3442 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003443 // Register constraints.
3444 case 'Y': // 'Y' is the first character for several 2-character constraints.
3445 // Shift the pointer to the second character of the constraint.
3446 Name++;
3447 switch (*Name) {
3448 default:
3449 return false;
3450 case '0': // First SSE register.
3451 case 't': // Any SSE register, when SSE2 is enabled.
3452 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3453 case 'm': // Any MMX register, when inter-unit moves enabled.
3454 Info.setAllowsRegister();
3455 return true;
3456 }
3457 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003458 // Constraint 'f' cannot be used for output operands.
3459 if (Info.ConstraintStr[0] == '=')
3460 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003461 Info.setAllowsRegister();
3462 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003463 case 'a': // eax.
3464 case 'b': // ebx.
3465 case 'c': // ecx.
3466 case 'd': // edx.
3467 case 'S': // esi.
3468 case 'D': // edi.
3469 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003470 case 't': // Top of floating point stack.
3471 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003472 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003473 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003474 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003475 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003476 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3477 case 'l': // "Index" registers: any general register that can be used as an
3478 // index in a base+index memory access.
3479 Info.setAllowsRegister();
3480 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003481 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003482 case 'C': // SSE floating point constant.
3483 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003484 return true;
3485 }
3486}
3487
Akira Hatanaka974131e2014-09-18 18:17:18 +00003488bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3489 unsigned Size) const {
3490 // Strip off constraint modifiers.
3491 while (Constraint[0] == '=' ||
3492 Constraint[0] == '+' ||
3493 Constraint[0] == '&')
3494 Constraint = Constraint.substr(1);
3495
3496 return validateOperandSize(Constraint, Size);
3497}
3498
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003499bool X86TargetInfo::validateInputSize(StringRef Constraint,
3500 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003501 return validateOperandSize(Constraint, Size);
3502}
3503
3504bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3505 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003506 switch (Constraint[0]) {
3507 default: break;
3508 case 'y':
3509 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003510 case 'f':
3511 case 't':
3512 case 'u':
3513 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003514 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003515 if (SSELevel >= AVX512F)
3516 // 512-bit zmm registers can be used if target supports AVX512F.
3517 return Size <= 512U;
3518 else if (SSELevel >= AVX)
3519 // 256-bit ymm registers can be used if target supports AVX.
3520 return Size <= 256U;
3521 return Size <= 128U;
3522 case 'Y':
3523 // 'Y' is the first character for several 2-character constraints.
3524 switch (Constraint[1]) {
3525 default: break;
3526 case 'm':
3527 // 'Ym' is synonymous with 'y'.
3528 return Size <= 64;
3529 case 'i':
3530 case 't':
3531 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3532 if (SSELevel >= AVX512F)
3533 return Size <= 512U;
3534 else if (SSELevel >= AVX)
3535 return Size <= 256U;
3536 return SSELevel >= SSE2 && Size <= 128U;
3537 }
3538
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003539 }
3540
3541 return true;
3542}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003543
Eli Friedman3fd920a2008-08-20 02:34:37 +00003544std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003545X86TargetInfo::convertConstraint(const char *&Constraint) const {
3546 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003547 case 'a': return std::string("{ax}");
3548 case 'b': return std::string("{bx}");
3549 case 'c': return std::string("{cx}");
3550 case 'd': return std::string("{dx}");
3551 case 'S': return std::string("{si}");
3552 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003553 case 'p': // address
3554 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003555 case 't': // top of floating point stack.
3556 return std::string("{st}");
3557 case 'u': // second from top of floating point stack.
3558 return std::string("{st(1)}"); // second from top of floating point stack.
3559 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003560 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003561 }
3562}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003563
Eli Friedman3fd920a2008-08-20 02:34:37 +00003564// X86-32 generic target
3565class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003566public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003567 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003568 DoubleAlign = LongLongAlign = 32;
3569 LongDoubleWidth = 96;
3570 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003571 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003572 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003573 SizeType = UnsignedInt;
3574 PtrDiffType = SignedInt;
3575 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003576 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003577
3578 // Use fpret for all types.
3579 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3580 (1 << TargetInfo::Double) |
3581 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003582
3583 // x86-32 has atomics up to 8 bytes
3584 // FIXME: Check that we actually have cmpxchg8b before setting
3585 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3586 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003587 }
Craig Topper3164f332014-03-11 03:39:26 +00003588 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003589 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003590 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003591
Craig Topper3164f332014-03-11 03:39:26 +00003592 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003593 if (RegNo == 0) return 0;
3594 if (RegNo == 1) return 2;
3595 return -1;
3596 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003597 bool validateOperandSize(StringRef Constraint,
3598 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003599 switch (Constraint[0]) {
3600 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003601 case 'R':
3602 case 'q':
3603 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003604 case 'a':
3605 case 'b':
3606 case 'c':
3607 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003608 case 'S':
3609 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003610 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003611 case 'A':
3612 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003613 }
3614
Akira Hatanaka974131e2014-09-18 18:17:18 +00003615 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003616 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003617};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003618
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003619class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3620public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003621 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3622 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003623
Craig Topper3164f332014-03-11 03:39:26 +00003624 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003625 unsigned Major, Minor, Micro;
3626 getTriple().getOSVersion(Major, Minor, Micro);
3627 // New NetBSD uses the default rounding mode.
3628 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3629 return X86_32TargetInfo::getFloatEvalMethod();
3630 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003631 return 1;
3632 }
3633};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003634
Eli Friedmane3aa4542009-07-05 18:47:56 +00003635class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3636public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003637 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3638 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003639 SizeType = UnsignedLong;
3640 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003641 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003642 }
3643};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003644
Eli Friedman9fa28852012-08-08 23:57:20 +00003645class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3646public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003647 BitrigI386TargetInfo(const llvm::Triple &Triple)
3648 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003649 SizeType = UnsignedLong;
3650 IntPtrType = SignedLong;
3651 PtrDiffType = SignedLong;
3652 }
3653};
Eli Friedman9fa28852012-08-08 23:57:20 +00003654
Torok Edwinb2b37c62009-06-30 17:10:35 +00003655class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003656public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003657 DarwinI386TargetInfo(const llvm::Triple &Triple)
3658 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003659 LongDoubleWidth = 128;
3660 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003661 SuitableAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003662 SizeType = UnsignedLong;
3663 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003664 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003665 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003666 }
3667
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003668 bool handleTargetFeatures(std::vector<std::string> &Features,
3669 DiagnosticsEngine &Diags) override {
3670 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3671 Diags))
3672 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003673 // We now know the features we have: we can decide how to align vectors.
3674 MaxVectorAlign =
3675 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003676 return true;
3677 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003678};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003679
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003680// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003681class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003682public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003683 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3684 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003685 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003686 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003687 bool IsWinCOFF =
3688 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003689 DataLayoutString = IsWinCOFF
3690 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3691 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003692 }
Craig Topper3164f332014-03-11 03:39:26 +00003693 void getTargetDefines(const LangOptions &Opts,
3694 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003695 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3696 }
3697};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003698
3699// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003700class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003701public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003702 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003703 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003704 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003705 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3706 }
Craig Topper3164f332014-03-11 03:39:26 +00003707 void getTargetDefines(const LangOptions &Opts,
3708 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003709 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3710 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3711 // The value of the following reflects processor type.
3712 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3713 // We lost the original triple, so we use the default.
3714 Builder.defineMacro("_M_IX86", "600");
3715 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003716};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003717
David Majnemerae1ed0e2015-05-28 04:36:18 +00003718static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3719 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang supports
Reid Kleckner47606832014-04-21 20:58:00 +00003720 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3721 // macro anyway for pre-processor compatibility.
3722 if (Opts.MicrosoftExt)
3723 Builder.defineMacro("__declspec", "__declspec");
3724 else
3725 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3726
3727 if (!Opts.MicrosoftExt) {
3728 // Provide macros for all the calling convention keywords. Provide both
3729 // single and double underscore prefixed variants. These are available on
3730 // x64 as well as x86, even though they have no effect.
3731 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3732 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003733 std::string GCCSpelling = "__attribute__((__";
3734 GCCSpelling += CC;
3735 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003736 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3737 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3738 }
3739 }
3740}
3741
David Majnemerae1ed0e2015-05-28 04:36:18 +00003742static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3743 Builder.defineMacro("__MSVCRT__");
3744 Builder.defineMacro("__MINGW32__");
3745 addCygMingDefines(Opts, Builder);
3746}
3747
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003748// x86-32 MinGW target
3749class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3750public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003751 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003752 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003753 void getTargetDefines(const LangOptions &Opts,
3754 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003755 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003756 DefineStd(Builder, "WIN32", Opts);
3757 DefineStd(Builder, "WINNT", Opts);
3758 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003759 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003760 }
3761};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003762
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003763// x86-32 Cygwin target
3764class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3765public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003766 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3767 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003768 TLSSupported = false;
3769 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003770 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003771 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 +00003772 }
Craig Topper3164f332014-03-11 03:39:26 +00003773 void getTargetDefines(const LangOptions &Opts,
3774 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003775 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003776 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003777 Builder.defineMacro("__CYGWIN__");
3778 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003779 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003780 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003781 if (Opts.CPlusPlus)
3782 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003783 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003784};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003785
Chris Lattnerb986aba2010-04-11 19:29:39 +00003786// x86-32 Haiku target
3787class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3788public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003789 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003790 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003791 IntPtrType = SignedLong;
3792 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003793 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003794 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003795 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003796 }
Craig Topper3164f332014-03-11 03:39:26 +00003797 void getTargetDefines(const LangOptions &Opts,
3798 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003799 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3800 Builder.defineMacro("__INTEL__");
3801 Builder.defineMacro("__HAIKU__");
3802 }
3803};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003804
Douglas Gregor9fabd852011-07-01 22:41:14 +00003805// RTEMS Target
3806template<typename Target>
3807class RTEMSTargetInfo : public OSTargetInfo<Target> {
3808protected:
Craig Topper3164f332014-03-11 03:39:26 +00003809 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3810 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003811 // RTEMS defines; list based off of gcc output
3812
Douglas Gregor9fabd852011-07-01 22:41:14 +00003813 Builder.defineMacro("__rtems__");
3814 Builder.defineMacro("__ELF__");
3815 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003816
Douglas Gregor9fabd852011-07-01 22:41:14 +00003817public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003818 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3819 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003820
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003821 switch (Triple.getArch()) {
3822 default:
3823 case llvm::Triple::x86:
3824 // this->MCountName = ".mcount";
3825 break;
3826 case llvm::Triple::mips:
3827 case llvm::Triple::mipsel:
3828 case llvm::Triple::ppc:
3829 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003830 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003831 // this->MCountName = "_mcount";
3832 break;
3833 case llvm::Triple::arm:
3834 // this->MCountName = "__mcount";
3835 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003836 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003837 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003838};
3839
Douglas Gregor9fabd852011-07-01 22:41:14 +00003840// x86-32 RTEMS target
3841class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3842public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003843 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003844 SizeType = UnsignedLong;
3845 IntPtrType = SignedLong;
3846 PtrDiffType = SignedLong;
3847 this->UserLabelPrefix = "";
3848 }
Craig Topper3164f332014-03-11 03:39:26 +00003849 void getTargetDefines(const LangOptions &Opts,
3850 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003851 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3852 Builder.defineMacro("__INTEL__");
3853 Builder.defineMacro("__rtems__");
3854 }
3855};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003856
Eli Friedman3fd920a2008-08-20 02:34:37 +00003857// x86-64 generic target
3858class X86_64TargetInfo : public X86TargetInfo {
3859public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003860 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003861 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003862 bool IsWinCOFF =
3863 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003864 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003865 LongDoubleWidth = 128;
3866 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003867 LargeArrayMinWidth = 128;
3868 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003869 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003870 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3871 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3872 IntPtrType = IsX32 ? SignedInt : SignedLong;
3873 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003874 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003875 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003876
Eric Christopher917e9522014-11-18 22:36:15 +00003877 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003878 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3879 : IsWinCOFF
3880 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3881 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003882
3883 // Use fpret only for long double.
3884 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003885
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003886 // Use fp2ret for _Complex long double.
3887 ComplexLongDoubleUsesFP2Ret = true;
3888
Charles Davisc7d5c942015-09-17 20:55:33 +00003889 // Make __builtin_ms_va_list available.
3890 HasBuiltinMSVaList = true;
3891
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003892 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003893 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003894 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003895 }
Craig Topper3164f332014-03-11 03:39:26 +00003896 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003897 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003898 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003899
Craig Topper3164f332014-03-11 03:39:26 +00003900 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003901 if (RegNo == 0) return 0;
3902 if (RegNo == 1) return 1;
3903 return -1;
3904 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003905
Craig Topper3164f332014-03-11 03:39:26 +00003906 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003907 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003908 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003909 CC == CC_IntelOclBicc ||
3910 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003911 }
3912
Craig Topper3164f332014-03-11 03:39:26 +00003913 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003914 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003915 }
3916
Pavel Chupinfd223e12014-08-04 12:39:43 +00003917 // for x32 we need it here explicitly
3918 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003919};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003920
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003921// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003922class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003923public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003924 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3925 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003926 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003927 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003928 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003929 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003930 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003931 SizeType = UnsignedLongLong;
3932 PtrDiffType = SignedLongLong;
3933 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003934 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003935 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003936
Craig Topper3164f332014-03-11 03:39:26 +00003937 void getTargetDefines(const LangOptions &Opts,
3938 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003939 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003940 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003941 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003942
Craig Topper3164f332014-03-11 03:39:26 +00003943 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003944 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003945 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003946
Craig Topper3164f332014-03-11 03:39:26 +00003947 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003948 switch (CC) {
3949 case CC_X86StdCall:
3950 case CC_X86ThisCall:
3951 case CC_X86FastCall:
3952 return CCCR_Ignore;
3953 case CC_C:
3954 case CC_X86VectorCall:
3955 case CC_IntelOclBicc:
3956 case CC_X86_64SysV:
3957 return CCCR_OK;
3958 default:
3959 return CCCR_Warning;
3960 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003961 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003962};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003963
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003964// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003965class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003966public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003967 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003968 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003969 LongDoubleWidth = LongDoubleAlign = 64;
3970 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003971 }
Craig Topper3164f332014-03-11 03:39:26 +00003972 void getTargetDefines(const LangOptions &Opts,
3973 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003974 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3975 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00003976 Builder.defineMacro("_M_X64", "100");
3977 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003978 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003979};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003980
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003981// x86-64 MinGW target
3982class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3983public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003984 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Yaron Keren480bc9f2015-08-20 21:51:46 +00003985 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003986 void getTargetDefines(const LangOptions &Opts,
3987 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003988 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003989 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003990 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003991 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003992
3993 // GCC defines this macro when it is using __gxx_personality_seh0.
3994 if (!Opts.SjLjExceptions)
3995 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003996 }
3997};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003998
Yaron Kerend030d112015-07-22 17:38:19 +00003999// x86-64 Cygwin target
4000class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4001public:
4002 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4003 : X86_64TargetInfo(Triple) {
4004 TLSSupported = false;
4005 WCharType = UnsignedShort;
4006 }
4007 void getTargetDefines(const LangOptions &Opts,
4008 MacroBuilder &Builder) const override {
4009 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4010 Builder.defineMacro("__x86_64__");
4011 Builder.defineMacro("__CYGWIN__");
4012 Builder.defineMacro("__CYGWIN64__");
4013 addCygMingDefines(Opts, Builder);
4014 DefineStd(Builder, "unix", Opts);
4015 if (Opts.CPlusPlus)
4016 Builder.defineMacro("_GNU_SOURCE");
4017
4018 // GCC defines this macro when it is using __gxx_personality_seh0.
4019 if (!Opts.SjLjExceptions)
4020 Builder.defineMacro("__SEH__");
4021 }
4022};
4023
Eli Friedman2857ccb2009-07-01 03:36:11 +00004024class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4025public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004026 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4027 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004028 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004029 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4030 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004031 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004032 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004033 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004034 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004035
4036 bool handleTargetFeatures(std::vector<std::string> &Features,
4037 DiagnosticsEngine &Diags) override {
4038 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4039 Diags))
4040 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004041 // We now know the features we have: we can decide how to align vectors.
4042 MaxVectorAlign =
4043 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004044 return true;
4045 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004046};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004047
Eli Friedman245f2292009-07-05 22:31:18 +00004048class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4049public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004050 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4051 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004052 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004053 Int64Type = SignedLongLong;
4054 }
4055};
Eli Friedman245f2292009-07-05 22:31:18 +00004056
Eli Friedman9fa28852012-08-08 23:57:20 +00004057class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4058public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004059 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4060 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4061 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004062 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004063 }
4064};
Tim Northover9bb857a2013-01-31 12:13:10 +00004065
Eli Friedmanf05b7722008-08-20 07:44:10 +00004066class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004067 // Possible FPU choices.
4068 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004069 VFP2FPU = (1 << 0),
4070 VFP3FPU = (1 << 1),
4071 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004072 NeonFPU = (1 << 3),
4073 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004074 };
4075
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004076 // Possible HWDiv features.
4077 enum HWDivMode {
4078 HWDivThumb = (1 << 0),
4079 HWDivARM = (1 << 1)
4080 };
4081
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004082 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004083 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004084 }
4085
4086 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4087 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004088
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004089 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004090
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004091 StringRef DefaultCPU;
4092 StringRef CPUProfile;
4093 StringRef CPUAttr;
4094
Rafael Espindolaeb265472013-08-21 21:59:03 +00004095 enum {
4096 FP_Default,
4097 FP_VFP,
4098 FP_Neon
4099 } FPMath;
4100
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004101 unsigned ArchISA;
4102 unsigned ArchKind;
4103 unsigned ArchProfile;
4104 unsigned ArchVersion;
4105
Bernard Ogdenda13af32013-10-24 18:32:51 +00004106 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004107
Logan Chien57086ce2012-10-10 06:56:20 +00004108 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004109 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004110
4111 // Initialized via features.
4112 unsigned SoftFloat : 1;
4113 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004114
Bernard Ogden18b57012013-10-29 09:47:51 +00004115 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004116 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004117 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004118 unsigned Unaligned : 1;
4119
4120 enum {
4121 LDREX_B = (1 << 0), /// byte (8-bit)
4122 LDREX_H = (1 << 1), /// half (16-bit)
4123 LDREX_W = (1 << 2), /// word (32-bit)
4124 LDREX_D = (1 << 3), /// double (64-bit)
4125 };
4126
4127 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004128
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004129 // ACLE 6.5.1 Hardware floating point
4130 enum {
4131 HW_FP_HP = (1 << 1), /// half (16-bit)
4132 HW_FP_SP = (1 << 2), /// single (32-bit)
4133 HW_FP_DP = (1 << 3), /// double (64-bit)
4134 };
4135 uint32_t HW_FP;
4136
Chris Lattner5cc15e02010-03-03 19:03:45 +00004137 static const Builtin::Info BuiltinInfo[];
4138
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004139 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004140 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004141
4142 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004143 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004144
Renato Golin9ba39232015-02-27 16:35:48 +00004145 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4146 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4147 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004148 SizeType = UnsignedLong;
4149 else
4150 SizeType = UnsignedInt;
4151
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004152 switch (T.getOS()) {
4153 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004154 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004155 break;
4156 case llvm::Triple::Win32:
4157 WCharType = UnsignedShort;
4158 break;
4159 case llvm::Triple::Linux:
4160 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004161 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4162 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004163 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004164 }
4165
4166 UseBitFieldTypeAlignment = true;
4167
4168 ZeroLengthBitfieldBoundary = 0;
4169
Tim Northover147cd2f2014-10-14 22:12:21 +00004170 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4171 // so set preferred for small types to 32.
4172 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004173 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004174 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4175 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4176 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004177 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004178 DataLayoutString = "e"
4179 "-m:w"
4180 "-p:32:32"
4181 "-i64:64"
4182 "-v128:64:128"
4183 "-a:0:32"
4184 "-n32"
4185 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004186 } else if (T.isOSNaCl()) {
4187 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004188 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004189 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004190 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004191 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4192 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004193 }
4194
4195 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004196 }
4197
4198 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004199 const llvm::Triple &T = getTriple();
4200
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004201 IsAAPCS = false;
4202
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004203 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004204
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004205 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004206 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004207 SizeType = UnsignedInt;
4208 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004209 SizeType = UnsignedLong;
4210
4211 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4212 WCharType = SignedInt;
4213
4214 // Do not respect the alignment of bit-field types when laying out
4215 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4216 UseBitFieldTypeAlignment = false;
4217
4218 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4219 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4220 /// gcc.
4221 ZeroLengthBitfieldBoundary = 32;
4222
Tim Northover147cd2f2014-10-14 22:12:21 +00004223 if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004224 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004225 BigEndian
4226 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4227 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4228 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004229 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004230 BigEndian
4231 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4232 : "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 +00004233
4234 // FIXME: Override "preferred align" for double and long long.
4235 }
4236
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004237 void setArchInfo() {
4238 StringRef ArchName = getTriple().getArchName();
4239
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004240 ArchISA = llvm::ARM::parseArchISA(ArchName);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004241 DefaultCPU = getDefaultCPU(ArchName);
4242
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004243 unsigned ArchKind = llvm::ARM::parseArch(ArchName);
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004244 if (ArchKind == llvm::ARM::AK_INVALID)
4245 // set arch of the CPU, either provided explicitly or hardcoded default
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004246 ArchKind = llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004247 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004248 }
4249
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004250 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004251 StringRef SubArch;
4252
4253 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004254 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004255 SubArch = llvm::ARM::getSubArch(ArchKind);
4256 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4257 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004258
4259 // cache CPU related strings
4260 CPUAttr = getCPUAttr();
4261 CPUProfile = getCPUProfile();
4262 }
4263
4264 void setAtomic() {
4265 // when triple does not specify a sub arch,
4266 // then we are not using inline atomics
4267 bool ShouldUseInlineAtomic = DefaultCPU.empty() ?
4268 false :
4269 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4270 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
4271 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4272 if (ArchProfile == llvm::ARM::PK_M) {
4273 MaxAtomicPromoteWidth = 32;
4274 if (ShouldUseInlineAtomic)
4275 MaxAtomicInlineWidth = 32;
4276 }
4277 else {
4278 MaxAtomicPromoteWidth = 64;
4279 if (ShouldUseInlineAtomic)
4280 MaxAtomicInlineWidth = 64;
4281 }
4282 }
4283
4284 bool isThumb() const {
4285 return (ArchISA == llvm::ARM::IK_THUMB);
4286 }
4287
4288 bool supportsThumb() const {
4289 return CPUAttr.count('T') || ArchVersion >= 6;
4290 }
4291
4292 bool supportsThumb2() const {
4293 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4294 }
4295
4296 StringRef getDefaultCPU(StringRef ArchName) const {
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004297 return llvm::ARM::getDefaultCPU(ArchName);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004298 }
4299
4300 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004301 // For most sub-arches, the build attribute CPU name is enough.
4302 // For Cortex variants, it's slightly different.
4303 switch(ArchKind) {
4304 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004305 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004306 case llvm::ARM::AK_ARMV6M:
4307 case llvm::ARM::AK_ARMV6SM:
4308 case llvm::ARM::AK_ARMV6HL:
4309 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004310 case llvm::ARM::AK_ARMV7S:
4311 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004312 case llvm::ARM::AK_ARMV7:
4313 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004314 case llvm::ARM::AK_ARMV7L:
4315 case llvm::ARM::AK_ARMV7HL:
4316 return "7A";
4317 case llvm::ARM::AK_ARMV7R:
4318 return "7R";
4319 case llvm::ARM::AK_ARMV7M:
4320 return "7M";
4321 case llvm::ARM::AK_ARMV7EM:
4322 return "7EM";
4323 case llvm::ARM::AK_ARMV8A:
4324 return "8A";
4325 case llvm::ARM::AK_ARMV8_1A:
4326 return "8_1A";
4327 }
4328 }
4329
4330 StringRef getCPUProfile() const {
4331 switch(ArchProfile) {
4332 case llvm::ARM::PK_A:
4333 return "A";
4334 case llvm::ARM::PK_R:
4335 return "R";
4336 case llvm::ARM::PK_M:
4337 return "M";
4338 default:
4339 return "";
4340 }
4341 }
4342
Chris Lattner17df24e2008-04-21 18:56:49 +00004343public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004344 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004345 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004346 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004347 BigEndian = IsBigEndian;
4348
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004349 switch (getTriple().getOS()) {
4350 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004351 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004352 break;
4353 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004354 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004355 break;
4356 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004357
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004358 // cache arch related info
4359 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004360
Chris Lattner1a8f3942010-04-23 16:29:58 +00004361 // {} in inline assembly are neon specifiers, not assembly variant
4362 // specifiers.
4363 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004364
Eric Christopher0e261882014-12-05 01:06:59 +00004365 // FIXME: This duplicates code from the driver that sets the -target-abi
4366 // option - this code is used if -target-abi isn't passed and should
4367 // be unified in some way.
4368 if (Triple.isOSBinFormatMachO()) {
4369 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4370 // the frontend matches that.
4371 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4372 Triple.getOS() == llvm::Triple::UnknownOS ||
4373 StringRef(CPU).startswith("cortex-m")) {
4374 setABI("aapcs");
4375 } else {
4376 setABI("apcs-gnu");
4377 }
4378 } else if (Triple.isOSWindows()) {
4379 // FIXME: this is invalid for WindowsCE
4380 setABI("aapcs");
4381 } else {
4382 // Select the default based on the platform.
4383 switch (Triple.getEnvironment()) {
4384 case llvm::Triple::Android:
4385 case llvm::Triple::GNUEABI:
4386 case llvm::Triple::GNUEABIHF:
4387 setABI("aapcs-linux");
4388 break;
4389 case llvm::Triple::EABIHF:
4390 case llvm::Triple::EABI:
4391 setABI("aapcs");
4392 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004393 case llvm::Triple::GNU:
4394 setABI("apcs-gnu");
4395 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004396 default:
4397 if (Triple.getOS() == llvm::Triple::NetBSD)
4398 setABI("apcs-gnu");
4399 else
4400 setABI("aapcs");
4401 break;
4402 }
4403 }
John McCall86353412010-08-21 22:46:04 +00004404
4405 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004406 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004407
Renato Golin15b86152015-07-03 16:41:13 +00004408 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004409 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004410
James Molloya7139222012-03-12 09:14:10 +00004411 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004412 // the alignment of the zero-length bitfield is greater than the member
4413 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004414 // zero length bitfield.
4415 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004416 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004417
Alp Toker4925ba72014-06-07 23:30:42 +00004418 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004419
Craig Topper3164f332014-03-11 03:39:26 +00004420 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004421 ABI = Name;
4422
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004423 // The defaults (above) are for AAPCS, check if we need to change them.
4424 //
4425 // FIXME: We need support for -meabi... we could just mangle it into the
4426 // name.
4427 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004428 setABIAPCS();
4429 return true;
4430 }
4431 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4432 setABIAAPCS();
4433 return true;
4434 }
4435 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004436 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004437
Renato Golinf5c4dec2015-05-27 13:33:00 +00004438 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopheref1e2952015-08-28 02:13:58 +00004439 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4440 StringRef CPU,
Eric Christopher007b0a02015-08-28 22:32:01 +00004441 std::vector<std::string> &FeaturesVec) const override {
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004442
4443 std::vector<const char*> TargetFeatures;
4444
4445 // get default FPU features
4446 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU);
4447 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4448
4449 // get default Extension features
4450 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU);
4451 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4452
4453 for (const char *Feature : TargetFeatures)
4454 if (Feature[0] == '+')
4455 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004456
4457 if (ArchVersion < 6 ||
4458 (ArchVersion == 6 && ArchProfile == llvm::ARM::PK_M))
4459 Features["strict-align"] = true;
4460
Eric Christopher007b0a02015-08-28 22:32:01 +00004461 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004462 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004463
Craig Topper3164f332014-03-11 03:39:26 +00004464 bool handleTargetFeatures(std::vector<std::string> &Features,
4465 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004466 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004467 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004468 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004469 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004470 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004471 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004472 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004473
Ranjeet Singhac08e532015-06-24 23:39:25 +00004474 // This does not diagnose illegal cases like having both
4475 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4476 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004477 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004478 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004479 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004480 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004481 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004482 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004483 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004484 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004485 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004486 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004487 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004488 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004489 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004490 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004491 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004492 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004493 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004494 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004495 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004496 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004497 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004498 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004499 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004500 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004501 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004502 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004503 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004504 Crypto = 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004505 } else if (Feature == "+t2dsp") {
4506 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004507 } else if (Feature == "+fp-only-sp") {
Ranjeet Singhac08e532015-06-24 23:39:25 +00004508 HW_FP_remove |= HW_FP_DP | HW_FP_HP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004509 } else if (Feature == "+strict-align") {
4510 Unaligned = 0;
4511 } else if (Feature == "+fp16") {
4512 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004513 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004514 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004515 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004516
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004517 switch (ArchVersion) {
4518 case 6:
4519 if (ArchProfile == llvm::ARM::PK_M)
4520 LDREX = 0;
4521 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4522 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4523 else
4524 LDREX = LDREX_W;
4525 break;
4526 case 7:
4527 if (ArchProfile == llvm::ARM::PK_M)
4528 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4529 else
4530 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4531 break;
4532 case 8:
4533 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4534 }
4535
Rafael Espindolaeb265472013-08-21 21:59:03 +00004536 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4537 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4538 return false;
4539 }
4540
4541 if (FPMath == FP_Neon)
4542 Features.push_back("+neonfp");
4543 else if (FPMath == FP_VFP)
4544 Features.push_back("-neonfp");
4545
Daniel Dunbar893d4752009-12-19 04:15:38 +00004546 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004547 auto Feature =
4548 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4549 if (Feature != Features.end())
4550 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004551
Rafael Espindolaeb265472013-08-21 21:59:03 +00004552 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004553 }
4554
Craig Topper3164f332014-03-11 03:39:26 +00004555 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004556 return llvm::StringSwitch<bool>(Feature)
4557 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004558 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004559 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004560 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004561 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004562 .Case("hwdiv", HWDiv & HWDivThumb)
4563 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004564 .Default(false);
4565 }
Renato Golin15b86152015-07-03 16:41:13 +00004566
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004567 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004568 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004569 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004570
Renato Golin15b86152015-07-03 16:41:13 +00004571 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004572 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004573 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004574 CPU = Name;
4575 return true;
4576 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004577
Craig Topper3164f332014-03-11 03:39:26 +00004578 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004579
Craig Topper3164f332014-03-11 03:39:26 +00004580 void getTargetDefines(const LangOptions &Opts,
4581 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004582 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004583 Builder.defineMacro("__arm");
4584 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004585
Chris Lattnerecd49032009-03-02 22:27:17 +00004586 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004587 Builder.defineMacro("__REGISTER_PREFIX__", "");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004588 if (!CPUAttr.empty())
4589 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004590
4591 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004592 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004593 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004594
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004595 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004596 // ACLE 6.5.7 Crypto Extension
4597 if (Crypto)
4598 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4599 // ACLE 6.5.8 CRC32 Extension
4600 if (CRC)
4601 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4602 // ACLE 6.5.10 Numeric Maximum and Minimum
4603 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4604 // ACLE 6.5.9 Directed Rounding
4605 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004606 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004607
4608 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4609 // is not defined for the M-profile.
4610 // NOTE that the deffault profile is assumed to be 'A'
4611 if (CPUProfile.empty() || CPUProfile != "M")
4612 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4613
4614 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4615 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4616 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004617 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004618 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004619 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004620 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4621
4622 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4623 // instruction set such as ARM or Thumb.
4624 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4625
4626 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4627
4628 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004629 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004630 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004631
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004632 // ACLE 6.4.3 Unaligned access supported in hardware
4633 if (Unaligned)
4634 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
4635
4636 // ACLE 6.4.4 LDREX/STREX
4637 if (LDREX)
4638 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4639
4640 // ACLE 6.4.5 CLZ
4641 if (ArchVersion == 5 ||
4642 (ArchVersion == 6 && CPUProfile != "M") ||
4643 ArchVersion > 6)
4644 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4645
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004646 // ACLE 6.5.1 Hardware Floating Point
4647 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004648 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004649
Yi Konga44c4d72014-06-27 21:25:42 +00004650 // ACLE predefines.
4651 Builder.defineMacro("__ARM_ACLE", "200");
4652
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004653 // FP16 support (we currently only support IEEE format).
4654 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4655 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4656
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004657 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4658 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4659 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4660
Mike Stump9d54bd72009-04-08 02:07:04 +00004661 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004662
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004663 // FIXME: It's more complicated than this and we don't really support
4664 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004665 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004666 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004667 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004668
David Tweed8f676532012-10-25 13:33:01 +00004669 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004670 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004671 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4672 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004673 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004674 Builder.defineMacro("__ARM_PCS", "1");
4675
David Tweed8f676532012-10-25 13:33:01 +00004676 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004677 Builder.defineMacro("__ARM_PCS_VFP", "1");
4678 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004679
Daniel Dunbar893d4752009-12-19 04:15:38 +00004680 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004681 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004682
4683 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004684 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004685
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004686 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004687 Builder.defineMacro("__THUMBEL__");
4688 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004689 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004690 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004691 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004692
4693 // ACLE 6.4.9 32-bit SIMD instructions
4694 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4695 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4696
4697 // ACLE 6.4.10 Hardware Integer Divide
4698 if (((HWDiv & HWDivThumb) && isThumb()) || ((HWDiv & HWDivARM) && !isThumb())) {
4699 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004700 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004701 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004702
4703 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004704 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004705
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004706 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004707 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004708 if (FPU & VFP2FPU)
4709 Builder.defineMacro("__ARM_VFPV2__");
4710 if (FPU & VFP3FPU)
4711 Builder.defineMacro("__ARM_VFPV3__");
4712 if (FPU & VFP4FPU)
4713 Builder.defineMacro("__ARM_VFPV4__");
4714 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004715
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004716 // This only gets set when Neon instructions are actually available, unlike
4717 // the VFP define, hence the soft float and arch check. This is subtly
4718 // different from gcc, we follow the intent which was that it should be set
4719 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004720 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004721 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004722 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004723 // current AArch32 NEON implementations do not support double-precision
4724 // floating-point even when it is present in VFP.
4725 Builder.defineMacro("__ARM_NEON_FP", "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004726 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004727
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004728 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4729 Opts.ShortWChar ? "2" : "4");
4730
4731 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4732 Opts.ShortEnums ? "1" : "4");
4733
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004734 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004735 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4736 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4737 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4738 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4739 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004740
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004741 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004742 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004743 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004744 }
4745
4746 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004747 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004748 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4749 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004750 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004751 }
4752
4753 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004754 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004755 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004756 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004757
Craig Topper3164f332014-03-11 03:39:26 +00004758 void getTargetBuiltins(const Builtin::Info *&Records,
4759 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004760 Records = BuiltinInfo;
4761 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004762 }
Craig Topper3164f332014-03-11 03:39:26 +00004763 bool isCLZForZeroUndef() const override { return false; }
4764 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004765 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004766 }
Craig Topper3164f332014-03-11 03:39:26 +00004767 void getGCCRegNames(const char * const *&Names,
4768 unsigned &NumNames) const override;
4769 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4770 unsigned &NumAliases) const override;
4771 bool validateAsmConstraint(const char *&Name,
4772 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004773 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004774 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004775 case 'l': // r0-r7
4776 case 'h': // r8-r15
4777 case 'w': // VFP Floating point register single precision
4778 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004779 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004780 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004781 case 'I':
4782 case 'J':
4783 case 'K':
4784 case 'L':
4785 case 'M':
4786 // FIXME
4787 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004788 case 'Q': // A memory address that is a single base register.
4789 Info.setAllowsMemory();
4790 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004791 case 'U': // a memory reference...
4792 switch (Name[1]) {
4793 case 'q': // ...ARMV4 ldrsb
4794 case 'v': // ...VFP load/store (reg+constant offset)
4795 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004796 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004797 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004798 case 'n': // valid address for Neon doubleword vector load/store
4799 case 'm': // valid address for Neon element and structure load/store
4800 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004801 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004802 Info.setAllowsMemory();
4803 Name++;
4804 return true;
4805 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004806 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004807 return false;
4808 }
Craig Topper3164f332014-03-11 03:39:26 +00004809 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004810 std::string R;
4811 switch (*Constraint) {
4812 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004813 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004814 Constraint++;
4815 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004816 case 'p': // 'p' should be translated to 'r' by default.
4817 R = std::string("r");
4818 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004819 default:
4820 return std::string(1, *Constraint);
4821 }
4822 return R;
4823 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004824 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004825 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004826 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004827 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004828 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004829
Bill Wendling9d1ee112012-10-25 23:28:48 +00004830 // Strip off constraint modifiers.
4831 while (Constraint[0] == '=' ||
4832 Constraint[0] == '+' ||
4833 Constraint[0] == '&')
4834 Constraint = Constraint.substr(1);
4835
4836 switch (Constraint[0]) {
4837 default: break;
4838 case 'r': {
4839 switch (Modifier) {
4840 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004841 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004842 case 'q':
4843 // A register of size 32 cannot fit a vector type.
4844 return false;
4845 }
4846 }
4847 }
4848
4849 return true;
4850 }
Craig Topper3164f332014-03-11 03:39:26 +00004851 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004852 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004853 return "";
4854 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004855
Craig Topper3164f332014-03-11 03:39:26 +00004856 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004857 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4858 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004859
Craig Topper3164f332014-03-11 03:39:26 +00004860 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004861 if (RegNo == 0) return 0;
4862 if (RegNo == 1) return 1;
4863 return -1;
4864 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004865
4866 bool hasSjLjLowering() const override {
4867 return true;
4868 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004869};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004870
Rafael Espindolaeb265472013-08-21 21:59:03 +00004871bool ARMTargetInfo::setFPMath(StringRef Name) {
4872 if (Name == "neon") {
4873 FPMath = FP_Neon;
4874 return true;
4875 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4876 Name == "vfp4") {
4877 FPMath = FP_VFP;
4878 return true;
4879 }
4880 return false;
4881}
4882
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004883const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004884 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004885 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004886 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4887
4888 // Float registers
4889 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4890 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4891 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004892 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004893
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004894 // Double registers
4895 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4896 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004897 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4898 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004899
4900 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004901 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4902 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004903};
4904
4905void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004906 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004907 Names = GCCRegNames;
4908 NumNames = llvm::array_lengthof(GCCRegNames);
4909}
4910
4911const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004912 { { "a1" }, "r0" },
4913 { { "a2" }, "r1" },
4914 { { "a3" }, "r2" },
4915 { { "a4" }, "r3" },
4916 { { "v1" }, "r4" },
4917 { { "v2" }, "r5" },
4918 { { "v3" }, "r6" },
4919 { { "v4" }, "r7" },
4920 { { "v5" }, "r8" },
4921 { { "v6", "rfp" }, "r9" },
4922 { { "sl" }, "r10" },
4923 { { "fp" }, "r11" },
4924 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004925 { { "r13" }, "sp" },
4926 { { "r14" }, "lr" },
4927 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004928 // The S, D and Q registers overlap, but aren't really aliases; we
4929 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004930};
4931
4932void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4933 unsigned &NumAliases) const {
4934 Aliases = GCCRegAliases;
4935 NumAliases = llvm::array_lengthof(GCCRegAliases);
4936}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004937
4938const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00004939#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004940 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004941#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4942 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00004943#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004944
Craig Topper07d3b622015-08-07 05:14:44 +00004945#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004946 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004947#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004948 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004949#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4950 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004951#include "clang/Basic/BuiltinsARM.def"
4952};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004953
4954class ARMleTargetInfo : public ARMTargetInfo {
4955public:
4956 ARMleTargetInfo(const llvm::Triple &Triple)
4957 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004958 void getTargetDefines(const LangOptions &Opts,
4959 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004960 Builder.defineMacro("__ARMEL__");
4961 ARMTargetInfo::getTargetDefines(Opts, Builder);
4962 }
4963};
4964
4965class ARMbeTargetInfo : public ARMTargetInfo {
4966public:
4967 ARMbeTargetInfo(const llvm::Triple &Triple)
4968 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004969 void getTargetDefines(const LangOptions &Opts,
4970 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004971 Builder.defineMacro("__ARMEB__");
4972 Builder.defineMacro("__ARM_BIG_ENDIAN");
4973 ARMTargetInfo::getTargetDefines(Opts, Builder);
4974 }
4975};
Chris Lattner17df24e2008-04-21 18:56:49 +00004976
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004977class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4978 const llvm::Triple Triple;
4979public:
4980 WindowsARMTargetInfo(const llvm::Triple &Triple)
4981 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4982 TLSSupported = false;
4983 WCharType = UnsignedShort;
4984 SizeType = UnsignedInt;
4985 UserLabelPrefix = "";
4986 }
4987 void getVisualStudioDefines(const LangOptions &Opts,
4988 MacroBuilder &Builder) const {
4989 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4990
4991 // FIXME: this is invalid for WindowsCE
4992 Builder.defineMacro("_M_ARM_NT", "1");
4993 Builder.defineMacro("_M_ARMT", "_M_ARM");
4994 Builder.defineMacro("_M_THUMB", "_M_ARM");
4995
4996 assert((Triple.getArch() == llvm::Triple::arm ||
4997 Triple.getArch() == llvm::Triple::thumb) &&
4998 "invalid architecture for Windows ARM target info");
4999 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5000 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5001
5002 // TODO map the complete set of values
5003 // 31: VFPv3 40: VFPv4
5004 Builder.defineMacro("_M_ARM_FP", "31");
5005 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005006 BuiltinVaListKind getBuiltinVaListKind() const override {
5007 return TargetInfo::CharPtrBuiltinVaList;
5008 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005009 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5010 switch (CC) {
5011 case CC_X86StdCall:
5012 case CC_X86ThisCall:
5013 case CC_X86FastCall:
5014 case CC_X86VectorCall:
5015 return CCCR_Ignore;
5016 case CC_C:
5017 return CCCR_OK;
5018 default:
5019 return CCCR_Warning;
5020 }
5021 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005022};
5023
5024// Windows ARM + Itanium C++ ABI Target
5025class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5026public:
5027 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5028 : WindowsARMTargetInfo(Triple) {
5029 TheCXXABI.set(TargetCXXABI::GenericARM);
5030 }
5031
5032 void getTargetDefines(const LangOptions &Opts,
5033 MacroBuilder &Builder) const override {
5034 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5035
5036 if (Opts.MSVCCompat)
5037 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5038 }
5039};
5040
5041// Windows ARM, MS (C++) ABI
5042class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5043public:
5044 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5045 : WindowsARMTargetInfo(Triple) {
5046 TheCXXABI.set(TargetCXXABI::Microsoft);
5047 }
5048
5049 void getTargetDefines(const LangOptions &Opts,
5050 MacroBuilder &Builder) const override {
5051 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5052 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5053 }
5054};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005055
Yaron Keren321249c2015-07-15 13:32:23 +00005056// ARM MinGW target
5057class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5058public:
5059 MinGWARMTargetInfo(const llvm::Triple &Triple)
5060 : WindowsARMTargetInfo(Triple) {
5061 TheCXXABI.set(TargetCXXABI::GenericARM);
5062 }
5063
5064 void getTargetDefines(const LangOptions &Opts,
5065 MacroBuilder &Builder) const override {
5066 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5067 DefineStd(Builder, "WIN32", Opts);
5068 DefineStd(Builder, "WINNT", Opts);
5069 Builder.defineMacro("_ARM_");
5070 addMinGWDefines(Opts, Builder);
5071 }
5072};
5073
5074// ARM Cygwin target
5075class CygwinARMTargetInfo : public ARMleTargetInfo {
5076public:
5077 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5078 TLSSupported = false;
5079 WCharType = UnsignedShort;
5080 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005081 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005082 }
5083 void getTargetDefines(const LangOptions &Opts,
5084 MacroBuilder &Builder) const override {
5085 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5086 Builder.defineMacro("_ARM_");
5087 Builder.defineMacro("__CYGWIN__");
5088 Builder.defineMacro("__CYGWIN32__");
5089 DefineStd(Builder, "unix", Opts);
5090 if (Opts.CPlusPlus)
5091 Builder.defineMacro("_GNU_SOURCE");
5092 }
5093};
5094
Mike Stump11289f42009-09-09 15:08:12 +00005095class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005096 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005097protected:
Craig Topper3164f332014-03-11 03:39:26 +00005098 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5099 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005100 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005101 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005102
Torok Edwinb2b37c62009-06-30 17:10:35 +00005103public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005104 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005105 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005106 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005107 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005108 // FIXME: This should be based off of the target features in
5109 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005110 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005111
5112 // Darwin on iOS uses a variant of the ARM C++ ABI.
5113 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005114 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005115};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005116
Tim Northover573cbee2014-05-24 12:52:07 +00005117class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005118 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005119 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5120 static const char *const GCCRegNames[];
5121
James Molloy75f5f9e2014-04-16 15:33:48 +00005122 enum FPUModeEnum {
5123 FPUMode,
5124 NeonMode
5125 };
5126
5127 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005128 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005129 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005130 unsigned Unaligned;
James Molloy75f5f9e2014-04-16 15:33:48 +00005131
Tim Northovera2ee4332014-03-29 15:09:45 +00005132 static const Builtin::Info BuiltinInfo[];
5133
5134 std::string ABI;
5135
5136public:
Tim Northover573cbee2014-05-24 12:52:07 +00005137 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005138 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005139
5140 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5141 WCharType = SignedInt;
5142
5143 // NetBSD apparently prefers consistency across ARM targets to consistency
5144 // across 64-bit targets.
5145 Int64Type = SignedLongLong;
5146 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005147 } else {
5148 WCharType = UnsignedInt;
5149 Int64Type = SignedLong;
5150 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005151 }
5152
Tim Northovera2ee4332014-03-29 15:09:45 +00005153 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005154 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005155 MaxAtomicInlineWidth = 128;
5156 MaxAtomicPromoteWidth = 128;
5157
Tim Northovera6a19f12015-02-06 01:25:07 +00005158 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005159 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5160
Tim Northovera2ee4332014-03-29 15:09:45 +00005161 // {} in inline assembly are neon specifiers, not assembly variant
5162 // specifiers.
5163 NoAsmVariants = true;
5164
Tim Northover7ad87af2015-01-16 18:44:04 +00005165 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5166 // contributes to the alignment of the containing aggregate in the same way
5167 // a plain (non bit-field) member of that type would, without exception for
5168 // zero-sized or anonymous bit-fields."
5169 UseBitFieldTypeAlignment = true;
5170 UseZeroLengthBitfieldAlignment = true;
5171
Tim Northover573cbee2014-05-24 12:52:07 +00005172 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005173 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5174 }
5175
Alp Toker4925ba72014-06-07 23:30:42 +00005176 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005177 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005178 if (Name != "aapcs" && Name != "darwinpcs")
5179 return false;
5180
5181 ABI = Name;
5182 return true;
5183 }
5184
David Blaikie1cbb9712014-11-14 19:09:44 +00005185 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005186 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005187 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005188 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005189 .Case("cyclone", true)
5190 .Default(false);
5191 return CPUKnown;
5192 }
5193
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005194 void getTargetDefines(const LangOptions &Opts,
5195 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005196 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005197 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005198
5199 // Target properties.
5200 Builder.defineMacro("_LP64");
5201 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005202
5203 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5204 Builder.defineMacro("__ARM_ACLE", "200");
5205 Builder.defineMacro("__ARM_ARCH", "8");
5206 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5207
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005208 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005209 Builder.defineMacro("__ARM_PCS_AAPCS64");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005210 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005211
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005212 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5213 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5214 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5215 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005216 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005217 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5218 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005219
5220 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5221
5222 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005223 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005224
5225 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5226 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005227 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5228 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005229
5230 if (Opts.FastMath || Opts.FiniteMathOnly)
5231 Builder.defineMacro("__ARM_FP_FAST");
5232
Richard Smithab506ad2014-10-20 23:26:58 +00005233 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00005234 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
5235
5236 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5237
5238 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5239 Opts.ShortEnums ? "1" : "4");
5240
James Molloy75f5f9e2014-04-16 15:33:48 +00005241 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005242 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005243 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005244 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005245 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005246
Bradley Smith418c5932014-05-02 15:17:51 +00005247 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005248 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005249
James Molloy75f5f9e2014-04-16 15:33:48 +00005250 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005251 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5252
5253 if (Unaligned)
5254 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005255
5256 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5257 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5258 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5259 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5260 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005261 }
5262
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005263 void getTargetBuiltins(const Builtin::Info *&Records,
5264 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005265 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00005266 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00005267 }
5268
David Blaikie1cbb9712014-11-14 19:09:44 +00005269 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005270 return Feature == "aarch64" ||
5271 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005272 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005273 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005274 }
5275
James Molloy5e73df52014-04-16 15:06:20 +00005276 bool handleTargetFeatures(std::vector<std::string> &Features,
5277 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005278 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005279 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005280 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005281 Unaligned = 1;
5282
Eric Christopher610fe112015-08-26 08:21:55 +00005283 for (const auto &Feature : Features) {
5284 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005285 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005286 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005287 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005288 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005289 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005290 if (Feature == "+strict-align")
5291 Unaligned = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005292 }
5293
Eric Christopher964a5f32015-08-05 23:48:05 +00005294 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005295
5296 return true;
5297 }
5298
David Blaikie1cbb9712014-11-14 19:09:44 +00005299 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005300
David Blaikie1cbb9712014-11-14 19:09:44 +00005301 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005302 return TargetInfo::AArch64ABIBuiltinVaList;
5303 }
5304
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005305 void getGCCRegNames(const char *const *&Names,
5306 unsigned &NumNames) const override;
5307 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5308 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005309
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005310 bool validateAsmConstraint(const char *&Name,
5311 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005312 switch (*Name) {
5313 default:
5314 return false;
5315 case 'w': // Floating point and SIMD registers (V0-V31)
5316 Info.setAllowsRegister();
5317 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005318 case 'I': // Constant that can be used with an ADD instruction
5319 case 'J': // Constant that can be used with a SUB instruction
5320 case 'K': // Constant that can be used with a 32-bit logical instruction
5321 case 'L': // Constant that can be used with a 64-bit logical instruction
5322 case 'M': // Constant that can be used as a 32-bit MOV immediate
5323 case 'N': // Constant that can be used as a 64-bit MOV immediate
5324 case 'Y': // Floating point constant zero
5325 case 'Z': // Integer constant zero
5326 return true;
5327 case 'Q': // A memory reference with base register and no offset
5328 Info.setAllowsMemory();
5329 return true;
5330 case 'S': // A symbolic address
5331 Info.setAllowsRegister();
5332 return true;
5333 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005334 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5335 // Utf: A memory address suitable for ldp/stp in TF mode.
5336 // Usa: An absolute symbolic address.
5337 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5338 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005339 case 'z': // Zero register, wzr or xzr
5340 Info.setAllowsRegister();
5341 return true;
5342 case 'x': // Floating point and SIMD registers (V0-V15)
5343 Info.setAllowsRegister();
5344 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005345 }
5346 return false;
5347 }
5348
Akira Hatanaka987f1862014-08-22 06:05:21 +00005349 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005350 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005351 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005352 // Strip off constraint modifiers.
5353 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5354 Constraint = Constraint.substr(1);
5355
5356 switch (Constraint[0]) {
5357 default:
5358 return true;
5359 case 'z':
5360 case 'r': {
5361 switch (Modifier) {
5362 case 'x':
5363 case 'w':
5364 // For now assume that the person knows what they're
5365 // doing with the modifier.
5366 return true;
5367 default:
5368 // By default an 'r' constraint will be in the 'x'
5369 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005370 if (Size == 64)
5371 return true;
5372
5373 SuggestedModifier = "w";
5374 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005375 }
5376 }
5377 }
5378 }
5379
David Blaikie1cbb9712014-11-14 19:09:44 +00005380 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005381
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005382 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005383 if (RegNo == 0)
5384 return 0;
5385 if (RegNo == 1)
5386 return 1;
5387 return -1;
5388 }
5389};
5390
Tim Northover573cbee2014-05-24 12:52:07 +00005391const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005392 // 32-bit Integer registers
5393 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5394 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5395 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5396
5397 // 64-bit Integer registers
5398 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5399 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5400 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5401
5402 // 32-bit floating point regsisters
5403 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5404 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5405 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5406
5407 // 64-bit floating point regsisters
5408 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5409 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5410 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5411
5412 // Vector registers
5413 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5414 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5415 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5416};
5417
Tim Northover573cbee2014-05-24 12:52:07 +00005418void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005419 unsigned &NumNames) const {
5420 Names = GCCRegNames;
5421 NumNames = llvm::array_lengthof(GCCRegNames);
5422}
5423
Tim Northover573cbee2014-05-24 12:52:07 +00005424const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005425 { { "w31" }, "wsp" },
5426 { { "x29" }, "fp" },
5427 { { "x30" }, "lr" },
5428 { { "x31" }, "sp" },
5429 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5430 // don't want to substitute one of these for a different-sized one.
5431};
5432
Tim Northover573cbee2014-05-24 12:52:07 +00005433void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005434 unsigned &NumAliases) const {
5435 Aliases = GCCRegAliases;
5436 NumAliases = llvm::array_lengthof(GCCRegAliases);
5437}
5438
Tim Northover573cbee2014-05-24 12:52:07 +00005439const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005440#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005441 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005442#include "clang/Basic/BuiltinsNEON.def"
5443
5444#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005445 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005446#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005447};
James Molloy5e73df52014-04-16 15:06:20 +00005448
Tim Northover573cbee2014-05-24 12:52:07 +00005449class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005450 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005451 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005452 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005453 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005454 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005455 }
5456
5457public:
Tim Northover573cbee2014-05-24 12:52:07 +00005458 AArch64leTargetInfo(const llvm::Triple &Triple)
5459 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005460 BigEndian = false;
5461 }
5462 void getTargetDefines(const LangOptions &Opts,
5463 MacroBuilder &Builder) const override {
5464 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005465 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005466 }
5467};
5468
Tim Northover573cbee2014-05-24 12:52:07 +00005469class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005470 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005471 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005472 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005473 }
5474
5475public:
Tim Northover573cbee2014-05-24 12:52:07 +00005476 AArch64beTargetInfo(const llvm::Triple &Triple)
5477 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005478 void getTargetDefines(const LangOptions &Opts,
5479 MacroBuilder &Builder) const override {
5480 Builder.defineMacro("__AARCH64EB__");
5481 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5482 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005483 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005484 }
5485};
Tim Northovera2ee4332014-03-29 15:09:45 +00005486
Tim Northover573cbee2014-05-24 12:52:07 +00005487class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005488protected:
5489 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5490 MacroBuilder &Builder) const override {
5491 Builder.defineMacro("__AARCH64_SIMD__");
5492 Builder.defineMacro("__ARM64_ARCH_8__");
5493 Builder.defineMacro("__ARM_NEON__");
5494 Builder.defineMacro("__LITTLE_ENDIAN__");
5495 Builder.defineMacro("__REGISTER_PREFIX__", "");
5496 Builder.defineMacro("__arm64", "1");
5497 Builder.defineMacro("__arm64__", "1");
5498
5499 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5500 }
5501
Tim Northovera2ee4332014-03-29 15:09:45 +00005502public:
Tim Northover573cbee2014-05-24 12:52:07 +00005503 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5504 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005505 Int64Type = SignedLongLong;
5506 WCharType = SignedInt;
5507 UseSignedCharForObjCBool = false;
5508
Tim Northovera6a19f12015-02-06 01:25:07 +00005509 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005510 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5511
5512 TheCXXABI.set(TargetCXXABI::iOS64);
5513 }
5514
David Blaikie1cbb9712014-11-14 19:09:44 +00005515 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005516 return TargetInfo::CharPtrBuiltinVaList;
5517 }
5518};
Tim Northovera2ee4332014-03-29 15:09:45 +00005519
Tony Linthicum76329bf2011-12-12 21:14:55 +00005520// Hexagon abstract base class
5521class HexagonTargetInfo : public TargetInfo {
5522 static const Builtin::Info BuiltinInfo[];
5523 static const char * const GCCRegNames[];
5524 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5525 std::string CPU;
5526public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005527 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005528 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00005529 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005530
5531 // {} in inline assembly are packet specifiers, not assembly variant
5532 // specifiers.
5533 NoAsmVariants = true;
5534 }
5535
Craig Topper3164f332014-03-11 03:39:26 +00005536 void getTargetBuiltins(const Builtin::Info *&Records,
5537 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005538 Records = BuiltinInfo;
5539 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5540 }
5541
Craig Topper3164f332014-03-11 03:39:26 +00005542 bool validateAsmConstraint(const char *&Name,
5543 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005544 return true;
5545 }
5546
Craig Topper3164f332014-03-11 03:39:26 +00005547 void getTargetDefines(const LangOptions &Opts,
5548 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005549
Craig Topper3164f332014-03-11 03:39:26 +00005550 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005551 return Feature == "hexagon";
5552 }
Craig Topper3164f332014-03-11 03:39:26 +00005553
5554 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005555 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005556 }
Craig Topper3164f332014-03-11 03:39:26 +00005557 void getGCCRegNames(const char * const *&Names,
5558 unsigned &NumNames) const override;
5559 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5560 unsigned &NumAliases) const override;
5561 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005562 return "";
5563 }
Sebastian Pop86500282012-01-13 20:37:10 +00005564
5565 static const char *getHexagonCPUSuffix(StringRef Name) {
5566 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005567 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005568 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005569 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005570 }
5571
Craig Topper3164f332014-03-11 03:39:26 +00005572 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005573 if (!getHexagonCPUSuffix(Name))
5574 return false;
5575
Tony Linthicum76329bf2011-12-12 21:14:55 +00005576 CPU = Name;
5577 return true;
5578 }
5579};
5580
5581void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5582 MacroBuilder &Builder) const {
5583 Builder.defineMacro("qdsp6");
5584 Builder.defineMacro("__qdsp6", "1");
5585 Builder.defineMacro("__qdsp6__", "1");
5586
5587 Builder.defineMacro("hexagon");
5588 Builder.defineMacro("__hexagon", "1");
5589 Builder.defineMacro("__hexagon__", "1");
5590
5591 if(CPU == "hexagonv1") {
5592 Builder.defineMacro("__HEXAGON_V1__");
5593 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5594 if(Opts.HexagonQdsp6Compat) {
5595 Builder.defineMacro("__QDSP6_V1__");
5596 Builder.defineMacro("__QDSP6_ARCH__", "1");
5597 }
5598 }
5599 else if(CPU == "hexagonv2") {
5600 Builder.defineMacro("__HEXAGON_V2__");
5601 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5602 if(Opts.HexagonQdsp6Compat) {
5603 Builder.defineMacro("__QDSP6_V2__");
5604 Builder.defineMacro("__QDSP6_ARCH__", "2");
5605 }
5606 }
5607 else if(CPU == "hexagonv3") {
5608 Builder.defineMacro("__HEXAGON_V3__");
5609 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5610 if(Opts.HexagonQdsp6Compat) {
5611 Builder.defineMacro("__QDSP6_V3__");
5612 Builder.defineMacro("__QDSP6_ARCH__", "3");
5613 }
5614 }
5615 else if(CPU == "hexagonv4") {
5616 Builder.defineMacro("__HEXAGON_V4__");
5617 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5618 if(Opts.HexagonQdsp6Compat) {
5619 Builder.defineMacro("__QDSP6_V4__");
5620 Builder.defineMacro("__QDSP6_ARCH__", "4");
5621 }
5622 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005623 else if(CPU == "hexagonv5") {
5624 Builder.defineMacro("__HEXAGON_V5__");
5625 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5626 if(Opts.HexagonQdsp6Compat) {
5627 Builder.defineMacro("__QDSP6_V5__");
5628 Builder.defineMacro("__QDSP6_ARCH__", "5");
5629 }
5630 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005631}
5632
5633const char * const HexagonTargetInfo::GCCRegNames[] = {
5634 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5635 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5636 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5637 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5638 "p0", "p1", "p2", "p3",
5639 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5640};
5641
5642void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5643 unsigned &NumNames) const {
5644 Names = GCCRegNames;
5645 NumNames = llvm::array_lengthof(GCCRegNames);
5646}
5647
5648
5649const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5650 { { "sp" }, "r29" },
5651 { { "fp" }, "r30" },
5652 { { "lr" }, "r31" },
5653 };
5654
5655void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5656 unsigned &NumAliases) const {
5657 Aliases = GCCRegAliases;
5658 NumAliases = llvm::array_lengthof(GCCRegAliases);
5659}
5660
5661
5662const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005663#define BUILTIN(ID, TYPE, ATTRS) \
5664 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5665#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5666 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005667#include "clang/Basic/BuiltinsHexagon.def"
5668};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005669
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005670// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5671class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005672 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5673 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005674 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005675public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005676 SparcTargetInfo(const llvm::Triple &Triple)
5677 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005678
Craig Topper3164f332014-03-11 03:39:26 +00005679 bool handleTargetFeatures(std::vector<std::string> &Features,
5680 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005681 // The backend doesn't actually handle soft float yet, but in case someone
5682 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005683 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5684 if (Feature != Features.end()) {
5685 SoftFloat = true;
5686 Features.erase(Feature);
5687 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005688 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005689 }
Craig Topper3164f332014-03-11 03:39:26 +00005690 void getTargetDefines(const LangOptions &Opts,
5691 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005692 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005693 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005694
5695 if (SoftFloat)
5696 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005697 }
Craig Topper3164f332014-03-11 03:39:26 +00005698
5699 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005700 return llvm::StringSwitch<bool>(Feature)
5701 .Case("softfloat", SoftFloat)
5702 .Case("sparc", true)
5703 .Default(false);
5704 }
Craig Topper3164f332014-03-11 03:39:26 +00005705
5706 void getTargetBuiltins(const Builtin::Info *&Records,
5707 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005708 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005709 }
Craig Topper3164f332014-03-11 03:39:26 +00005710 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005711 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005712 }
Craig Topper3164f332014-03-11 03:39:26 +00005713 void getGCCRegNames(const char * const *&Names,
5714 unsigned &NumNames) const override;
5715 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5716 unsigned &NumAliases) const override;
5717 bool validateAsmConstraint(const char *&Name,
5718 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005719 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005720 switch (*Name) {
5721 case 'I': // Signed 13-bit constant
5722 case 'J': // Zero
5723 case 'K': // 32-bit constant with the low 12 bits clear
5724 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5725 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5726 case 'N': // Same as 'K' but zext (required for SIMode)
5727 case 'O': // The constant 4096
5728 return true;
5729 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005730 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005731 }
Craig Topper3164f332014-03-11 03:39:26 +00005732 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005733 // FIXME: Implement!
5734 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005735 }
5736};
5737
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005738const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005739 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5740 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5741 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5742 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5743};
5744
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005745void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5746 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005747 Names = GCCRegNames;
5748 NumNames = llvm::array_lengthof(GCCRegNames);
5749}
5750
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005751const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005752 { { "g0" }, "r0" },
5753 { { "g1" }, "r1" },
5754 { { "g2" }, "r2" },
5755 { { "g3" }, "r3" },
5756 { { "g4" }, "r4" },
5757 { { "g5" }, "r5" },
5758 { { "g6" }, "r6" },
5759 { { "g7" }, "r7" },
5760 { { "o0" }, "r8" },
5761 { { "o1" }, "r9" },
5762 { { "o2" }, "r10" },
5763 { { "o3" }, "r11" },
5764 { { "o4" }, "r12" },
5765 { { "o5" }, "r13" },
5766 { { "o6", "sp" }, "r14" },
5767 { { "o7" }, "r15" },
5768 { { "l0" }, "r16" },
5769 { { "l1" }, "r17" },
5770 { { "l2" }, "r18" },
5771 { { "l3" }, "r19" },
5772 { { "l4" }, "r20" },
5773 { { "l5" }, "r21" },
5774 { { "l6" }, "r22" },
5775 { { "l7" }, "r23" },
5776 { { "i0" }, "r24" },
5777 { { "i1" }, "r25" },
5778 { { "i2" }, "r26" },
5779 { { "i3" }, "r27" },
5780 { { "i4" }, "r28" },
5781 { { "i5" }, "r29" },
5782 { { "i6", "fp" }, "r30" },
5783 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005784};
5785
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005786void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5787 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005788 Aliases = GCCRegAliases;
5789 NumAliases = llvm::array_lengthof(GCCRegAliases);
5790}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005791
5792// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5793class SparcV8TargetInfo : public SparcTargetInfo {
5794public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005795 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005796 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00005797 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
5798 switch (getTriple().getOS()) {
5799 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00005800 SizeType = UnsignedInt;
5801 IntPtrType = SignedInt;
5802 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00005803 break;
5804 case llvm::Triple::NetBSD:
5805 case llvm::Triple::OpenBSD:
5806 SizeType = UnsignedLong;
5807 IntPtrType = SignedLong;
5808 PtrDiffType = SignedLong;
5809 break;
Brad Smith56495d52015-08-13 22:00:53 +00005810 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005811 }
5812
Craig Topper3164f332014-03-11 03:39:26 +00005813 void getTargetDefines(const LangOptions &Opts,
5814 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005815 SparcTargetInfo::getTargetDefines(Opts, Builder);
5816 Builder.defineMacro("__sparcv8");
5817 }
5818};
5819
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005820// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5821class SparcV8elTargetInfo : public SparcV8TargetInfo {
5822 public:
5823 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005824 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005825 BigEndian = false;
5826 }
5827};
5828
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005829// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5830class SparcV9TargetInfo : public SparcTargetInfo {
5831public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005832 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005833 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00005834 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005835 // This is an LP64 platform.
5836 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005837
5838 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005839 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005840 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005841 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005842 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005843 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005844
5845 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5846 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5847 LongDoubleWidth = 128;
5848 LongDoubleAlign = 128;
5849 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005850 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005851 }
5852
Craig Topper3164f332014-03-11 03:39:26 +00005853 void getTargetDefines(const LangOptions &Opts,
5854 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005855 SparcTargetInfo::getTargetDefines(Opts, Builder);
5856 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005857 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005858 // Solaris doesn't need these variants, but the BSDs do.
5859 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005860 Builder.defineMacro("__sparc64__");
5861 Builder.defineMacro("__sparc_v9__");
5862 Builder.defineMacro("__sparcv9__");
5863 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005864 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005865
Craig Topper3164f332014-03-11 03:39:26 +00005866 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005867 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5868 .Case("v9", true)
5869 .Case("ultrasparc", true)
5870 .Case("ultrasparc3", true)
5871 .Case("niagara", true)
5872 .Case("niagara2", true)
5873 .Case("niagara3", true)
5874 .Case("niagara4", true)
5875 .Default(false);
5876
5877 // No need to store the CPU yet. There aren't any CPU-specific
5878 // macros to define.
5879 return CPUKnown;
5880 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005881};
5882
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005883class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005884 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005885 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005886 std::string CPU;
5887 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005888 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005889
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005890public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005891 SystemZTargetInfo(const llvm::Triple &Triple)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005892 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005893 IntMaxType = SignedLong;
5894 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005895 TLSSupported = true;
5896 IntWidth = IntAlign = 32;
5897 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5898 PointerWidth = PointerAlign = 64;
5899 LongDoubleWidth = 128;
5900 LongDoubleAlign = 64;
5901 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005902 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005903 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00005904 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 +00005905 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5906 }
5907 void getTargetDefines(const LangOptions &Opts,
5908 MacroBuilder &Builder) const override {
5909 Builder.defineMacro("__s390__");
5910 Builder.defineMacro("__s390x__");
5911 Builder.defineMacro("__zarch__");
5912 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005913 if (HasTransactionalExecution)
5914 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005915 if (Opts.ZVector)
5916 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005917 }
5918 void getTargetBuiltins(const Builtin::Info *&Records,
5919 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005920 Records = BuiltinInfo;
5921 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005922 }
5923
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005924 void getGCCRegNames(const char *const *&Names,
5925 unsigned &NumNames) const override;
5926 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5927 unsigned &NumAliases) const override {
5928 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005929 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005930 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005931 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005932 bool validateAsmConstraint(const char *&Name,
5933 TargetInfo::ConstraintInfo &info) const override;
5934 const char *getClobbers() const override {
5935 // FIXME: Is this really right?
5936 return "";
5937 }
5938 BuiltinVaListKind getBuiltinVaListKind() const override {
5939 return TargetInfo::SystemZBuiltinVaList;
5940 }
5941 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005942 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005943 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5944 .Case("z10", true)
5945 .Case("z196", true)
5946 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005947 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005948 .Default(false);
5949
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005950 return CPUKnown;
5951 }
Eric Christopheref1e2952015-08-28 02:13:58 +00005952 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
Eric Christophera8a14c32015-08-31 18:39:16 +00005953 StringRef CPU,
5954 std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005955 if (CPU == "zEC12")
5956 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005957 if (CPU == "z13") {
5958 Features["transactional-execution"] = true;
5959 Features["vector"] = true;
5960 }
Eric Christopher007b0a02015-08-28 22:32:01 +00005961 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005962 }
5963
5964 bool handleTargetFeatures(std::vector<std::string> &Features,
5965 DiagnosticsEngine &Diags) override {
5966 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00005967 for (const auto &Feature : Features) {
5968 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005969 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00005970 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005971 HasVector = true;
5972 }
5973 // If we use the vector ABI, vector types are 64-bit aligned.
5974 if (HasVector) {
5975 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005976 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5977 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005978 }
5979 return true;
5980 }
5981
5982 bool hasFeature(StringRef Feature) const override {
5983 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005984 .Case("systemz", true)
5985 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005986 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005987 .Default(false);
5988 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005989
5990 StringRef getABI() const override {
5991 if (HasVector)
5992 return "vector";
5993 return "";
5994 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00005995
5996 bool useFloat128ManglingForLongDouble() const override {
5997 return true;
5998 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005999};
6000
6001const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6002#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006003 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006004#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006005};
6006
6007const char *const SystemZTargetInfo::GCCRegNames[] = {
6008 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6009 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6010 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6011 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6012};
6013
6014void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
6015 unsigned &NumNames) const {
6016 Names = GCCRegNames;
6017 NumNames = llvm::array_lengthof(GCCRegNames);
6018}
6019
6020bool SystemZTargetInfo::
6021validateAsmConstraint(const char *&Name,
6022 TargetInfo::ConstraintInfo &Info) const {
6023 switch (*Name) {
6024 default:
6025 return false;
6026
6027 case 'a': // Address register
6028 case 'd': // Data register (equivalent to 'r')
6029 case 'f': // Floating-point register
6030 Info.setAllowsRegister();
6031 return true;
6032
6033 case 'I': // Unsigned 8-bit constant
6034 case 'J': // Unsigned 12-bit constant
6035 case 'K': // Signed 16-bit constant
6036 case 'L': // Signed 20-bit displacement (on all targets we support)
6037 case 'M': // 0x7fffffff
6038 return true;
6039
6040 case 'Q': // Memory with base and unsigned 12-bit displacement
6041 case 'R': // Likewise, plus an index
6042 case 'S': // Memory with base and signed 20-bit displacement
6043 case 'T': // Likewise, plus an index
6044 Info.setAllowsMemory();
6045 return true;
6046 }
6047}
Ulrich Weigand47445072013-05-06 16:26:41 +00006048
Eric Christopherc48497a2015-09-18 21:26:24 +00006049class MSP430TargetInfo : public TargetInfo {
6050 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006051
Eric Christopherc48497a2015-09-18 21:26:24 +00006052public:
6053 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6054 BigEndian = false;
6055 TLSSupported = false;
6056 IntWidth = 16;
6057 IntAlign = 16;
6058 LongWidth = 32;
6059 LongLongWidth = 64;
6060 LongAlign = LongLongAlign = 16;
6061 PointerWidth = 16;
6062 PointerAlign = 16;
6063 SuitableAlign = 16;
6064 SizeType = UnsignedInt;
6065 IntMaxType = SignedLongLong;
6066 IntPtrType = SignedInt;
6067 PtrDiffType = SignedInt;
6068 SigAtomicType = SignedLong;
6069 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006070 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006071 void getTargetDefines(const LangOptions &Opts,
6072 MacroBuilder &Builder) const override {
6073 Builder.defineMacro("MSP430");
6074 Builder.defineMacro("__MSP430__");
6075 // FIXME: defines for different 'flavours' of MCU
6076 }
6077 void getTargetBuiltins(const Builtin::Info *&Records,
6078 unsigned &NumRecords) const override {
6079 // FIXME: Implement.
6080 Records = nullptr;
6081 NumRecords = 0;
6082 }
6083 bool hasFeature(StringRef Feature) const override {
6084 return Feature == "msp430";
6085 }
6086 void getGCCRegNames(const char *const *&Names,
6087 unsigned &NumNames) const override;
6088 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6089 unsigned &NumAliases) const override {
6090 // No aliases.
6091 Aliases = nullptr;
6092 NumAliases = 0;
6093 }
6094 bool validateAsmConstraint(const char *&Name,
6095 TargetInfo::ConstraintInfo &info) const override {
6096 // FIXME: implement
6097 switch (*Name) {
6098 case 'K': // the constant 1
6099 case 'L': // constant -1^20 .. 1^19
6100 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006101 return true;
6102 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006103 // No target constraints for now.
6104 return false;
6105 }
6106 const char *getClobbers() const override {
6107 // FIXME: Is this really right?
6108 return "";
6109 }
6110 BuiltinVaListKind getBuiltinVaListKind() const override {
6111 // FIXME: implement
6112 return TargetInfo::CharPtrBuiltinVaList;
6113 }
6114};
6115
6116const char *const MSP430TargetInfo::GCCRegNames[] = {
6117 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6118 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6119
6120void MSP430TargetInfo::getGCCRegNames(const char *const *&Names,
6121 unsigned &NumNames) const {
6122 Names = GCCRegNames;
6123 NumNames = llvm::array_lengthof(GCCRegNames);
6124}
6125
6126// LLVM and Clang cannot be used directly to output native binaries for
6127// target, but is used to compile C code to llvm bitcode with correct
6128// type and alignment information.
6129//
6130// TCE uses the llvm bitcode as input and uses it for generating customized
6131// target processor and program binary. TCE co-design environment is
6132// publicly available in http://tce.cs.tut.fi
6133
6134static const unsigned TCEOpenCLAddrSpaceMap[] = {
6135 3, // opencl_global
6136 4, // opencl_local
6137 5, // opencl_constant
6138 // FIXME: generic has to be added to the target
6139 0, // opencl_generic
6140 0, // cuda_device
6141 0, // cuda_constant
6142 0 // cuda_shared
6143};
6144
6145class TCETargetInfo : public TargetInfo {
6146public:
6147 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6148 TLSSupported = false;
6149 IntWidth = 32;
6150 LongWidth = LongLongWidth = 32;
6151 PointerWidth = 32;
6152 IntAlign = 32;
6153 LongAlign = LongLongAlign = 32;
6154 PointerAlign = 32;
6155 SuitableAlign = 32;
6156 SizeType = UnsignedInt;
6157 IntMaxType = SignedLong;
6158 IntPtrType = SignedInt;
6159 PtrDiffType = SignedInt;
6160 FloatWidth = 32;
6161 FloatAlign = 32;
6162 DoubleWidth = 32;
6163 DoubleAlign = 32;
6164 LongDoubleWidth = 32;
6165 LongDoubleAlign = 32;
6166 FloatFormat = &llvm::APFloat::IEEEsingle;
6167 DoubleFormat = &llvm::APFloat::IEEEsingle;
6168 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6169 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6170 "-f64:32-v64:32-v128:32-a:0:32-n32";
6171 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6172 UseAddrSpaceMapMangling = true;
6173 }
6174
6175 void getTargetDefines(const LangOptions &Opts,
6176 MacroBuilder &Builder) const override {
6177 DefineStd(Builder, "tce", Opts);
6178 Builder.defineMacro("__TCE__");
6179 Builder.defineMacro("__TCE_V1__");
6180 }
6181 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6182
6183 void getTargetBuiltins(const Builtin::Info *&Records,
6184 unsigned &NumRecords) const override {}
6185 const char *getClobbers() const override { return ""; }
6186 BuiltinVaListKind getBuiltinVaListKind() const override {
6187 return TargetInfo::VoidPtrBuiltinVaList;
6188 }
6189 void getGCCRegNames(const char *const *&Names,
6190 unsigned &NumNames) const override {}
6191 bool validateAsmConstraint(const char *&Name,
6192 TargetInfo::ConstraintInfo &info) const override {
6193 return true;
6194 }
6195 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6196 unsigned &NumAliases) const override {}
6197};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006198
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006199class BPFTargetInfo : public TargetInfo {
6200public:
6201 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6202 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6203 SizeType = UnsignedLong;
6204 PtrDiffType = SignedLong;
6205 IntPtrType = SignedLong;
6206 IntMaxType = SignedLong;
6207 Int64Type = SignedLong;
6208 RegParmMax = 5;
6209 if (Triple.getArch() == llvm::Triple::bpfeb) {
6210 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006211 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006212 } else {
6213 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006214 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006215 }
6216 MaxAtomicPromoteWidth = 64;
6217 MaxAtomicInlineWidth = 64;
6218 TLSSupported = false;
6219 }
6220 void getTargetDefines(const LangOptions &Opts,
6221 MacroBuilder &Builder) const override {
6222 DefineStd(Builder, "bpf", Opts);
6223 Builder.defineMacro("__BPF__");
6224 }
6225 bool hasFeature(StringRef Feature) const override {
6226 return Feature == "bpf";
6227 }
6228
6229 void getTargetBuiltins(const Builtin::Info *&Records,
6230 unsigned &NumRecords) const override {}
6231 const char *getClobbers() const override {
6232 return "";
6233 }
6234 BuiltinVaListKind getBuiltinVaListKind() const override {
6235 return TargetInfo::VoidPtrBuiltinVaList;
6236 }
6237 void getGCCRegNames(const char * const *&Names,
6238 unsigned &NumNames) const override {
6239 Names = nullptr;
6240 NumNames = 0;
6241 }
6242 bool validateAsmConstraint(const char *&Name,
6243 TargetInfo::ConstraintInfo &info) const override {
6244 return true;
6245 }
6246 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6247 unsigned &NumAliases) const override {
6248 Aliases = nullptr;
6249 NumAliases = 0;
6250 }
6251};
6252
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006253class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006254 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006255
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006256 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006257 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006258 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006259 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006260 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006261 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006262 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006263 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006264 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006265 enum DspRevEnum {
6266 NoDSP, DSP1, DSP2
6267 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006268 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006269
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006270protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006271 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006272 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006273
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006274public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006275 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6276 const std::string &CPUStr)
6277 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006278 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006279 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6280 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6281 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006282
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006283 bool isNaN2008Default() const {
6284 return CPU == "mips32r6" || CPU == "mips64r6";
6285 }
6286
6287 bool isFP64Default() const {
6288 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6289 }
6290
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006291 bool isNan2008() const override {
6292 return IsNan2008;
6293 }
6294
Alp Toker4925ba72014-06-07 23:30:42 +00006295 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006296 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006297 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6298 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006299 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006300 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006301 .Case("mips1", IsMips32)
6302 .Case("mips2", IsMips32)
6303 .Case("mips3", true)
6304 .Case("mips4", true)
6305 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006306 .Case("mips32", IsMips32)
6307 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006308 .Case("mips32r3", IsMips32)
6309 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006310 .Case("mips32r6", IsMips32)
6311 .Case("mips64", true)
6312 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006313 .Case("mips64r3", true)
6314 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006315 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006316 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006317 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006318 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006319 const std::string& getCPU() const { return CPU; }
Eric Christopheref1e2952015-08-28 02:13:58 +00006320 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
Eric Christophera8a14c32015-08-31 18:39:16 +00006321 StringRef CPU,
6322 std::vector<std::string> &FeaturesVec) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006323 if (CPU == "octeon")
6324 Features["mips64r2"] = Features["cnmips"] = true;
6325 else
6326 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006327 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006328 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006329
Craig Topper3164f332014-03-11 03:39:26 +00006330 void getTargetDefines(const LangOptions &Opts,
6331 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006332 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006333 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006334 if (Opts.GNUMode)
6335 Builder.defineMacro("mips");
6336
Simon Atanasyan683535b2012-08-29 19:14:58 +00006337 Builder.defineMacro("__REGISTER_PREFIX__", "");
6338
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006339 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006340 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006341 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006342 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006343 case SoftFloat:
6344 Builder.defineMacro("__mips_soft_float", Twine(1));
6345 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006346 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006347
Simon Atanasyan16071912013-04-14 14:07:30 +00006348 if (IsSingleFloat)
6349 Builder.defineMacro("__mips_single_float", Twine(1));
6350
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006351 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6352 Builder.defineMacro("_MIPS_FPSET",
6353 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6354
Simon Atanasyan72244b62012-07-05 16:06:06 +00006355 if (IsMips16)
6356 Builder.defineMacro("__mips16", Twine(1));
6357
Simon Atanasyan60777612013-04-14 14:07:51 +00006358 if (IsMicromips)
6359 Builder.defineMacro("__mips_micromips", Twine(1));
6360
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006361 if (IsNan2008)
6362 Builder.defineMacro("__mips_nan2008", Twine(1));
6363
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006364 switch (DspRev) {
6365 default:
6366 break;
6367 case DSP1:
6368 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6369 Builder.defineMacro("__mips_dsp", Twine(1));
6370 break;
6371 case DSP2:
6372 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6373 Builder.defineMacro("__mips_dspr2", Twine(1));
6374 Builder.defineMacro("__mips_dsp", Twine(1));
6375 break;
6376 }
6377
Jack Carter44ff1e52013-08-12 17:20:29 +00006378 if (HasMSA)
6379 Builder.defineMacro("__mips_msa", Twine(1));
6380
Simon Atanasyan26f19672012-04-05 19:28:31 +00006381 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6382 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6383 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006384
6385 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6386 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006387 }
6388
Craig Topper3164f332014-03-11 03:39:26 +00006389 void getTargetBuiltins(const Builtin::Info *&Records,
6390 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006391 Records = BuiltinInfo;
6392 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006393 }
Craig Topper3164f332014-03-11 03:39:26 +00006394 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006395 return llvm::StringSwitch<bool>(Feature)
6396 .Case("mips", true)
6397 .Case("fp64", HasFP64)
6398 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006399 }
Craig Topper3164f332014-03-11 03:39:26 +00006400 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006401 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006402 }
Craig Topper3164f332014-03-11 03:39:26 +00006403 void getGCCRegNames(const char * const *&Names,
6404 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006405 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006406 // CPU register names
6407 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006408 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6409 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6410 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006411 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6412 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006413 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6414 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6415 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6416 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006417 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006418 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006419 "$fcc5","$fcc6","$fcc7",
6420 // MSA register names
6421 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6422 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6423 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6424 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6425 // MSA control register names
6426 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6427 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006428 };
6429 Names = GCCRegNames;
6430 NumNames = llvm::array_lengthof(GCCRegNames);
6431 }
Craig Topper3164f332014-03-11 03:39:26 +00006432 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6433 unsigned &NumAliases) const override = 0;
6434 bool validateAsmConstraint(const char *&Name,
6435 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006436 switch (*Name) {
6437 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006438 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006439 case 'r': // CPU registers.
6440 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006441 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006442 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006443 case 'c': // $25 for indirect jumps
6444 case 'l': // lo register
6445 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006446 Info.setAllowsRegister();
6447 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006448 case 'I': // Signed 16-bit constant
6449 case 'J': // Integer 0
6450 case 'K': // Unsigned 16-bit constant
6451 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6452 case 'M': // Constants not loadable via lui, addiu, or ori
6453 case 'N': // Constant -1 to -65535
6454 case 'O': // A signed 15-bit constant
6455 case 'P': // A constant between 1 go 65535
6456 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006457 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006458 Info.setAllowsMemory();
6459 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006460 case 'Z':
6461 if (Name[1] == 'C') { // An address usable by ll, and sc.
6462 Info.setAllowsMemory();
6463 Name++; // Skip over 'Z'.
6464 return true;
6465 }
6466 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006467 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006468 }
6469
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006470 std::string convertConstraint(const char *&Constraint) const override {
6471 std::string R;
6472 switch (*Constraint) {
6473 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6474 if (Constraint[1] == 'C') {
6475 R = std::string("^") + std::string(Constraint, 2);
6476 Constraint++;
6477 return R;
6478 }
6479 break;
6480 }
6481 return TargetInfo::convertConstraint(Constraint);
6482 }
6483
Craig Topper3164f332014-03-11 03:39:26 +00006484 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006485 // In GCC, $1 is not widely used in generated code (it's used only in a few
6486 // specific situations), so there is no real need for users to add it to
6487 // the clobbers list if they want to use it in their inline assembly code.
6488 //
6489 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6490 // code generation, so using it in inline assembly without adding it to the
6491 // clobbers list can cause conflicts between the inline assembly code and
6492 // the surrounding generated code.
6493 //
6494 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6495 // operands, which will conflict with the ".set at" assembler option (which
6496 // we use only for inline assembly, in order to maintain compatibility with
6497 // GCC) and will also conflict with the user's usage of $1.
6498 //
6499 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6500 // register for generated code is to automatically clobber $1 for all inline
6501 // assembly code.
6502 //
6503 // FIXME: We should automatically clobber $1 only for inline assembly code
6504 // which actually uses it. This would allow LLVM to use $1 for inline
6505 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006506 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006507 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006508
Craig Topper3164f332014-03-11 03:39:26 +00006509 bool handleTargetFeatures(std::vector<std::string> &Features,
6510 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006511 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006512 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006513 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006514 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006515 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006516 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006517 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006518
Eric Christopher610fe112015-08-26 08:21:55 +00006519 for (const auto &Feature : Features) {
6520 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006521 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006522 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006523 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006524 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006525 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006526 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006527 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006528 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006529 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006530 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006531 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006532 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006533 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006534 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006535 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006536 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006537 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006538 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006539 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006540 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006541 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006542 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006543
Eric Christopher964a5f32015-08-05 23:48:05 +00006544 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006545
Rafael Espindolaeb265472013-08-21 21:59:03 +00006546 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006547 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006548
Craig Topper3164f332014-03-11 03:39:26 +00006549 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006550 if (RegNo == 0) return 4;
6551 if (RegNo == 1) return 5;
6552 return -1;
6553 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006554
6555 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006556};
6557
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006558const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006559#define BUILTIN(ID, TYPE, ATTRS) \
6560 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6561#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6562 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006563#include "clang/Basic/BuiltinsMips.def"
6564};
6565
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006566class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006567public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006568 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006569 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006570 SizeType = UnsignedInt;
6571 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006572 Int64Type = SignedLongLong;
6573 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006574 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006575 }
Craig Topper3164f332014-03-11 03:39:26 +00006576 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006577 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006578 ABI = Name;
6579 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006580 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006581 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006582 }
Craig Topper3164f332014-03-11 03:39:26 +00006583 void getTargetDefines(const LangOptions &Opts,
6584 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006585 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006586
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006587 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006588 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6589
6590 const std::string& CPUStr = getCPU();
6591 if (CPUStr == "mips32")
6592 Builder.defineMacro("__mips_isa_rev", "1");
6593 else if (CPUStr == "mips32r2")
6594 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006595 else if (CPUStr == "mips32r3")
6596 Builder.defineMacro("__mips_isa_rev", "3");
6597 else if (CPUStr == "mips32r5")
6598 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006599 else if (CPUStr == "mips32r6")
6600 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006601
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006602 if (ABI == "o32") {
6603 Builder.defineMacro("__mips_o32");
6604 Builder.defineMacro("_ABIO32", "1");
6605 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6606 }
6607 else if (ABI == "eabi")
6608 Builder.defineMacro("__mips_eabi");
6609 else
David Blaikie83d382b2011-09-23 05:06:16 +00006610 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006611 }
Craig Topper3164f332014-03-11 03:39:26 +00006612 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6613 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006614 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6615 { { "at" }, "$1" },
6616 { { "v0" }, "$2" },
6617 { { "v1" }, "$3" },
6618 { { "a0" }, "$4" },
6619 { { "a1" }, "$5" },
6620 { { "a2" }, "$6" },
6621 { { "a3" }, "$7" },
6622 { { "t0" }, "$8" },
6623 { { "t1" }, "$9" },
6624 { { "t2" }, "$10" },
6625 { { "t3" }, "$11" },
6626 { { "t4" }, "$12" },
6627 { { "t5" }, "$13" },
6628 { { "t6" }, "$14" },
6629 { { "t7" }, "$15" },
6630 { { "s0" }, "$16" },
6631 { { "s1" }, "$17" },
6632 { { "s2" }, "$18" },
6633 { { "s3" }, "$19" },
6634 { { "s4" }, "$20" },
6635 { { "s5" }, "$21" },
6636 { { "s6" }, "$22" },
6637 { { "s7" }, "$23" },
6638 { { "t8" }, "$24" },
6639 { { "t9" }, "$25" },
6640 { { "k0" }, "$26" },
6641 { { "k1" }, "$27" },
6642 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006643 { { "sp","$sp" }, "$29" },
6644 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006645 { { "ra" }, "$31" }
6646 };
6647 Aliases = GCCRegAliases;
6648 NumAliases = llvm::array_lengthof(GCCRegAliases);
6649 }
6650};
6651
6652class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006653 void setDataLayoutString() override {
6654 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006655 }
6656
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006657public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006658 Mips32EBTargetInfo(const llvm::Triple &Triple)
6659 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006660 }
Craig Topper3164f332014-03-11 03:39:26 +00006661 void getTargetDefines(const LangOptions &Opts,
6662 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006663 DefineStd(Builder, "MIPSEB", Opts);
6664 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006665 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006666 }
6667};
6668
6669class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006670 void setDataLayoutString() override {
6671 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006672 }
6673
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006674public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006675 Mips32ELTargetInfo(const llvm::Triple &Triple)
6676 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006677 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006678 }
Craig Topper3164f332014-03-11 03:39:26 +00006679 void getTargetDefines(const LangOptions &Opts,
6680 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006681 DefineStd(Builder, "MIPSEL", Opts);
6682 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006683 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006684 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006685};
Akira Hatanakabef17452011-09-20 19:21:49 +00006686
6687class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006688public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006689 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006690 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006691 LongDoubleWidth = LongDoubleAlign = 128;
6692 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006693 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6694 LongDoubleWidth = LongDoubleAlign = 64;
6695 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6696 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006697 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006698 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006699 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006700 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006701
6702 void setN64ABITypes() {
6703 LongWidth = LongAlign = 64;
6704 PointerWidth = PointerAlign = 64;
6705 SizeType = UnsignedLong;
6706 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006707 Int64Type = SignedLong;
6708 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006709 }
6710
6711 void setN32ABITypes() {
6712 LongWidth = LongAlign = 32;
6713 PointerWidth = PointerAlign = 32;
6714 SizeType = UnsignedInt;
6715 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006716 Int64Type = SignedLongLong;
6717 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006718 }
6719
Craig Topper3164f332014-03-11 03:39:26 +00006720 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006721 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006722 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006723 ABI = Name;
6724 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006725 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006726 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006727 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006728 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006729 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006730 }
6731 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006732 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006733
Craig Topper3164f332014-03-11 03:39:26 +00006734 void getTargetDefines(const LangOptions &Opts,
6735 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006736 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006737
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006738 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006739 Builder.defineMacro("__mips64");
6740 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006741 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6742
6743 const std::string& CPUStr = getCPU();
6744 if (CPUStr == "mips64")
6745 Builder.defineMacro("__mips_isa_rev", "1");
6746 else if (CPUStr == "mips64r2")
6747 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006748 else if (CPUStr == "mips64r3")
6749 Builder.defineMacro("__mips_isa_rev", "3");
6750 else if (CPUStr == "mips64r5")
6751 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006752 else if (CPUStr == "mips64r6")
6753 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006754
Akira Hatanakabef17452011-09-20 19:21:49 +00006755 if (ABI == "n32") {
6756 Builder.defineMacro("__mips_n32");
6757 Builder.defineMacro("_ABIN32", "2");
6758 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6759 }
6760 else if (ABI == "n64") {
6761 Builder.defineMacro("__mips_n64");
6762 Builder.defineMacro("_ABI64", "3");
6763 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6764 }
6765 else
David Blaikie83d382b2011-09-23 05:06:16 +00006766 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006767 }
Craig Topper3164f332014-03-11 03:39:26 +00006768 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6769 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006770 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6771 { { "at" }, "$1" },
6772 { { "v0" }, "$2" },
6773 { { "v1" }, "$3" },
6774 { { "a0" }, "$4" },
6775 { { "a1" }, "$5" },
6776 { { "a2" }, "$6" },
6777 { { "a3" }, "$7" },
6778 { { "a4" }, "$8" },
6779 { { "a5" }, "$9" },
6780 { { "a6" }, "$10" },
6781 { { "a7" }, "$11" },
6782 { { "t0" }, "$12" },
6783 { { "t1" }, "$13" },
6784 { { "t2" }, "$14" },
6785 { { "t3" }, "$15" },
6786 { { "s0" }, "$16" },
6787 { { "s1" }, "$17" },
6788 { { "s2" }, "$18" },
6789 { { "s3" }, "$19" },
6790 { { "s4" }, "$20" },
6791 { { "s5" }, "$21" },
6792 { { "s6" }, "$22" },
6793 { { "s7" }, "$23" },
6794 { { "t8" }, "$24" },
6795 { { "t9" }, "$25" },
6796 { { "k0" }, "$26" },
6797 { { "k1" }, "$27" },
6798 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006799 { { "sp","$sp" }, "$29" },
6800 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006801 { { "ra" }, "$31" }
6802 };
6803 Aliases = GCCRegAliases;
6804 NumAliases = llvm::array_lengthof(GCCRegAliases);
6805 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006806
6807 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006808};
6809
6810class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006811 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006812 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006813 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 +00006814 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006815 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006816
Akira Hatanakabef17452011-09-20 19:21:49 +00006817 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006818
Akira Hatanakabef17452011-09-20 19:21:49 +00006819public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006820 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006821 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006822 void getTargetDefines(const LangOptions &Opts,
6823 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006824 DefineStd(Builder, "MIPSEB", Opts);
6825 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006826 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006827 }
6828};
6829
6830class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006831 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006832 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006833 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 +00006834 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006835 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006836 }
6837public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006838 Mips64ELTargetInfo(const llvm::Triple &Triple)
6839 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006840 // Default ABI is n64.
6841 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006842 }
Craig Topper3164f332014-03-11 03:39:26 +00006843 void getTargetDefines(const LangOptions &Opts,
6844 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006845 DefineStd(Builder, "MIPSEL", Opts);
6846 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006847 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006848 }
6849};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006850
Ivan Krasindd7403e2011-08-24 20:22:22 +00006851class PNaClTargetInfo : public TargetInfo {
6852public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006853 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006854 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006855 this->UserLabelPrefix = "";
6856 this->LongAlign = 32;
6857 this->LongWidth = 32;
6858 this->PointerAlign = 32;
6859 this->PointerWidth = 32;
6860 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006861 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006862 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006863 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006864 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006865 this->SizeType = TargetInfo::UnsignedInt;
6866 this->PtrDiffType = TargetInfo::SignedInt;
6867 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006868 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006869 }
6870
Craig Toppere6f17d02014-03-11 04:07:52 +00006871 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006872 Builder.defineMacro("__le32__");
6873 Builder.defineMacro("__pnacl__");
6874 }
Craig Topper3164f332014-03-11 03:39:26 +00006875 void getTargetDefines(const LangOptions &Opts,
6876 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006877 getArchDefines(Opts, Builder);
6878 }
Craig Topper3164f332014-03-11 03:39:26 +00006879 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006880 return Feature == "pnacl";
6881 }
Craig Topper3164f332014-03-11 03:39:26 +00006882 void getTargetBuiltins(const Builtin::Info *&Records,
6883 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006884 }
Craig Topper3164f332014-03-11 03:39:26 +00006885 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006886 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006887 }
Craig Topper3164f332014-03-11 03:39:26 +00006888 void getGCCRegNames(const char * const *&Names,
6889 unsigned &NumNames) const override;
6890 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6891 unsigned &NumAliases) const override;
6892 bool validateAsmConstraint(const char *&Name,
6893 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006894 return false;
6895 }
6896
Craig Topper3164f332014-03-11 03:39:26 +00006897 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006898 return "";
6899 }
6900};
6901
6902void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6903 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006904 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006905 NumNames = 0;
6906}
6907
6908void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6909 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006910 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006911 NumAliases = 0;
6912}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006913
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006914// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6915class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6916public:
6917 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00006918 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006919 }
6920
6921 BuiltinVaListKind getBuiltinVaListKind() const override {
6922 return TargetInfo::PNaClABIBuiltinVaList;
6923 }
6924};
6925
JF Bastien643817d2014-09-12 17:52:47 +00006926class Le64TargetInfo : public TargetInfo {
6927 static const Builtin::Info BuiltinInfo[];
6928
6929public:
6930 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6931 BigEndian = false;
6932 NoAsmVariants = true;
6933 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6934 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006935 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006936 }
6937
6938 void getTargetDefines(const LangOptions &Opts,
6939 MacroBuilder &Builder) const override {
6940 DefineStd(Builder, "unix", Opts);
6941 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6942 Builder.defineMacro("__ELF__");
6943 }
6944 void getTargetBuiltins(const Builtin::Info *&Records,
6945 unsigned &NumRecords) const override {
6946 Records = BuiltinInfo;
6947 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6948 }
6949 BuiltinVaListKind getBuiltinVaListKind() const override {
6950 return TargetInfo::PNaClABIBuiltinVaList;
6951 }
6952 const char *getClobbers() const override { return ""; }
6953 void getGCCRegNames(const char *const *&Names,
6954 unsigned &NumNames) const override {
6955 Names = nullptr;
6956 NumNames = 0;
6957 }
6958 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6959 unsigned &NumAliases) const override {
6960 Aliases = nullptr;
6961 NumAliases = 0;
6962 }
6963 bool validateAsmConstraint(const char *&Name,
6964 TargetInfo::ConstraintInfo &Info) const override {
6965 return false;
6966 }
6967
6968 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006969};
Dan Gohmanc2853072015-09-03 22:51:53 +00006970
6971class WebAssemblyTargetInfo : public TargetInfo {
6972 static const Builtin::Info BuiltinInfo[];
6973
6974 enum SIMDEnum {
6975 NoSIMD,
6976 SIMD128,
6977 } SIMDLevel;
6978
6979public:
6980 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
6981 : TargetInfo(T), SIMDLevel(NoSIMD) {
6982 BigEndian = false;
6983 NoAsmVariants = true;
6984 SuitableAlign = 128;
6985 LargeArrayMinWidth = 128;
6986 LargeArrayAlign = 128;
6987 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00006988 SigAtomicType = SignedLong;
Dan Gohmanc2853072015-09-03 22:51:53 +00006989 }
6990
6991protected:
6992 void getTargetDefines(const LangOptions &Opts,
6993 MacroBuilder &Builder) const override {
6994 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
6995 if (SIMDLevel >= SIMD128)
6996 Builder.defineMacro("__wasm_simd128__");
6997 }
6998
6999private:
7000 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7001 StringRef CPU,
7002 std::vector<std::string> &FeaturesVec) const override {
7003 if (CPU == "bleeding-edge")
7004 Features["simd128"] = true;
7005 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7006 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007007 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007008 return llvm::StringSwitch<bool>(Feature)
7009 .Case("simd128", SIMDLevel >= SIMD128)
7010 .Default(false);
7011 }
7012 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007013 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007014 for (const auto &Feature : Features) {
7015 if (Feature == "+simd128") {
7016 SIMDLevel = std::max(SIMDLevel, SIMD128);
7017 continue;
7018 }
7019 if (Feature == "-simd128") {
7020 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7021 continue;
7022 }
7023
7024 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7025 << "-target-feature";
7026 return false;
7027 }
7028 return true;
7029 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007030 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007031 return llvm::StringSwitch<bool>(Name)
7032 .Case("mvp", true)
7033 .Case("bleeding-edge", true)
7034 .Case("generic", true)
7035 .Default(false);
7036 }
7037 void getTargetBuiltins(const Builtin::Info *&Records,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007038 unsigned &NumRecords) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007039 Records = BuiltinInfo;
7040 NumRecords = clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin;
7041 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007042 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007043 // TODO: Implement va_list properly.
7044 return VoidPtrBuiltinVaList;
7045 }
7046 void getGCCRegNames(const char *const *&Names,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007047 unsigned &NumNames) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007048 Names = nullptr;
7049 NumNames = 0;
7050 }
7051 void getGCCRegAliases(const GCCRegAlias *&Aliases,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007052 unsigned &NumAliases) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007053 Aliases = nullptr;
7054 NumAliases = 0;
7055 }
7056 bool
7057 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007058 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007059 return false;
7060 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007061 const char *getClobbers() const final { return ""; }
7062 bool isCLZForZeroUndef() const final { return false; }
7063 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007064 IntType getIntTypeByWidth(unsigned BitWidth,
7065 bool IsSigned) const final {
7066 // WebAssembly prefers long long for explicitly 64-bit integers.
7067 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7068 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7069 }
7070 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7071 bool IsSigned) const final {
7072 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7073 return BitWidth == 64
7074 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7075 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7076 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007077};
7078
7079const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7080#define BUILTIN(ID, TYPE, ATTRS) \
7081 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7082#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7083 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7084#include "clang/Basic/BuiltinsWebAssembly.def"
7085};
7086
7087class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7088public:
7089 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7090 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007091 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohmanc2853072015-09-03 22:51:53 +00007092 DataLayoutString = "e-p:32:32-i64:64-n32:64-S128";
7093 }
7094
7095protected:
7096 void getTargetDefines(const LangOptions &Opts,
7097 MacroBuilder &Builder) const override {
7098 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7099 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7100 }
7101};
7102
7103class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7104public:
7105 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7106 : WebAssemblyTargetInfo(T) {
7107 LongAlign = LongWidth = 64;
7108 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007109 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohmanc2853072015-09-03 22:51:53 +00007110 DataLayoutString = "e-p:64:64-i64:64-n32:64-S128";
7111 }
7112
7113protected:
7114 void getTargetDefines(const LangOptions &Opts,
7115 MacroBuilder &Builder) const override {
7116 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7117 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7118 }
7119};
7120
JF Bastien643817d2014-09-12 17:52:47 +00007121const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7122#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007123 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007124#include "clang/Basic/BuiltinsLe64.def"
7125};
7126
Eric Christopherc48497a2015-09-18 21:26:24 +00007127static const unsigned SPIRAddrSpaceMap[] = {
7128 1, // opencl_global
7129 3, // opencl_local
7130 2, // opencl_constant
7131 4, // opencl_generic
7132 0, // cuda_device
7133 0, // cuda_constant
7134 0 // cuda_shared
7135};
7136class SPIRTargetInfo : public TargetInfo {
7137public:
7138 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7139 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7140 "SPIR target must use unknown OS");
7141 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7142 "SPIR target must use unknown environment type");
7143 BigEndian = false;
7144 TLSSupported = false;
7145 LongWidth = LongAlign = 64;
7146 AddrSpaceMap = &SPIRAddrSpaceMap;
7147 UseAddrSpaceMapMangling = true;
7148 // Define available target features
7149 // These must be defined in sorted order!
7150 NoAsmVariants = true;
7151 }
7152 void getTargetDefines(const LangOptions &Opts,
7153 MacroBuilder &Builder) const override {
7154 DefineStd(Builder, "SPIR", Opts);
7155 }
7156 bool hasFeature(StringRef Feature) const override {
7157 return Feature == "spir";
7158 }
Craig Topper3164f332014-03-11 03:39:26 +00007159
Eric Christopherc48497a2015-09-18 21:26:24 +00007160 void getTargetBuiltins(const Builtin::Info *&Records,
7161 unsigned &NumRecords) const override {}
7162 const char *getClobbers() const override { return ""; }
7163 void getGCCRegNames(const char *const *&Names,
7164 unsigned &NumNames) const override {}
7165 bool validateAsmConstraint(const char *&Name,
7166 TargetInfo::ConstraintInfo &info) const override {
7167 return true;
7168 }
7169 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7170 unsigned &NumAliases) const override {}
7171 BuiltinVaListKind getBuiltinVaListKind() const override {
7172 return TargetInfo::VoidPtrBuiltinVaList;
7173 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007174
Eric Christopherc48497a2015-09-18 21:26:24 +00007175 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7176 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7177 : CCCR_Warning;
7178 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007179
Eric Christopherc48497a2015-09-18 21:26:24 +00007180 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7181 return CC_SpirFunction;
7182 }
7183};
Guy Benyeib798fc92012-12-11 21:38:14 +00007184
Eric Christopherc48497a2015-09-18 21:26:24 +00007185class SPIR32TargetInfo : public SPIRTargetInfo {
7186public:
7187 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7188 PointerWidth = PointerAlign = 32;
7189 SizeType = TargetInfo::UnsignedInt;
7190 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7191 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7192 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7193 }
7194 void getTargetDefines(const LangOptions &Opts,
7195 MacroBuilder &Builder) const override {
7196 DefineStd(Builder, "SPIR32", Opts);
7197 }
7198};
Guy Benyeib798fc92012-12-11 21:38:14 +00007199
Eric Christopherc48497a2015-09-18 21:26:24 +00007200class SPIR64TargetInfo : public SPIRTargetInfo {
7201public:
7202 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7203 PointerWidth = PointerAlign = 64;
7204 SizeType = TargetInfo::UnsignedLong;
7205 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7206 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7207 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7208 }
7209 void getTargetDefines(const LangOptions &Opts,
7210 MacroBuilder &Builder) const override {
7211 DefineStd(Builder, "SPIR64", Opts);
7212 }
7213};
Guy Benyeib798fc92012-12-11 21:38:14 +00007214
Robert Lytton0e076492013-08-13 09:43:10 +00007215class XCoreTargetInfo : public TargetInfo {
7216 static const Builtin::Info BuiltinInfo[];
7217public:
7218 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7219 BigEndian = false;
7220 NoAsmVariants = true;
7221 LongLongAlign = 32;
7222 SuitableAlign = 32;
7223 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007224 SizeType = UnsignedInt;
7225 PtrDiffType = SignedInt;
7226 IntPtrType = SignedInt;
7227 WCharType = UnsignedChar;
7228 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007229 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007230 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7231 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007232 }
Craig Topper3164f332014-03-11 03:39:26 +00007233 void getTargetDefines(const LangOptions &Opts,
7234 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007235 Builder.defineMacro("__XS1B__");
7236 }
Craig Topper3164f332014-03-11 03:39:26 +00007237 void getTargetBuiltins(const Builtin::Info *&Records,
7238 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007239 Records = BuiltinInfo;
7240 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
7241 }
Craig Topper3164f332014-03-11 03:39:26 +00007242 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007243 return TargetInfo::VoidPtrBuiltinVaList;
7244 }
Craig Topper3164f332014-03-11 03:39:26 +00007245 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007246 return "";
7247 }
Craig Topper3164f332014-03-11 03:39:26 +00007248 void getGCCRegNames(const char * const *&Names,
7249 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007250 static const char * const GCCRegNames[] = {
7251 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7252 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7253 };
7254 Names = GCCRegNames;
7255 NumNames = llvm::array_lengthof(GCCRegNames);
7256 }
Craig Topper3164f332014-03-11 03:39:26 +00007257 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7258 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00007259 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00007260 NumAliases = 0;
7261 }
Craig Topper3164f332014-03-11 03:39:26 +00007262 bool validateAsmConstraint(const char *&Name,
7263 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007264 return false;
7265 }
Craig Topper3164f332014-03-11 03:39:26 +00007266 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007267 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7268 return (RegNo < 2)? RegNo : -1;
7269 }
Robert Lytton0e076492013-08-13 09:43:10 +00007270};
7271
7272const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007273#define BUILTIN(ID, TYPE, ATTRS) \
7274 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7275#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7276 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007277#include "clang/Basic/BuiltinsXCore.def"
7278};
Robert Lytton0e076492013-08-13 09:43:10 +00007279
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007280// x86_32 Android target
7281class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7282public:
7283 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7284 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7285 SuitableAlign = 32;
7286 LongDoubleWidth = 64;
7287 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7288 }
7289};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007290
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007291// x86_64 Android target
7292class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7293public:
7294 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7295 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7296 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7297 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007298
7299 bool useFloat128ManglingForLongDouble() const override {
7300 return true;
7301 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007302};
7303} // end anonymous namespace
7304
Chris Lattner5ba61f02006-10-14 07:39:34 +00007305//===----------------------------------------------------------------------===//
7306// Driver code
7307//===----------------------------------------------------------------------===//
7308
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007309static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007310 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007311
Daniel Dunbar52322032009-08-18 05:47:58 +00007312 switch (Triple.getArch()) {
7313 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007314 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007315
Tim Northover2a0783d2014-05-30 14:14:07 +00007316 case llvm::Triple::xcore:
7317 return new XCoreTargetInfo(Triple);
7318
7319 case llvm::Triple::hexagon:
7320 return new HexagonTargetInfo(Triple);
7321
7322 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007323 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007324 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007325
7326 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007327 case llvm::Triple::FreeBSD:
7328 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007329 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007330 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007331 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007332 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007333 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007334 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007335 }
7336
Christian Pirker9b019ae2014-02-25 13:51:00 +00007337 case llvm::Triple::aarch64_be:
7338 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007339 case llvm::Triple::FreeBSD:
7340 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007341 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007342 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007343 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007344 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007345 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007346 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007347 }
7348
Daniel Dunbar52322032009-08-18 05:47:58 +00007349 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007350 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007351 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007352 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007353
Daniel Dunbar52322032009-08-18 05:47:58 +00007354 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007355 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007356 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007357 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007358 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007359 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007360 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007361 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007362 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007363 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007364 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007365 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007366 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007367 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007368 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007369 case llvm::Triple::Win32:
7370 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007371 case llvm::Triple::Cygnus:
7372 return new CygwinARMTargetInfo(Triple);
7373 case llvm::Triple::GNU:
7374 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007375 case llvm::Triple::Itanium:
7376 return new ItaniumWindowsARMleTargetInfo(Triple);
7377 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007378 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007379 return new MicrosoftARMleTargetInfo(Triple);
7380 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007381 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007382 return new ARMleTargetInfo(Triple);
7383 }
7384
7385 case llvm::Triple::armeb:
7386 case llvm::Triple::thumbeb:
7387 if (Triple.isOSDarwin())
7388 return new DarwinARMTargetInfo(Triple);
7389
7390 switch (os) {
7391 case llvm::Triple::Linux:
7392 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7393 case llvm::Triple::FreeBSD:
7394 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7395 case llvm::Triple::NetBSD:
7396 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7397 case llvm::Triple::OpenBSD:
7398 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7399 case llvm::Triple::Bitrig:
7400 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7401 case llvm::Triple::RTEMS:
7402 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7403 case llvm::Triple::NaCl:
7404 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7405 default:
7406 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007407 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007408
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007409 case llvm::Triple::bpfeb:
7410 case llvm::Triple::bpfel:
7411 return new BPFTargetInfo(Triple);
7412
Daniel Dunbar52322032009-08-18 05:47:58 +00007413 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007414 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007415
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007416 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007417 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007418 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007419 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007420 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007421 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007422 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007423 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007424 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007425 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007426 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007427 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007428 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007429
7430 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007431 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007432 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007433 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007434 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007435 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007436 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007437 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007438 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007439 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007440 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007441 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007442 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007443 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007444 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007445
Akira Hatanakabef17452011-09-20 19:21:49 +00007446 case llvm::Triple::mips64:
7447 switch (os) {
7448 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007449 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007450 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007451 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007452 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007453 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007454 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007455 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007456 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007457 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007458 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007459 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007460 }
7461
7462 case llvm::Triple::mips64el:
7463 switch (os) {
7464 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007465 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007466 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007467 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007468 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007469 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007470 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007471 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007472 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007473 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007474 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007475 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007476 }
7477
Ivan Krasindd7403e2011-08-24 20:22:22 +00007478 case llvm::Triple::le32:
7479 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007480 case llvm::Triple::NaCl:
7481 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7482 default:
7483 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007484 }
7485
JF Bastien643817d2014-09-12 17:52:47 +00007486 case llvm::Triple::le64:
7487 return new Le64TargetInfo(Triple);
7488
Daniel Dunbar52322032009-08-18 05:47:58 +00007489 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007490 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007491 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007492 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007493 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007494 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007495 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007496 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007497 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007498 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007499 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007500 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007501 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007502 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007503 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007504 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007505 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007506
7507 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007508 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007509 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007510 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007511 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007512 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007513 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007514 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007515 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007516 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007517 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007518 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007519 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007520 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007521 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007522
Bill Schmidt778d3872013-07-26 01:36:11 +00007523 case llvm::Triple::ppc64le:
7524 switch (os) {
7525 case llvm::Triple::Linux:
7526 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007527 case llvm::Triple::NetBSD:
7528 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007529 default:
7530 return new PPC64TargetInfo(Triple);
7531 }
7532
Peter Collingbournec947aae2012-05-20 23:28:41 +00007533 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007534 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007535 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007536 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007537
Tom Stellardd8e38a32015-01-06 20:34:47 +00007538 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007539 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007540 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007541
Daniel Dunbar52322032009-08-18 05:47:58 +00007542 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007543 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007544 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007545 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007546 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007547 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007548 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007549 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007550 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007551 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007552 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007553 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007554 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007555 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007556 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007557
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007558 // The 'sparcel' architecture copies all the above cases except for Solaris.
7559 case llvm::Triple::sparcel:
7560 switch (os) {
7561 case llvm::Triple::Linux:
7562 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7563 case llvm::Triple::NetBSD:
7564 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7565 case llvm::Triple::OpenBSD:
7566 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7567 case llvm::Triple::RTEMS:
7568 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7569 default:
7570 return new SparcV8elTargetInfo(Triple);
7571 }
7572
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007573 case llvm::Triple::sparcv9:
7574 switch (os) {
7575 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007576 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007577 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007578 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007579 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007580 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007581 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007582 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007583 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007584 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007585 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007586 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007587 }
7588
Ulrich Weigand47445072013-05-06 16:26:41 +00007589 case llvm::Triple::systemz:
7590 switch (os) {
7591 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007592 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007593 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007594 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007595 }
7596
Eli Friedmana9c3d712009-08-19 20:47:07 +00007597 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007598 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007599
Daniel Dunbar52322032009-08-18 05:47:58 +00007600 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007601 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007602 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007603
Daniel Dunbar52322032009-08-18 05:47:58 +00007604 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007605 case llvm::Triple::CloudABI:
7606 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007607 case llvm::Triple::Linux: {
7608 switch (Triple.getEnvironment()) {
7609 default:
7610 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7611 case llvm::Triple::Android:
7612 return new AndroidX86_32TargetInfo(Triple);
7613 }
7614 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007615 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007616 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007617 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007618 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007619 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007620 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007621 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007622 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007623 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007624 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007625 case llvm::Triple::KFreeBSD:
7626 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007627 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007628 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007629 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007630 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007631 case llvm::Triple::Win32: {
7632 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007633 case llvm::Triple::Cygnus:
7634 return new CygwinX86_32TargetInfo(Triple);
7635 case llvm::Triple::GNU:
7636 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007637 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007638 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007639 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007640 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007641 }
7642 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007643 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007644 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007645 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007646 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007647 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007648 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007649 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007650 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007651 }
7652
7653 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007654 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007655 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007656
Daniel Dunbar52322032009-08-18 05:47:58 +00007657 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007658 case llvm::Triple::CloudABI:
7659 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007660 case llvm::Triple::Linux: {
7661 switch (Triple.getEnvironment()) {
7662 default:
7663 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7664 case llvm::Triple::Android:
7665 return new AndroidX86_64TargetInfo(Triple);
7666 }
7667 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007668 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007669 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007670 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007671 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007672 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007673 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007674 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007675 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007676 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007677 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007678 case llvm::Triple::KFreeBSD:
7679 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007680 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007681 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007682 case llvm::Triple::Win32: {
7683 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007684 case llvm::Triple::Cygnus:
7685 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007686 case llvm::Triple::GNU:
7687 return new MinGWX86_64TargetInfo(Triple);
7688 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007689 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007690 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007691 }
7692 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007693 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007694 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007695 case llvm::Triple::PS4:
7696 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007697 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007698 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007699 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007700
Douglas Katzman78d7c542015-05-12 21:18:10 +00007701 case llvm::Triple::spir: {
7702 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7703 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7704 return nullptr;
7705 return new SPIR32TargetInfo(Triple);
7706 }
7707 case llvm::Triple::spir64: {
7708 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7709 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7710 return nullptr;
7711 return new SPIR64TargetInfo(Triple);
7712 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007713 case llvm::Triple::wasm32:
7714 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7715 return nullptr;
7716 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7717 case llvm::Triple::wasm64:
7718 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7719 return nullptr;
7720 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007721 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007722}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007723
7724/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007725/// options.
Alp Toker80758082014-07-06 05:26:44 +00007726TargetInfo *
7727TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7728 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007729 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007730
7731 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007732 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007733 if (!Target) {
7734 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007735 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007736 }
Alp Toker80758082014-07-06 05:26:44 +00007737 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007738
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007739 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007740 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7741 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007742 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007743 }
7744
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007745 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007746 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7747 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007748 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007749 }
7750
Rafael Espindolaeb265472013-08-21 21:59:03 +00007751 // Set the fp math unit.
7752 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7753 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007754 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007755 }
7756
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007757 // Compute the default target features, we need the target to handle this
7758 // because features may have dependencies on one another.
7759 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00007760 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
7761 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00007762 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007763
7764 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007765 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007766 for (const auto &F : Features)
7767 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7768
Eric Christopher3ff21b32013-10-16 21:26:26 +00007769 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007770 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007771
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007772 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007773}