blob: dbe19fd6cd515160b2e91e5b25138d4e8b1e7123 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000030#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000032#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000033
Chris Lattner5ba61f02006-10-14 07:39:34 +000034using namespace clang;
35
Chris Lattner5ba61f02006-10-14 07:39:34 +000036//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000037// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000038//===----------------------------------------------------------------------===//
39
Chris Lattner1e1c0b92009-03-20 16:06:38 +000040/// DefineStd - Define a macro name and standard variants. For example if
41/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
42/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000043static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000044 const LangOptions &Opts) {
45 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000046
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
48 // in the user's namespace.
49 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000050 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000051
Chris Lattner1e1c0b92009-03-20 16:06:38 +000052 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000057}
58
Benjamin Kramere3b442d2012-01-10 11:50:09 +000059static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
60 bool Tuning = true) {
61 Builder.defineMacro("__" + CPUName);
62 Builder.defineMacro("__" + CPUName + "__");
63 if (Tuning)
64 Builder.defineMacro("__tune_" + CPUName + "__");
65}
66
Chris Lattner09d98f52008-10-05 21:50:58 +000067//===----------------------------------------------------------------------===//
68// Defines specific to certain operating systems.
69//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000070
Torok Edwinb2b37c62009-06-30 17:10:35 +000071namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000072template<typename TgtInfo>
73class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000074protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000075 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000076 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000077public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000078 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000079 void getTargetDefines(const LangOptions &Opts,
80 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000081 TgtInfo::getTargetDefines(Opts, Builder);
82 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000083 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000084
85};
Chris Lattner30ba6742009-08-10 19:03:04 +000086
Eric Christopher7d0c7252015-09-24 21:17:04 +000087// CloudABI Target
88template <typename Target>
89class CloudABITargetInfo : public OSTargetInfo<Target> {
90protected:
91 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
92 MacroBuilder &Builder) const override {
93 Builder.defineMacro("__CloudABI__");
94 Builder.defineMacro("__ELF__");
95
96 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
97 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
98 Builder.defineMacro("__STDC_UTF_16__");
99 Builder.defineMacro("__STDC_UTF_32__");
100 }
101
102public:
103 CloudABITargetInfo(const llvm::Triple &Triple)
104 : OSTargetInfo<Target>(Triple) {
105 this->UserLabelPrefix = "";
106 }
107};
108
Daniel Dunbard86666f2010-01-26 01:44:04 +0000109static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000110 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000111 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000112 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000113 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000114 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000115 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000116 // AddressSanitizer doesn't play well with source fortification, which is on
117 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000118 if (Opts.Sanitize.has(SanitizerKind::Address))
119 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000120
John McCall5d36a8c2011-06-16 00:03:19 +0000121 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000122 // __weak is always defined, for use in blocks and with objc pointers.
123 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000124
John McCall31168b02011-06-15 23:02:42 +0000125 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000126 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000127 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
128 else
129 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000130
John McCall31168b02011-06-15 23:02:42 +0000131 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
132 // allow this in C, since one might have block pointers in structs that
133 // are used in pure C code and in Objective-C ARC.
134 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000135 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000136
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000137 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000138 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000139 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000141
142 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000143 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000144
Daniel Dunbarecf13562011-04-19 21:40:34 +0000145 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000146 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000147 if (Triple.isMacOSX()) {
148 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000149 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000151 Triple.getOSVersion(Maj, Min, Rev);
152 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000153 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000154
Sebastian Pop422377c2012-01-20 22:01:23 +0000155 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000156 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000157 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
158 if (PlatformName == "win32") {
159 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
160 return;
161 }
162
Evan Cheng31dd9a62014-01-26 23:12:43 +0000163 // Set the appropriate OS version define.
164 if (Triple.isiOS()) {
165 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
166 char Str[6];
167 Str[0] = '0' + Maj;
168 Str[1] = '0' + (Min / 10);
169 Str[2] = '0' + (Min % 10);
170 Str[3] = '0' + (Rev / 10);
171 Str[4] = '0' + (Rev % 10);
172 Str[5] = '\0';
Eric Christopher7d0c7252015-09-24 21:17:04 +0000173 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000174 } else if (Triple.isMacOSX()) {
175 // Note that the Driver allows versions which aren't representable in the
176 // define (because we only get a single digit for the minor and micro
177 // revision numbers). So, we limit them to the maximum representable
178 // version.
179 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000180 char Str[7];
181 if (Maj < 10 || (Maj == 10 && Min < 10)) {
182 Str[0] = '0' + (Maj / 10);
183 Str[1] = '0' + (Maj % 10);
184 Str[2] = '0' + std::min(Min, 9U);
185 Str[3] = '0' + std::min(Rev, 9U);
186 Str[4] = '\0';
187 } else {
188 // Handle versions > 10.9.
189 Str[0] = '0' + (Maj / 10);
190 Str[1] = '0' + (Maj % 10);
191 Str[2] = '0' + (Min / 10);
192 Str[3] = '0' + (Min % 10);
193 Str[4] = '0' + (Rev / 10);
194 Str[5] = '0' + (Rev % 10);
195 Str[6] = '\0';
196 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000198 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000199
Tim Northover157d9112014-01-16 08:48:16 +0000200 // Tell users about the kernel if there is one.
201 if (Triple.isOSDarwin())
202 Builder.defineMacro("__MACH__");
203
Daniel Dunbarecf13562011-04-19 21:40:34 +0000204 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000205}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000206
Torok Edwinb2b37c62009-06-30 17:10:35 +0000207template<typename Target>
208class DarwinTargetInfo : public OSTargetInfo<Target> {
209protected:
Craig Topper3164f332014-03-11 03:39:26 +0000210 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
211 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000212 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000213 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000214 }
Mike Stump11289f42009-09-09 15:08:12 +0000215
Torok Edwinb2b37c62009-06-30 17:10:35 +0000216public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000217 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
218 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
219 this->MCountName = "\01mcount";
220 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000221
Craig Topper3164f332014-03-11 03:39:26 +0000222 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000223 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000224 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000225 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000226 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000227 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000228 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000229 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000230
Craig Topper3164f332014-03-11 03:39:26 +0000231 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000232 // FIXME: We should return 0 when building kexts.
233 return "__TEXT,__StaticInit,regular,pure_instructions";
234 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000235
John McCalleed64c72012-01-29 01:20:30 +0000236 /// Darwin does not support protected visibility. Darwin's "default"
237 /// is very similar to ELF's "protected"; Darwin requires a "weak"
238 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000239 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000240 return false;
241 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000242};
243
Chris Lattner30ba6742009-08-10 19:03:04 +0000244
Torok Edwinb2b37c62009-06-30 17:10:35 +0000245// DragonFlyBSD Target
246template<typename Target>
247class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
248protected:
Craig Topper3164f332014-03-11 03:39:26 +0000249 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
250 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000251 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000252 Builder.defineMacro("__DragonFly__");
253 Builder.defineMacro("__DragonFly_cc_version", "100001");
254 Builder.defineMacro("__ELF__");
255 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
256 Builder.defineMacro("__tune_i386__");
257 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000258 }
259public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000260 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
261 : OSTargetInfo<Target>(Triple) {
262 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 switch (Triple.getArch()) {
265 default:
266 case llvm::Triple::x86:
267 case llvm::Triple::x86_64:
268 this->MCountName = ".mcount";
269 break;
270 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000271 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000272};
273
274// FreeBSD Target
275template<typename Target>
276class FreeBSDTargetInfo : public OSTargetInfo<Target> {
277protected:
Craig Topper3164f332014-03-11 03:39:26 +0000278 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
279 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000280 // FreeBSD defines; list based off of gcc output
281
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000282 unsigned Release = Triple.getOSMajorVersion();
283 if (Release == 0U)
284 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000285
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000286 Builder.defineMacro("__FreeBSD__", Twine(Release));
287 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000288 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
289 DefineStd(Builder, "unix", Opts);
290 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000291
292 // On FreeBSD, wchar_t contains the number of the code point as
293 // used by the character set of the locale. These character sets are
294 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000295 //
296 // FIXME: This is wrong; the macro refers to the numerical values
297 // of wchar_t *literals*, which are not locale-dependent. However,
298 // FreeBSD systems apparently depend on us getting this wrong, and
299 // setting this to 1 is conforming even if all the basic source
300 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000301 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000302 }
303public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000304 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
305 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000306
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000307 switch (Triple.getArch()) {
308 default:
309 case llvm::Triple::x86:
310 case llvm::Triple::x86_64:
311 this->MCountName = ".mcount";
312 break;
313 case llvm::Triple::mips:
314 case llvm::Triple::mipsel:
315 case llvm::Triple::ppc:
316 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000317 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000318 this->MCountName = "_mcount";
319 break;
320 case llvm::Triple::arm:
321 this->MCountName = "__mcount";
322 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000323 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000324 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000325};
326
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000327// GNU/kFreeBSD Target
328template<typename Target>
329class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
330protected:
Craig Topper3164f332014-03-11 03:39:26 +0000331 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
332 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000333 // GNU/kFreeBSD defines; list based off of gcc output
334
335 DefineStd(Builder, "unix", Opts);
336 Builder.defineMacro("__FreeBSD_kernel__");
337 Builder.defineMacro("__GLIBC__");
338 Builder.defineMacro("__ELF__");
339 if (Opts.POSIXThreads)
340 Builder.defineMacro("_REENTRANT");
341 if (Opts.CPlusPlus)
342 Builder.defineMacro("_GNU_SOURCE");
343 }
344public:
Eric Christopher917e9522014-11-18 22:36:15 +0000345 KFreeBSDTargetInfo(const llvm::Triple &Triple)
346 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000347 this->UserLabelPrefix = "";
348 }
349};
350
Chris Lattner3e2ee142010-07-07 16:01:42 +0000351// Minix Target
352template<typename Target>
353class MinixTargetInfo : public OSTargetInfo<Target> {
354protected:
Craig Topper3164f332014-03-11 03:39:26 +0000355 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
356 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000357 // Minix defines
358
359 Builder.defineMacro("__minix", "3");
360 Builder.defineMacro("_EM_WSIZE", "4");
361 Builder.defineMacro("_EM_PSIZE", "4");
362 Builder.defineMacro("_EM_SSIZE", "2");
363 Builder.defineMacro("_EM_LSIZE", "4");
364 Builder.defineMacro("_EM_FSIZE", "4");
365 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000366 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000367 DefineStd(Builder, "unix", Opts);
368 }
369public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000370 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
371 this->UserLabelPrefix = "";
372 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000373};
374
Torok Edwinb2b37c62009-06-30 17:10:35 +0000375// Linux target
376template<typename Target>
377class LinuxTargetInfo : public OSTargetInfo<Target> {
378protected:
Craig Topper3164f332014-03-11 03:39:26 +0000379 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
380 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000382 DefineStd(Builder, "unix", Opts);
383 DefineStd(Builder, "linux", Opts);
384 Builder.defineMacro("__gnu_linux__");
385 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000386 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000387 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000388 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000389 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000390 this->PlatformName = "android";
391 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
392 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000393 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000394 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000395 if (Opts.CPlusPlus)
396 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000397 }
398public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000399 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000400 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000401 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000402
403 switch (Triple.getArch()) {
404 default:
405 break;
406 case llvm::Triple::ppc:
407 case llvm::Triple::ppc64:
408 case llvm::Triple::ppc64le:
409 this->MCountName = "_mcount";
410 break;
411 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000412 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000413
Craig Topper3164f332014-03-11 03:39:26 +0000414 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000415 return ".text.startup";
416 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000417};
418
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000419// NetBSD Target
420template<typename Target>
421class NetBSDTargetInfo : public OSTargetInfo<Target> {
422protected:
Craig Topper3164f332014-03-11 03:39:26 +0000423 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
424 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000425 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000426 Builder.defineMacro("__NetBSD__");
427 Builder.defineMacro("__unix__");
428 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000429 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000430 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000431
432 switch (Triple.getArch()) {
433 default:
434 break;
435 case llvm::Triple::arm:
436 case llvm::Triple::armeb:
437 case llvm::Triple::thumb:
438 case llvm::Triple::thumbeb:
439 Builder.defineMacro("__ARM_DWARF_EH__");
440 break;
441 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000442 }
443public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000444 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
445 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000446 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000447 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000448};
449
Torok Edwinb2b37c62009-06-30 17:10:35 +0000450// OpenBSD Target
451template<typename Target>
452class OpenBSDTargetInfo : public OSTargetInfo<Target> {
453protected:
Craig Topper3164f332014-03-11 03:39:26 +0000454 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
455 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000456 // OpenBSD defines; list based off of gcc output
457
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 Builder.defineMacro("__OpenBSD__");
459 DefineStd(Builder, "unix", Opts);
460 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000461 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000462 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000463 }
464public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000465 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
466 this->UserLabelPrefix = "";
467 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000468
Eli Friedman3715d1f2011-12-15 02:15:56 +0000469 switch (Triple.getArch()) {
470 default:
471 case llvm::Triple::x86:
472 case llvm::Triple::x86_64:
473 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000474 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000475 this->MCountName = "__mcount";
476 break;
477 case llvm::Triple::mips64:
478 case llvm::Triple::mips64el:
479 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000480 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000481 this->MCountName = "_mcount";
482 break;
483 }
484 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000485};
486
Eli Friedman9fa28852012-08-08 23:57:20 +0000487// Bitrig Target
488template<typename Target>
489class BitrigTargetInfo : public OSTargetInfo<Target> {
490protected:
Craig Topper3164f332014-03-11 03:39:26 +0000491 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
492 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000493 // Bitrig defines; list based off of gcc output
494
495 Builder.defineMacro("__Bitrig__");
496 DefineStd(Builder, "unix", Opts);
497 Builder.defineMacro("__ELF__");
498 if (Opts.POSIXThreads)
499 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000500
501 switch (Triple.getArch()) {
502 default:
503 break;
504 case llvm::Triple::arm:
505 case llvm::Triple::armeb:
506 case llvm::Triple::thumb:
507 case llvm::Triple::thumbeb:
508 Builder.defineMacro("__ARM_DWARF_EH__");
509 break;
510 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000511 }
512public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000513 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
514 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000515 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000516 }
517};
518
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000519// PSP Target
520template<typename Target>
521class PSPTargetInfo : public OSTargetInfo<Target> {
522protected:
Craig Topper3164f332014-03-11 03:39:26 +0000523 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
524 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000525 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000526 Builder.defineMacro("PSP");
527 Builder.defineMacro("_PSP");
528 Builder.defineMacro("__psp__");
529 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000530 }
531public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000532 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000533 this->UserLabelPrefix = "";
534 }
535};
536
John Thompsone467e192009-11-19 17:18:50 +0000537// PS3 PPU Target
538template<typename Target>
539class PS3PPUTargetInfo : public OSTargetInfo<Target> {
540protected:
Craig Topper3164f332014-03-11 03:39:26 +0000541 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
542 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000543 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000544 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000545 Builder.defineMacro("__PPU__");
546 Builder.defineMacro("__CELLOS_LV2__");
547 Builder.defineMacro("__ELF__");
548 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000549 Builder.defineMacro("_ARCH_PPC64");
550 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000551 }
552public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000553 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000554 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000555 this->LongWidth = this->LongAlign = 32;
556 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000557 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000558 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000559 this->SizeType = TargetInfo::UnsignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +0000560 this->DataLayoutString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000561 }
562};
563
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000564template <typename Target>
565class PS4OSTargetInfo : public OSTargetInfo<Target> {
566protected:
567 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
568 MacroBuilder &Builder) const override {
569 Builder.defineMacro("__FreeBSD__", "9");
570 Builder.defineMacro("__FreeBSD_cc_version", "900001");
571 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
572 DefineStd(Builder, "unix", Opts);
573 Builder.defineMacro("__ELF__");
574 Builder.defineMacro("__PS4__");
575 }
576public:
577 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
578 this->WCharType = this->UnsignedShort;
579
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000580 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
581 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000582 this->UserLabelPrefix = "";
583
584 switch (Triple.getArch()) {
585 default:
586 case llvm::Triple::x86_64:
587 this->MCountName = ".mcount";
588 break;
589 }
590 }
591};
592
Torok Edwinb2b37c62009-06-30 17:10:35 +0000593// Solaris target
594template<typename Target>
595class SolarisTargetInfo : public OSTargetInfo<Target> {
596protected:
Craig Topper3164f332014-03-11 03:39:26 +0000597 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
598 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000599 DefineStd(Builder, "sun", Opts);
600 DefineStd(Builder, "unix", Opts);
601 Builder.defineMacro("__ELF__");
602 Builder.defineMacro("__svr4__");
603 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000604 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
605 // newer, but to 500 for everything else. feature_test.h has a check to
606 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000607 // with a new version.
608 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000609 Builder.defineMacro("_XOPEN_SOURCE", "600");
610 else
611 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000612 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000613 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000614 Builder.defineMacro("_LARGEFILE_SOURCE");
615 Builder.defineMacro("_LARGEFILE64_SOURCE");
616 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000617 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000618 }
619public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000620 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000621 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000622 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000623 // FIXME: WIntType should be SignedLong
624 }
625};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000626
627// Windows target
628template<typename Target>
629class WindowsTargetInfo : public OSTargetInfo<Target> {
630protected:
Craig Topper3164f332014-03-11 03:39:26 +0000631 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
632 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000633 Builder.defineMacro("_WIN32");
634 }
635 void getVisualStudioDefines(const LangOptions &Opts,
636 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000637 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000638 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000639 Builder.defineMacro("_CPPRTTI");
640
Reid Kleckner16514352015-01-30 21:42:55 +0000641 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000642 Builder.defineMacro("_CPPUNWIND");
643 }
644
David Majnemer6a658902015-07-22 22:36:26 +0000645 if (Opts.Bool)
646 Builder.defineMacro("__BOOL_DEFINED");
647
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000648 if (!Opts.CharIsSigned)
649 Builder.defineMacro("_CHAR_UNSIGNED");
650
651 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
652 // but it works for now.
653 if (Opts.POSIXThreads)
654 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000655
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000656 if (Opts.MSCompatibilityVersion) {
657 Builder.defineMacro("_MSC_VER",
658 Twine(Opts.MSCompatibilityVersion / 100000));
659 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000660 // FIXME We cannot encode the revision information into 32-bits
661 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000662
David Majnemerb710a932015-05-11 03:57:49 +0000663 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000664 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000665 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000666
667 if (Opts.MicrosoftExt) {
668 Builder.defineMacro("_MSC_EXTENSIONS");
669
670 if (Opts.CPlusPlus11) {
671 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
672 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
673 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
674 }
675 }
676
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000677 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000678 }
679
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000680public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000681 WindowsTargetInfo(const llvm::Triple &Triple)
682 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000683};
684
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000685template <typename Target>
686class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000687protected:
Craig Topper3164f332014-03-11 03:39:26 +0000688 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
689 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000690 if (Opts.POSIXThreads)
691 Builder.defineMacro("_REENTRANT");
692 if (Opts.CPlusPlus)
693 Builder.defineMacro("_GNU_SOURCE");
694
695 DefineStd(Builder, "unix", Opts);
696 Builder.defineMacro("__ELF__");
697 Builder.defineMacro("__native_client__");
698 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000699
700public:
701 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000702 this->UserLabelPrefix = "";
703 this->LongAlign = 32;
704 this->LongWidth = 32;
705 this->PointerAlign = 32;
706 this->PointerWidth = 32;
707 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000708 this->Int64Type = TargetInfo::SignedLongLong;
709 this->DoubleAlign = 64;
710 this->LongDoubleWidth = 64;
711 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000712 this->LongLongWidth = 64;
713 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000714 this->SizeType = TargetInfo::UnsignedInt;
715 this->PtrDiffType = TargetInfo::SignedInt;
716 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000717 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000718 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000719 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000720 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000721 } else if (Triple.getArch() == llvm::Triple::x86) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000722 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000723 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000724 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000725 } else if (Triple.getArch() == llvm::Triple::mipsel) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000726 // Handled on mips' setDataLayoutString.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000727 } else {
728 assert(Triple.getArch() == llvm::Triple::le32);
Eric Christopher964a5f32015-08-05 23:48:05 +0000729 this->DataLayoutString = "e-p:32:32-i64:64";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000730 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000731 }
732};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000733
Dan Gohmanc2853072015-09-03 22:51:53 +0000734// WebAssembly target
735template <typename Target>
736class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
737 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000738 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000739 // A common platform macro.
740 if (Opts.POSIXThreads)
741 Builder.defineMacro("_REENTRANT");
742 // Follow g++ convention and predefine _GNU_SOURCE for C++.
743 if (Opts.CPlusPlus)
744 Builder.defineMacro("_GNU_SOURCE");
745 }
746
747 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000748 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000749 return ".text.__startup";
750 }
751
752public:
753 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
754 : OSTargetInfo<Target>(Triple) {
755 this->MCountName = "__mcount";
756 this->UserLabelPrefix = "";
757 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
758 }
759};
Dan Gohmanc2853072015-09-03 22:51:53 +0000760
Chris Lattner09d98f52008-10-05 21:50:58 +0000761//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000762// Specific target implementations.
763//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000764
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000765// PPC abstract base class
766class PPCTargetInfo : public TargetInfo {
767 static const Builtin::Info BuiltinInfo[];
768 static const char * const GCCRegNames[];
769 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000770 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000771
772 // Target cpu features.
773 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000774 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000775 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000776 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000777 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000778 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000779 bool HasBPERMD;
780 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000781
Ulrich Weigand8afad612014-07-28 13:17:52 +0000782protected:
783 std::string ABI;
784
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000785public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000786 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000787 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000788 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000789 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000790 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000791 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000792 LongDoubleWidth = LongDoubleAlign = 128;
793 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
794 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000795
Hal Finkel6b984f02012-07-03 16:51:04 +0000796 /// \brief Flags for architecture specific defines.
797 typedef enum {
798 ArchDefineNone = 0,
799 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
800 ArchDefinePpcgr = 1 << 1,
801 ArchDefinePpcsq = 1 << 2,
802 ArchDefine440 = 1 << 3,
803 ArchDefine603 = 1 << 4,
804 ArchDefine604 = 1 << 5,
805 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000806 ArchDefinePwr5 = 1 << 7,
807 ArchDefinePwr5x = 1 << 8,
808 ArchDefinePwr6 = 1 << 9,
809 ArchDefinePwr6x = 1 << 10,
810 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000811 ArchDefinePwr8 = 1 << 12,
812 ArchDefineA2 = 1 << 13,
813 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000814 } ArchDefineTypes;
815
Bill Schmidt38378a02013-02-01 20:23:10 +0000816 // Note: GCC recognizes the following additional cpus:
817 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
818 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
819 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000820 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000821 bool CPUKnown = llvm::StringSwitch<bool>(Name)
822 .Case("generic", true)
823 .Case("440", true)
824 .Case("450", true)
825 .Case("601", true)
826 .Case("602", true)
827 .Case("603", true)
828 .Case("603e", true)
829 .Case("603ev", true)
830 .Case("604", true)
831 .Case("604e", true)
832 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000833 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000834 .Case("g3", true)
835 .Case("7400", true)
836 .Case("g4", true)
837 .Case("7450", true)
838 .Case("g4+", true)
839 .Case("750", true)
840 .Case("970", true)
841 .Case("g5", true)
842 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000843 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000844 .Case("e500mc", true)
845 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000846 .Case("power3", true)
847 .Case("pwr3", true)
848 .Case("power4", true)
849 .Case("pwr4", true)
850 .Case("power5", true)
851 .Case("pwr5", true)
852 .Case("power5x", true)
853 .Case("pwr5x", true)
854 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000855 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000856 .Case("power6x", true)
857 .Case("pwr6x", true)
858 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000859 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000860 .Case("power8", true)
861 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000862 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000863 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000864 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000865 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000866 .Case("powerpc64le", true)
867 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000868 .Default(false);
869
870 if (CPUKnown)
871 CPU = Name;
872
873 return CPUKnown;
874 }
875
Ulrich Weigand8afad612014-07-28 13:17:52 +0000876
877 StringRef getABI() const override { return ABI; }
878
Craig Topper3164f332014-03-11 03:39:26 +0000879 void getTargetBuiltins(const Builtin::Info *&Records,
880 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000881 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000882 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000883 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000884
Craig Topper3164f332014-03-11 03:39:26 +0000885 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000886
Craig Topper3164f332014-03-11 03:39:26 +0000887 void getTargetDefines(const LangOptions &Opts,
888 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000889
Eric Christopher8c47b422015-10-09 18:39:55 +0000890 bool
891 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
892 StringRef CPU,
893 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000894
Craig Topper3164f332014-03-11 03:39:26 +0000895 bool handleTargetFeatures(std::vector<std::string> &Features,
896 DiagnosticsEngine &Diags) override;
897 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000898 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
899 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000900
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__");
Hal Finkela57b8902015-10-01 13:39:49 +00001224
1225 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1226 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1227 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1228 if (PointerWidth == 64)
1229 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001230
Bill Schmidt38378a02013-02-01 20:23:10 +00001231 // FIXME: The following are not yet generated here by Clang, but are
1232 // generated by GCC:
1233 //
1234 // _SOFT_FLOAT_
1235 // __RECIP_PRECISION__
1236 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001237 // __RECIP__
1238 // __RECIPF__
1239 // __RSQRTE__
1240 // __RSQRTEF__
1241 // _SOFT_DOUBLE_
1242 // __NO_LWSYNC__
1243 // __HAVE_BSWAP__
1244 // __LONGDOUBLE128
1245 // __CMODEL_MEDIUM__
1246 // __CMODEL_LARGE__
1247 // _CALL_SYSV
1248 // _CALL_DARWIN
1249 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001250}
1251
Eric Christophera8a14c32015-08-31 18:39:16 +00001252// Handle explicit options being passed to the compiler here: if we've
1253// explicitly turned off vsx and turned on power8-vector or direct-move then
1254// go ahead and error since the customer has expressed a somewhat incompatible
1255// set of options.
1256static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001257 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001258
1259 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1260 FeaturesVec.end()) {
1261 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1262 FeaturesVec.end()) {
1263 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1264 << "-mno-vsx";
1265 return false;
1266 }
1267
1268 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1269 FeaturesVec.end()) {
1270 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1271 << "-mno-vsx";
1272 return false;
1273 }
1274 }
1275
1276 return true;
1277}
1278
Eric Christopher8c47b422015-10-09 18:39:55 +00001279bool PPCTargetInfo::initFeatureMap(
1280 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1281 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001282 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1283 .Case("7400", true)
1284 .Case("g4", true)
1285 .Case("7450", true)
1286 .Case("g4+", true)
1287 .Case("970", true)
1288 .Case("g5", true)
1289 .Case("pwr6", true)
1290 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001291 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001292 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001293 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001294 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001295
1296 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001297 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1298 .Case("ppc64le", true)
1299 .Case("pwr8", true)
1300 .Default(false);
1301 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1302 .Case("ppc64le", true)
1303 .Case("pwr8", true)
1304 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001305 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1306 .Case("ppc64le", true)
1307 .Case("pwr8", true)
1308 .Case("pwr7", true)
1309 .Default(false);
1310 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1311 .Case("ppc64le", true)
1312 .Case("pwr8", true)
1313 .Case("pwr7", true)
1314 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001315 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1316 .Case("ppc64le", true)
1317 .Case("pwr8", true)
1318 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001319 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1320 .Case("ppc64le", true)
1321 .Case("pwr8", true)
1322 .Case("pwr7", true)
1323 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001324
Eric Christophera8a14c32015-08-31 18:39:16 +00001325 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1326 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001327
Eric Christopher007b0a02015-08-28 22:32:01 +00001328 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001329}
1330
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001331bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001332 return llvm::StringSwitch<bool>(Feature)
1333 .Case("powerpc", true)
1334 .Case("vsx", HasVSX)
1335 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001336 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001337 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001338 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001339 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001340 .Case("bpermd", HasBPERMD)
1341 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001342 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001343}
Chris Lattner17df24e2008-04-21 18:56:49 +00001344
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001345void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1346 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001347 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1348 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1349 // incompatible options.
1350 if (Enabled) {
1351 if (Name == "vsx") {
1352 Features[Name] = true;
1353 } else if (Name == "direct-move") {
1354 Features[Name] = Features["vsx"] = true;
1355 } else if (Name == "power8-vector") {
1356 Features[Name] = Features["vsx"] = true;
1357 } else {
1358 Features[Name] = true;
1359 }
1360 } else {
1361 if (Name == "vsx") {
1362 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1363 false;
1364 } else {
1365 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001366 }
1367 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001368}
1369
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001370const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001371 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1372 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1373 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1374 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1375 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1376 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1377 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1378 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001379 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001380 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001381 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001382 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1383 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1384 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1385 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001386 "vrsave", "vscr",
1387 "spe_acc", "spefscr",
1388 "sfp"
1389};
Chris Lattner10a5b382007-01-29 05:24:35 +00001390
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001391void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001392 unsigned &NumNames) const {
1393 Names = GCCRegNames;
1394 NumNames = llvm::array_lengthof(GCCRegNames);
1395}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001396
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001397const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1398 // While some of these aliases do map to different registers
1399 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001400 { { "0" }, "r0" },
1401 { { "1"}, "r1" },
1402 { { "2" }, "r2" },
1403 { { "3" }, "r3" },
1404 { { "4" }, "r4" },
1405 { { "5" }, "r5" },
1406 { { "6" }, "r6" },
1407 { { "7" }, "r7" },
1408 { { "8" }, "r8" },
1409 { { "9" }, "r9" },
1410 { { "10" }, "r10" },
1411 { { "11" }, "r11" },
1412 { { "12" }, "r12" },
1413 { { "13" }, "r13" },
1414 { { "14" }, "r14" },
1415 { { "15" }, "r15" },
1416 { { "16" }, "r16" },
1417 { { "17" }, "r17" },
1418 { { "18" }, "r18" },
1419 { { "19" }, "r19" },
1420 { { "20" }, "r20" },
1421 { { "21" }, "r21" },
1422 { { "22" }, "r22" },
1423 { { "23" }, "r23" },
1424 { { "24" }, "r24" },
1425 { { "25" }, "r25" },
1426 { { "26" }, "r26" },
1427 { { "27" }, "r27" },
1428 { { "28" }, "r28" },
1429 { { "29" }, "r29" },
1430 { { "30" }, "r30" },
1431 { { "31" }, "r31" },
1432 { { "fr0" }, "f0" },
1433 { { "fr1" }, "f1" },
1434 { { "fr2" }, "f2" },
1435 { { "fr3" }, "f3" },
1436 { { "fr4" }, "f4" },
1437 { { "fr5" }, "f5" },
1438 { { "fr6" }, "f6" },
1439 { { "fr7" }, "f7" },
1440 { { "fr8" }, "f8" },
1441 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001442 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001443 { { "fr11" }, "f11" },
1444 { { "fr12" }, "f12" },
1445 { { "fr13" }, "f13" },
1446 { { "fr14" }, "f14" },
1447 { { "fr15" }, "f15" },
1448 { { "fr16" }, "f16" },
1449 { { "fr17" }, "f17" },
1450 { { "fr18" }, "f18" },
1451 { { "fr19" }, "f19" },
1452 { { "fr20" }, "f20" },
1453 { { "fr21" }, "f21" },
1454 { { "fr22" }, "f22" },
1455 { { "fr23" }, "f23" },
1456 { { "fr24" }, "f24" },
1457 { { "fr25" }, "f25" },
1458 { { "fr26" }, "f26" },
1459 { { "fr27" }, "f27" },
1460 { { "fr28" }, "f28" },
1461 { { "fr29" }, "f29" },
1462 { { "fr30" }, "f30" },
1463 { { "fr31" }, "f31" },
1464 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001465};
1466
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001467void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001468 unsigned &NumAliases) const {
1469 Aliases = GCCRegAliases;
1470 NumAliases = llvm::array_lengthof(GCCRegAliases);
1471}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001472
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001473class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001474public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001475 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001476 DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001477
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001478 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001479 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001480 case llvm::Triple::FreeBSD:
1481 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001482 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001483 PtrDiffType = SignedInt;
1484 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001485 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001486 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001487 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001488 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001489
Roman Divacky3ffe7462012-03-13 19:20:17 +00001490 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1491 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001492 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001493 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001494
1495 // PPC32 supports atomics up to 4 bytes.
1496 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001497 }
1498
Craig Topper3164f332014-03-11 03:39:26 +00001499 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001500 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001501 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001502 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001503};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001504
Bill Schmidt778d3872013-07-26 01:36:11 +00001505// Note: ABI differences may eventually require us to have a separate
1506// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001507class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001508public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001509 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001510 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001511 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001512 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001513
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001514 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001515 DataLayoutString = "e-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001516 ABI = "elfv2";
1517 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001518 DataLayoutString = "E-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001519 ABI = "elfv1";
1520 }
1521
1522 switch (getTriple().getOS()) {
1523 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001524 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001525 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001526 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001527 case llvm::Triple::NetBSD:
1528 IntMaxType = SignedLongLong;
1529 Int64Type = SignedLongLong;
1530 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001531 default:
1532 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001533 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001534
1535 // PPC64 supports atomics up to 8 bytes.
1536 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001537 }
Craig Topper3164f332014-03-11 03:39:26 +00001538 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001539 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001540 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001541 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001542 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001543 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001544 ABI = Name;
1545 return true;
1546 }
1547 return false;
1548 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001549};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001550
Roman Divacky965b0b72011-01-06 08:27:10 +00001551class DarwinPPC32TargetInfo :
1552 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001553public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001554 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1555 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001556 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001557 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001558 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001559 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001560 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001561 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001562 }
Craig Topper3164f332014-03-11 03:39:26 +00001563 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001564 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001565 }
1566};
1567
1568class DarwinPPC64TargetInfo :
1569 public DarwinTargetInfo<PPC64TargetInfo> {
1570public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001571 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1572 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001573 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001574 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001575 DataLayoutString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001576 }
1577};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001578
Eric Christopherc48497a2015-09-18 21:26:24 +00001579static const unsigned NVPTXAddrSpaceMap[] = {
1580 1, // opencl_global
1581 3, // opencl_local
1582 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001583 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001584 0, // opencl_generic
1585 1, // cuda_device
1586 4, // cuda_constant
1587 3, // cuda_shared
1588};
1589
1590class NVPTXTargetInfo : public TargetInfo {
1591 static const char *const GCCRegNames[];
1592 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001593
1594 // The GPU profiles supported by the NVPTX backend
1595 enum GPUKind {
1596 GK_NONE,
1597 GK_SM20,
1598 GK_SM21,
1599 GK_SM30,
1600 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001601 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001602 } GPU;
1603
Eric Christopherc48497a2015-09-18 21:26:24 +00001604public:
1605 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1606 BigEndian = false;
1607 TLSSupported = false;
1608 LongWidth = LongAlign = 64;
1609 AddrSpaceMap = &NVPTXAddrSpaceMap;
1610 UseAddrSpaceMapMangling = true;
1611 // Define available target features
1612 // These must be defined in sorted order!
1613 NoAsmVariants = true;
1614 // Set the default GPU to sm20
1615 GPU = GK_SM20;
1616 }
1617 void getTargetDefines(const LangOptions &Opts,
1618 MacroBuilder &Builder) const override {
1619 Builder.defineMacro("__PTX__");
1620 Builder.defineMacro("__NVPTX__");
1621 if (Opts.CUDAIsDevice) {
1622 // Set __CUDA_ARCH__ for the GPU specified.
1623 std::string CUDAArchCode;
1624 switch (GPU) {
1625 case GK_SM20:
1626 CUDAArchCode = "200";
1627 break;
1628 case GK_SM21:
1629 CUDAArchCode = "210";
1630 break;
1631 case GK_SM30:
1632 CUDAArchCode = "300";
1633 break;
1634 case GK_SM35:
1635 CUDAArchCode = "350";
1636 break;
1637 case GK_SM37:
1638 CUDAArchCode = "370";
1639 break;
1640 default:
1641 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001642 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001643 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001644 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001645 }
1646 void getTargetBuiltins(const Builtin::Info *&Records,
1647 unsigned &NumRecords) const override {
1648 Records = BuiltinInfo;
1649 NumRecords = clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin;
1650 }
1651 bool hasFeature(StringRef Feature) const override {
1652 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001653 }
1654
Eric Christopherc48497a2015-09-18 21:26:24 +00001655 void getGCCRegNames(const char *const *&Names,
1656 unsigned &NumNames) const override;
1657 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1658 unsigned &NumAliases) const override {
1659 // No aliases.
1660 Aliases = nullptr;
1661 NumAliases = 0;
1662 }
1663 bool validateAsmConstraint(const char *&Name,
1664 TargetInfo::ConstraintInfo &Info) const override {
1665 switch (*Name) {
1666 default:
1667 return false;
1668 case 'c':
1669 case 'h':
1670 case 'r':
1671 case 'l':
1672 case 'f':
1673 case 'd':
1674 Info.setAllowsRegister();
1675 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001676 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001677 }
1678 const char *getClobbers() const override {
1679 // FIXME: Is this really right?
1680 return "";
1681 }
1682 BuiltinVaListKind getBuiltinVaListKind() const override {
1683 // FIXME: implement
1684 return TargetInfo::CharPtrBuiltinVaList;
1685 }
1686 bool setCPU(const std::string &Name) override {
1687 GPU = llvm::StringSwitch<GPUKind>(Name)
1688 .Case("sm_20", GK_SM20)
1689 .Case("sm_21", GK_SM21)
1690 .Case("sm_30", GK_SM30)
1691 .Case("sm_35", GK_SM35)
1692 .Case("sm_37", GK_SM37)
1693 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001694
Eric Christopherc48497a2015-09-18 21:26:24 +00001695 return GPU != GK_NONE;
1696 }
1697};
1698
1699const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1700#define BUILTIN(ID, TYPE, ATTRS) \
1701 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1702#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1703 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1704#include "clang/Basic/BuiltinsNVPTX.def"
1705};
1706
1707const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1708
1709void NVPTXTargetInfo::getGCCRegNames(const char *const *&Names,
1710 unsigned &NumNames) const {
1711 Names = GCCRegNames;
1712 NumNames = llvm::array_lengthof(GCCRegNames);
1713}
1714
1715class NVPTX32TargetInfo : public NVPTXTargetInfo {
1716public:
1717 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001718 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001719 PointerWidth = PointerAlign = 32;
1720 SizeType = TargetInfo::UnsignedInt;
1721 PtrDiffType = TargetInfo::SignedInt;
1722 IntPtrType = TargetInfo::SignedInt;
1723 DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
1724 }
1725};
1726
1727class NVPTX64TargetInfo : public NVPTXTargetInfo {
1728public:
1729 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1730 PointerWidth = PointerAlign = 64;
1731 SizeType = TargetInfo::UnsignedLong;
1732 PtrDiffType = TargetInfo::SignedLong;
1733 IntPtrType = TargetInfo::SignedLong;
1734 DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64";
1735 }
1736};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001737
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001738static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001739 1, // opencl_global
1740 3, // opencl_local
1741 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001742 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001743 1, // cuda_device
1744 2, // cuda_constant
1745 3 // cuda_shared
1746};
1747
Tom Stellarda96344b2014-08-21 13:58:40 +00001748// If you edit the description strings, make sure you update
1749// getPointerWidthV().
1750
Eric Christopher964a5f32015-08-05 23:48:05 +00001751static const char *DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001752 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1753 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001754
Eric Christopher964a5f32015-08-05 23:48:05 +00001755static const char *DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001756 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1757 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001758
Eric Christopher964a5f32015-08-05 23:48:05 +00001759static const char *DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001760 "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 +00001761 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1762 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001763
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001764class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001765 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001766 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001767
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001768 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001769 enum GPUKind {
1770 GK_NONE,
1771 GK_R600,
1772 GK_R600_DOUBLE_OPS,
1773 GK_R700,
1774 GK_R700_DOUBLE_OPS,
1775 GK_EVERGREEN,
1776 GK_EVERGREEN_DOUBLE_OPS,
1777 GK_NORTHERN_ISLANDS,
1778 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001779 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001780 GK_SEA_ISLANDS,
1781 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001782 } GPU;
1783
Jan Veselyeebeaea2015-05-04 19:53:36 +00001784 bool hasFP64:1;
1785 bool hasFMAF:1;
1786 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001787
Eli Friedmand13b41e2012-10-12 23:32:00 +00001788public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001789 AMDGPUTargetInfo(const llvm::Triple &Triple)
1790 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001791
1792 if (Triple.getArch() == llvm::Triple::amdgcn) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001793 DataLayoutString = DataLayoutStringSI;
Tom Stellardd99fb952015-01-28 15:38:44 +00001794 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001795 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001796 hasFMAF = true;
1797 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001798 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001799 DataLayoutString = DataLayoutStringR600;
Tom Stellardd99fb952015-01-28 15:38:44 +00001800 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001801 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001802 hasFMAF = false;
1803 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001804 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001805 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001806 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001807 }
1808
Tom Stellarda96344b2014-08-21 13:58:40 +00001809 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1810 if (GPU <= GK_CAYMAN)
1811 return 32;
1812
1813 switch(AddrSpace) {
1814 default:
1815 return 64;
1816 case 0:
1817 case 3:
1818 case 5:
1819 return 32;
1820 }
1821 }
1822
Craig Topper3164f332014-03-11 03:39:26 +00001823 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001824 return "";
1825 }
1826
Craig Topper3164f332014-03-11 03:39:26 +00001827 void getGCCRegNames(const char * const *&Names,
Tom Stellard7b1059b2015-04-14 14:36:56 +00001828 unsigned &NumNames) const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001829
Craig Topper3164f332014-03-11 03:39:26 +00001830 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1831 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001832 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001833 NumAliases = 0;
1834 }
1835
Craig Topper3164f332014-03-11 03:39:26 +00001836 bool validateAsmConstraint(const char *&Name,
1837 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001838 return true;
1839 }
1840
Craig Topper3164f332014-03-11 03:39:26 +00001841 void getTargetBuiltins(const Builtin::Info *&Records,
1842 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001843 Records = BuiltinInfo;
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001844 NumRecords = clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001845 }
1846
Craig Topper3164f332014-03-11 03:39:26 +00001847 void getTargetDefines(const LangOptions &Opts,
1848 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001849 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001850 if (hasFMAF)
1851 Builder.defineMacro("__HAS_FMAF__");
1852 if (hasLDEXPF)
1853 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001854 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001855 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001856 if (Opts.OpenCL) {
1857 if (GPU >= GK_NORTHERN_ISLANDS) {
1858 Builder.defineMacro("cl_khr_byte_addressable_store");
1859 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1860 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1861 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1862 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1863 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001864 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001865 }
1866
Craig Topper3164f332014-03-11 03:39:26 +00001867 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001868 return TargetInfo::CharPtrBuiltinVaList;
1869 }
1870
Craig Topper3164f332014-03-11 03:39:26 +00001871 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001872 GPU = llvm::StringSwitch<GPUKind>(Name)
1873 .Case("r600" , GK_R600)
1874 .Case("rv610", GK_R600)
1875 .Case("rv620", GK_R600)
1876 .Case("rv630", GK_R600)
1877 .Case("rv635", GK_R600)
1878 .Case("rs780", GK_R600)
1879 .Case("rs880", GK_R600)
1880 .Case("rv670", GK_R600_DOUBLE_OPS)
1881 .Case("rv710", GK_R700)
1882 .Case("rv730", GK_R700)
1883 .Case("rv740", GK_R700_DOUBLE_OPS)
1884 .Case("rv770", GK_R700_DOUBLE_OPS)
1885 .Case("palm", GK_EVERGREEN)
1886 .Case("cedar", GK_EVERGREEN)
1887 .Case("sumo", GK_EVERGREEN)
1888 .Case("sumo2", GK_EVERGREEN)
1889 .Case("redwood", GK_EVERGREEN)
1890 .Case("juniper", GK_EVERGREEN)
1891 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1892 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1893 .Case("barts", GK_NORTHERN_ISLANDS)
1894 .Case("turks", GK_NORTHERN_ISLANDS)
1895 .Case("caicos", GK_NORTHERN_ISLANDS)
1896 .Case("cayman", GK_CAYMAN)
1897 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001898 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001899 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1900 .Case("verde", GK_SOUTHERN_ISLANDS)
1901 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001902 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001903 .Case("bonaire", GK_SEA_ISLANDS)
1904 .Case("kabini", GK_SEA_ISLANDS)
1905 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001906 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001907 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001908 .Case("tonga", GK_VOLCANIC_ISLANDS)
1909 .Case("iceland", GK_VOLCANIC_ISLANDS)
1910 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001911 .Default(GK_NONE);
1912
1913 if (GPU == GK_NONE) {
1914 return false;
1915 }
1916
1917 // Set the correct data layout
1918 switch (GPU) {
1919 case GK_NONE:
1920 case GK_R600:
1921 case GK_R700:
1922 case GK_EVERGREEN:
1923 case GK_NORTHERN_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001924 DataLayoutString = DataLayoutStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001925 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001926 hasFMAF = false;
1927 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001928 break;
1929 case GK_R600_DOUBLE_OPS:
1930 case GK_R700_DOUBLE_OPS:
1931 case GK_EVERGREEN_DOUBLE_OPS:
1932 case GK_CAYMAN:
Eric Christopher964a5f32015-08-05 23:48:05 +00001933 DataLayoutString = DataLayoutStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001934 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001935 hasFMAF = true;
1936 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001937 break;
1938 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001939 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001940 case GK_VOLCANIC_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001941 DataLayoutString = DataLayoutStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001942 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001943 hasFMAF = true;
1944 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001945 break;
1946 }
1947
1948 return true;
1949 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001950};
1951
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001952const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001953#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001954 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001955#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001956};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001957const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001958 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1959 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1960 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1961 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1962 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1963 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1964 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1965 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1966 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1967 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1968 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1969 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1970 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1971 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1972 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1973 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1974 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1975 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1976 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1977 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1978 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1979 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1980 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1981 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1982 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1983 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1984 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1985 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1986 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1987 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1988 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1989 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1990 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1991 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1992 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1993 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1994 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1995 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1996 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1997 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1998 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1999 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2000 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2001 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2002 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2003 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2004 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
2005 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
2006 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
2007 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
2008};
2009
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002010void AMDGPUTargetInfo::getGCCRegNames(const char * const *&Names,
2011 unsigned &NumNames) const {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002012 Names = GCCRegNames;
2013 NumNames = llvm::array_lengthof(GCCRegNames);
2014}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002015
Eli Friedman3fd920a2008-08-20 02:34:37 +00002016// Namespace for x86 abstract base class
2017const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002018#define BUILTIN(ID, TYPE, ATTRS) \
2019 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002020#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002021 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002022#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002023 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002024#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002025};
Eli Friedmanb5366062008-05-20 14:21:01 +00002026
Nuno Lopescfca1f02009-12-23 17:49:57 +00002027static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002028 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2029 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002030 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002031 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2032 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2033 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002034 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002035 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2036 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002037};
2038
Eric Christophercdd36352011-06-21 00:05:20 +00002039const TargetInfo::AddlRegName AddlRegNames[] = {
2040 { { "al", "ah", "eax", "rax" }, 0 },
2041 { { "bl", "bh", "ebx", "rbx" }, 3 },
2042 { { "cl", "ch", "ecx", "rcx" }, 2 },
2043 { { "dl", "dh", "edx", "rdx" }, 1 },
2044 { { "esi", "rsi" }, 4 },
2045 { { "edi", "rdi" }, 5 },
2046 { { "esp", "rsp" }, 7 },
2047 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002048 { { "r8d", "r8w", "r8b" }, 38 },
2049 { { "r9d", "r9w", "r9b" }, 39 },
2050 { { "r10d", "r10w", "r10b" }, 40 },
2051 { { "r11d", "r11w", "r11b" }, 41 },
2052 { { "r12d", "r12w", "r12b" }, 42 },
2053 { { "r13d", "r13w", "r13b" }, 43 },
2054 { { "r14d", "r14w", "r14b" }, 44 },
2055 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002056};
2057
2058// X86 target abstract base class; x86-32 and x86-64 are very close, so
2059// most of the implementation can be shared.
2060class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002061 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002062 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002063 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002064 enum MMX3DNowEnum {
2065 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002066 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002067 enum XOPEnum {
2068 NoXOP,
2069 SSE4A,
2070 FMA4,
2071 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002072 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002073
Craig Topper543f3bd2015-10-14 23:47:57 +00002074 bool HasAES = false;
2075 bool HasPCLMUL = false;
2076 bool HasLZCNT = false;
2077 bool HasRDRND = false;
2078 bool HasFSGSBASE = false;
2079 bool HasBMI = false;
2080 bool HasBMI2 = false;
2081 bool HasPOPCNT = false;
2082 bool HasRTM = false;
2083 bool HasPRFCHW = false;
2084 bool HasRDSEED = false;
2085 bool HasADX = false;
2086 bool HasTBM = false;
2087 bool HasFMA = false;
2088 bool HasF16C = false;
2089 bool HasAVX512CD = false;
2090 bool HasAVX512ER = false;
2091 bool HasAVX512PF = false;
2092 bool HasAVX512DQ = false;
2093 bool HasAVX512BW = false;
2094 bool HasAVX512VL = false;
2095 bool HasSHA = false;
2096 bool HasCX16 = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002097 bool HasXSAVE = false;
2098 bool HasXSAVEOPT = false;
2099 bool HasXSAVEC = false;
2100 bool HasXSAVES = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002101
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002102 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2103 ///
2104 /// Each enumeration represents a particular CPU supported by Clang. These
2105 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2106 enum CPUKind {
2107 CK_Generic,
2108
2109 /// \name i386
2110 /// i386-generation processors.
2111 //@{
2112 CK_i386,
2113 //@}
2114
2115 /// \name i486
2116 /// i486-generation processors.
2117 //@{
2118 CK_i486,
2119 CK_WinChipC6,
2120 CK_WinChip2,
2121 CK_C3,
2122 //@}
2123
2124 /// \name i586
2125 /// i586-generation processors, P5 microarchitecture based.
2126 //@{
2127 CK_i586,
2128 CK_Pentium,
2129 CK_PentiumMMX,
2130 //@}
2131
2132 /// \name i686
2133 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2134 //@{
2135 CK_i686,
2136 CK_PentiumPro,
2137 CK_Pentium2,
2138 CK_Pentium3,
2139 CK_Pentium3M,
2140 CK_PentiumM,
2141 CK_C3_2,
2142
2143 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2144 /// Clang however has some logic to suport this.
2145 // FIXME: Warn, deprecate, and potentially remove this.
2146 CK_Yonah,
2147 //@}
2148
2149 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002150 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002151 //@{
2152 CK_Pentium4,
2153 CK_Pentium4M,
2154 CK_Prescott,
2155 CK_Nocona,
2156 //@}
2157
2158 /// \name Core
2159 /// Core microarchitecture based processors.
2160 //@{
2161 CK_Core2,
2162
2163 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2164 /// codename which GCC no longer accepts as an option to -march, but Clang
2165 /// has some logic for recognizing it.
2166 // FIXME: Warn, deprecate, and potentially remove this.
2167 CK_Penryn,
2168 //@}
2169
2170 /// \name Atom
2171 /// Atom processors
2172 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002173 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002174 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002175 //@}
2176
2177 /// \name Nehalem
2178 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002179 CK_Nehalem,
2180
2181 /// \name Westmere
2182 /// Westmere microarchitecture based processors.
2183 CK_Westmere,
2184
2185 /// \name Sandy Bridge
2186 /// Sandy Bridge microarchitecture based processors.
2187 CK_SandyBridge,
2188
2189 /// \name Ivy Bridge
2190 /// Ivy Bridge microarchitecture based processors.
2191 CK_IvyBridge,
2192
2193 /// \name Haswell
2194 /// Haswell microarchitecture based processors.
2195 CK_Haswell,
2196
2197 /// \name Broadwell
2198 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002199 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002200
2201 /// \name Skylake
2202 /// Skylake microarchitecture based processors.
2203 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002204
Craig Topper449314e2013-08-20 07:09:39 +00002205 /// \name Knights Landing
2206 /// Knights Landing processor.
2207 CK_KNL,
2208
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002209 /// \name K6
2210 /// K6 architecture processors.
2211 //@{
2212 CK_K6,
2213 CK_K6_2,
2214 CK_K6_3,
2215 //@}
2216
2217 /// \name K7
2218 /// K7 architecture processors.
2219 //@{
2220 CK_Athlon,
2221 CK_AthlonThunderbird,
2222 CK_Athlon4,
2223 CK_AthlonXP,
2224 CK_AthlonMP,
2225 //@}
2226
2227 /// \name K8
2228 /// K8 architecture processors.
2229 //@{
2230 CK_Athlon64,
2231 CK_Athlon64SSE3,
2232 CK_AthlonFX,
2233 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002234 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002235 CK_Opteron,
2236 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002237 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002238 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002239
Benjamin Kramer569f2152012-01-10 11:50:18 +00002240 /// \name Bobcat
2241 /// Bobcat architecture processors.
2242 //@{
2243 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002244 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002245 //@}
2246
2247 /// \name Bulldozer
2248 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002249 //@{
2250 CK_BDVER1,
2251 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002252 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002253 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002254 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002255
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002256 /// This specification is deprecated and will be removed in the future.
2257 /// Users should prefer \see CK_K8.
2258 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002259 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002260 CK_x86_64,
2261 //@}
2262
2263 /// \name Geode
2264 /// Geode processors.
2265 //@{
2266 CK_Geode
2267 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002268 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002269
Eric Christopherc50738f2015-08-27 00:05:50 +00002270 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002271 return llvm::StringSwitch<CPUKind>(CPU)
2272 .Case("i386", CK_i386)
2273 .Case("i486", CK_i486)
2274 .Case("winchip-c6", CK_WinChipC6)
2275 .Case("winchip2", CK_WinChip2)
2276 .Case("c3", CK_C3)
2277 .Case("i586", CK_i586)
2278 .Case("pentium", CK_Pentium)
2279 .Case("pentium-mmx", CK_PentiumMMX)
2280 .Case("i686", CK_i686)
2281 .Case("pentiumpro", CK_PentiumPro)
2282 .Case("pentium2", CK_Pentium2)
2283 .Case("pentium3", CK_Pentium3)
2284 .Case("pentium3m", CK_Pentium3M)
2285 .Case("pentium-m", CK_PentiumM)
2286 .Case("c3-2", CK_C3_2)
2287 .Case("yonah", CK_Yonah)
2288 .Case("pentium4", CK_Pentium4)
2289 .Case("pentium4m", CK_Pentium4M)
2290 .Case("prescott", CK_Prescott)
2291 .Case("nocona", CK_Nocona)
2292 .Case("core2", CK_Core2)
2293 .Case("penryn", CK_Penryn)
2294 .Case("bonnell", CK_Bonnell)
2295 .Case("atom", CK_Bonnell) // Legacy name.
2296 .Case("silvermont", CK_Silvermont)
2297 .Case("slm", CK_Silvermont) // Legacy name.
2298 .Case("nehalem", CK_Nehalem)
2299 .Case("corei7", CK_Nehalem) // Legacy name.
2300 .Case("westmere", CK_Westmere)
2301 .Case("sandybridge", CK_SandyBridge)
2302 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2303 .Case("ivybridge", CK_IvyBridge)
2304 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2305 .Case("haswell", CK_Haswell)
2306 .Case("core-avx2", CK_Haswell) // Legacy name.
2307 .Case("broadwell", CK_Broadwell)
2308 .Case("skylake", CK_Skylake)
2309 .Case("skx", CK_Skylake) // Legacy name.
2310 .Case("knl", CK_KNL)
2311 .Case("k6", CK_K6)
2312 .Case("k6-2", CK_K6_2)
2313 .Case("k6-3", CK_K6_3)
2314 .Case("athlon", CK_Athlon)
2315 .Case("athlon-tbird", CK_AthlonThunderbird)
2316 .Case("athlon-4", CK_Athlon4)
2317 .Case("athlon-xp", CK_AthlonXP)
2318 .Case("athlon-mp", CK_AthlonMP)
2319 .Case("athlon64", CK_Athlon64)
2320 .Case("athlon64-sse3", CK_Athlon64SSE3)
2321 .Case("athlon-fx", CK_AthlonFX)
2322 .Case("k8", CK_K8)
2323 .Case("k8-sse3", CK_K8SSE3)
2324 .Case("opteron", CK_Opteron)
2325 .Case("opteron-sse3", CK_OpteronSSE3)
2326 .Case("barcelona", CK_AMDFAM10)
2327 .Case("amdfam10", CK_AMDFAM10)
2328 .Case("btver1", CK_BTVER1)
2329 .Case("btver2", CK_BTVER2)
2330 .Case("bdver1", CK_BDVER1)
2331 .Case("bdver2", CK_BDVER2)
2332 .Case("bdver3", CK_BDVER3)
2333 .Case("bdver4", CK_BDVER4)
2334 .Case("x86-64", CK_x86_64)
2335 .Case("geode", CK_Geode)
2336 .Default(CK_Generic);
2337 }
2338
Rafael Espindolaeb265472013-08-21 21:59:03 +00002339 enum FPMathKind {
2340 FP_Default,
2341 FP_SSE,
2342 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002343 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002344
Eli Friedman3fd920a2008-08-20 02:34:37 +00002345public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002346 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002347 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002348 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002349 }
Craig Topper3164f332014-03-11 03:39:26 +00002350 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002351 // X87 evaluates with 80 bits "long double" precision.
2352 return SSELevel == NoSSE ? 2 : 0;
2353 }
Craig Topper3164f332014-03-11 03:39:26 +00002354 void getTargetBuiltins(const Builtin::Info *&Records,
2355 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002356 Records = BuiltinInfo;
2357 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002358 }
Craig Topper3164f332014-03-11 03:39:26 +00002359 void getGCCRegNames(const char * const *&Names,
2360 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002361 Names = GCCRegNames;
2362 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002363 }
Craig Topper3164f332014-03-11 03:39:26 +00002364 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2365 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002366 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002367 NumAliases = 0;
2368 }
Craig Topper3164f332014-03-11 03:39:26 +00002369 void getGCCAddlRegNames(const AddlRegName *&Names,
2370 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002371 Names = AddlRegNames;
2372 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002373 }
Eric Christopherd9832702015-06-29 21:00:05 +00002374 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002375 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002376 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002377
Akira Hatanaka974131e2014-09-18 18:17:18 +00002378 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2379
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002380 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2381
Akira Hatanaka974131e2014-09-18 18:17:18 +00002382 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2383
Craig Topper3164f332014-03-11 03:39:26 +00002384 std::string convertConstraint(const char *&Constraint) const override;
2385 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002386 return "~{dirflag},~{fpsr},~{flags}";
2387 }
Craig Topper3164f332014-03-11 03:39:26 +00002388 void getTargetDefines(const LangOptions &Opts,
2389 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002390 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2391 bool Enabled);
2392 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2393 bool Enabled);
2394 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2395 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002396 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2397 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002398 setFeatureEnabledImpl(Features, Name, Enabled);
2399 }
2400 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002401 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002402 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2403 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002404 bool
2405 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2406 StringRef CPU,
2407 const 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,
Eric Christopher8c47b422015-10-09 18:39:55 +00002535 const 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 Topperda9fe562015-10-15 05:23:38 +00002588 setFeatureEnabledImpl(Features, "xsavec", true);
2589 setFeatureEnabledImpl(Features, "xsaves", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002590 // FALLTHROUGH
2591 case CK_Broadwell:
2592 setFeatureEnabledImpl(Features, "rdseed", true);
2593 setFeatureEnabledImpl(Features, "adx", true);
2594 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002595 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002596 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002597 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002598 setFeatureEnabledImpl(Features, "bmi", true);
2599 setFeatureEnabledImpl(Features, "bmi2", true);
2600 setFeatureEnabledImpl(Features, "rtm", true);
2601 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002602 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002603 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002604 setFeatureEnabledImpl(Features, "rdrnd", true);
2605 setFeatureEnabledImpl(Features, "f16c", true);
2606 setFeatureEnabledImpl(Features, "fsgsbase", true);
2607 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002608 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002609 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002610 setFeatureEnabledImpl(Features, "xsave", true);
2611 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002612 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002613 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002614 case CK_Silvermont:
2615 setFeatureEnabledImpl(Features, "aes", true);
2616 setFeatureEnabledImpl(Features, "pclmul", true);
2617 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002618 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002619 setFeatureEnabledImpl(Features, "sse4.2", true);
2620 setFeatureEnabledImpl(Features, "cx16", true);
2621 break;
2622 case CK_KNL:
2623 setFeatureEnabledImpl(Features, "avx512f", true);
2624 setFeatureEnabledImpl(Features, "avx512cd", true);
2625 setFeatureEnabledImpl(Features, "avx512er", true);
2626 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002627 setFeatureEnabledImpl(Features, "rdseed", true);
2628 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002629 setFeatureEnabledImpl(Features, "lzcnt", true);
2630 setFeatureEnabledImpl(Features, "bmi", true);
2631 setFeatureEnabledImpl(Features, "bmi2", true);
2632 setFeatureEnabledImpl(Features, "rtm", true);
2633 setFeatureEnabledImpl(Features, "fma", true);
2634 setFeatureEnabledImpl(Features, "rdrnd", true);
2635 setFeatureEnabledImpl(Features, "f16c", true);
2636 setFeatureEnabledImpl(Features, "fsgsbase", true);
2637 setFeatureEnabledImpl(Features, "aes", true);
2638 setFeatureEnabledImpl(Features, "pclmul", true);
2639 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002640 setFeatureEnabledImpl(Features, "xsaveopt", true);
2641 setFeatureEnabledImpl(Features, "xsave", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002642 break;
2643 case CK_K6_2:
2644 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002645 case CK_WinChip2:
2646 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002647 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002648 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002649 case CK_Athlon:
2650 case CK_AthlonThunderbird:
2651 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002652 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002653 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002654 case CK_Athlon4:
2655 case CK_AthlonXP:
2656 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002657 setFeatureEnabledImpl(Features, "sse", true);
2658 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002659 break;
2660 case CK_K8:
2661 case CK_Opteron:
2662 case CK_Athlon64:
2663 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002664 setFeatureEnabledImpl(Features, "sse2", true);
2665 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002666 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002667 case CK_AMDFAM10:
2668 setFeatureEnabledImpl(Features, "sse4a", true);
2669 setFeatureEnabledImpl(Features, "lzcnt", true);
2670 setFeatureEnabledImpl(Features, "popcnt", true);
2671 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002672 case CK_K8SSE3:
2673 case CK_OpteronSSE3:
2674 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002675 setFeatureEnabledImpl(Features, "sse3", true);
2676 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002677 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002678 case CK_BTVER2:
2679 setFeatureEnabledImpl(Features, "avx", true);
2680 setFeatureEnabledImpl(Features, "aes", true);
2681 setFeatureEnabledImpl(Features, "pclmul", true);
2682 setFeatureEnabledImpl(Features, "bmi", true);
2683 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002684 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002685 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002686 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002687 setFeatureEnabledImpl(Features, "ssse3", true);
2688 setFeatureEnabledImpl(Features, "sse4a", true);
2689 setFeatureEnabledImpl(Features, "lzcnt", true);
2690 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002691 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002692 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002693 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002694 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002695 case CK_BDVER4:
2696 setFeatureEnabledImpl(Features, "avx2", true);
2697 setFeatureEnabledImpl(Features, "bmi2", true);
2698 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002699 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002700 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002701 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002702 // FALLTHROUGH
2703 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002704 setFeatureEnabledImpl(Features, "bmi", true);
2705 setFeatureEnabledImpl(Features, "fma", true);
2706 setFeatureEnabledImpl(Features, "f16c", true);
2707 setFeatureEnabledImpl(Features, "tbm", true);
2708 // FALLTHROUGH
2709 case CK_BDVER1:
2710 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002711 setFeatureEnabledImpl(Features, "xop", true);
2712 setFeatureEnabledImpl(Features, "lzcnt", true);
2713 setFeatureEnabledImpl(Features, "aes", true);
2714 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002715 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002716 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002717 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002718 break;
Eli Friedman33465822011-07-08 23:31:17 +00002719 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002720 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2721 return false;
2722
2723 // Can't do this earlier because we need to be able to explicitly enable
2724 // or disable these features and the things that they depend upon.
2725
2726 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2727 auto I = Features.find("sse4.2");
2728 if (I != Features.end() && I->getValue() == true &&
2729 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2730 FeaturesVec.end())
2731 Features["popcnt"] = true;
2732
2733 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2734 I = Features.find("3dnow");
2735 if (I != Features.end() && I->getValue() == true &&
2736 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2737 FeaturesVec.end())
2738 Features["prfchw"] = true;
2739
Eric Christophera7260af2015-10-08 20:10:18 +00002740 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2741 // then enable MMX.
2742 I = Features.find("sse");
2743 if (I != Features.end() && I->getValue() == true &&
2744 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2745 FeaturesVec.end())
2746 Features["mmx"] = true;
2747
Eric Christopherbbd746d2015-10-08 20:10:14 +00002748 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002749}
2750
Rafael Espindolae62e2792013-08-20 13:44:29 +00002751void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002752 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002753 if (Enabled) {
2754 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002755 case AVX512F:
2756 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002757 case AVX2:
2758 Features["avx2"] = true;
2759 case AVX:
2760 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002761 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002762 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002763 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002764 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002765 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002766 case SSSE3:
2767 Features["ssse3"] = true;
2768 case SSE3:
2769 Features["sse3"] = true;
2770 case SSE2:
2771 Features["sse2"] = true;
2772 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002773 Features["sse"] = true;
2774 case NoSSE:
2775 break;
2776 }
2777 return;
2778 }
2779
2780 switch (Level) {
2781 case NoSSE:
2782 case SSE1:
2783 Features["sse"] = false;
2784 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002785 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2786 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002787 case SSE3:
2788 Features["sse3"] = false;
2789 setXOPLevel(Features, NoXOP, false);
2790 case SSSE3:
2791 Features["ssse3"] = false;
2792 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002793 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002794 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002795 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002796 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002797 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2798 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002799 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002800 case AVX2:
2801 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002802 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002803 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002804 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2805 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002806 }
2807}
2808
2809void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002810 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002811 if (Enabled) {
2812 switch (Level) {
2813 case AMD3DNowAthlon:
2814 Features["3dnowa"] = true;
2815 case AMD3DNow:
2816 Features["3dnow"] = true;
2817 case MMX:
2818 Features["mmx"] = true;
2819 case NoMMX3DNow:
2820 break;
2821 }
2822 return;
2823 }
2824
2825 switch (Level) {
2826 case NoMMX3DNow:
2827 case MMX:
2828 Features["mmx"] = false;
2829 case AMD3DNow:
2830 Features["3dnow"] = false;
2831 case AMD3DNowAthlon:
2832 Features["3dnowa"] = false;
2833 }
2834}
2835
2836void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002837 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002838 if (Enabled) {
2839 switch (Level) {
2840 case XOP:
2841 Features["xop"] = true;
2842 case FMA4:
2843 Features["fma4"] = true;
2844 setSSELevel(Features, AVX, true);
2845 case SSE4A:
2846 Features["sse4a"] = true;
2847 setSSELevel(Features, SSE3, true);
2848 case NoXOP:
2849 break;
2850 }
2851 return;
2852 }
2853
2854 switch (Level) {
2855 case NoXOP:
2856 case SSE4A:
2857 Features["sse4a"] = false;
2858 case FMA4:
2859 Features["fma4"] = false;
2860 case XOP:
2861 Features["xop"] = false;
2862 }
2863}
2864
Craig Topper86d79ef2013-09-17 04:51:29 +00002865void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2866 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002867 // This is a bit of a hack to deal with the sse4 target feature when used
2868 // as part of the target attribute. We handle sse4 correctly everywhere
2869 // else. See below for more information on how we handle the sse4 options.
2870 if (Name != "sse4")
2871 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002872
Craig Topper29561122013-09-19 01:13:07 +00002873 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002874 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002875 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002876 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002877 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002878 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002879 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002880 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002881 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002882 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002883 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002884 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002885 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002886 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002887 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002888 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002889 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002890 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002891 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002892 if (Enabled)
2893 setSSELevel(Features, SSE2, Enabled);
2894 } else if (Name == "pclmul") {
2895 if (Enabled)
2896 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002897 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002898 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002899 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002900 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002901 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002902 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002903 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2904 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002905 if (Enabled)
2906 setSSELevel(Features, AVX512F, Enabled);
2907 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002908 if (Enabled)
2909 setSSELevel(Features, AVX, Enabled);
2910 } else if (Name == "fma4") {
2911 setXOPLevel(Features, FMA4, Enabled);
2912 } else if (Name == "xop") {
2913 setXOPLevel(Features, XOP, Enabled);
2914 } else if (Name == "sse4a") {
2915 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002916 } else if (Name == "f16c") {
2917 if (Enabled)
2918 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002919 } else if (Name == "sha") {
2920 if (Enabled)
2921 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002922 } else if (Name == "sse4") {
2923 // We can get here via the __target__ attribute since that's not controlled
2924 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2925 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2926 // disabled.
2927 if (Enabled)
2928 setSSELevel(Features, SSE42, Enabled);
2929 else
2930 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00002931 } else if (Name == "xsave") {
2932 if (Enabled)
2933 setSSELevel(Features, AVX, Enabled);
2934 else
2935 Features["xsaveopt"] = false;
2936 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
2937 if (Enabled) {
2938 Features["xsave"] = true;
2939 setSSELevel(Features, AVX, Enabled);
2940 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002941 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002942}
2943
Eric Christopher3ff21b32013-10-16 21:26:26 +00002944/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002945/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002946bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002947 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00002948 for (const auto &Feature : Features) {
2949 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00002950 continue;
2951
Eric Christopher610fe112015-08-26 08:21:55 +00002952 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002953 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002954 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00002955 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002956 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002957 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002958 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002959 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002960 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00002961 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002962 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002963 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002964 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002965 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002966 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002967 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002968 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00002969 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002970 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00002971 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002972 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00002973 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002974 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00002975 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002976 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002977 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002978 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00002979 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002980 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00002981 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002982 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00002983 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002984 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00002985 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002986 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002987 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002988 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002989 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002990 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002991 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002992 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002993 HasAVX512VL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002994 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00002995 HasSHA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002996 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00002997 HasCX16 = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002998 } else if (Feature == "+xsave") {
2999 HasXSAVE = true;
3000 } else if (Feature == "+xsaveopt") {
3001 HasXSAVEOPT = true;
3002 } else if (Feature == "+xsavec") {
3003 HasXSAVEC = true;
3004 } else if (Feature == "+xsaves") {
3005 HasXSAVES = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003006 }
3007
Benjamin Kramer27402c62012-03-05 15:10:44 +00003008 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003009 .Case("+avx512f", AVX512F)
3010 .Case("+avx2", AVX2)
3011 .Case("+avx", AVX)
3012 .Case("+sse4.2", SSE42)
3013 .Case("+sse4.1", SSE41)
3014 .Case("+ssse3", SSSE3)
3015 .Case("+sse3", SSE3)
3016 .Case("+sse2", SSE2)
3017 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003018 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003019 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003020
Eli Friedman33465822011-07-08 23:31:17 +00003021 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003022 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003023 .Case("+3dnowa", AMD3DNowAthlon)
3024 .Case("+3dnow", AMD3DNow)
3025 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003026 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003027 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003028
3029 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003030 .Case("+xop", XOP)
3031 .Case("+fma4", FMA4)
3032 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003033 .Default(NoXOP);
3034 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003035 }
Eli Friedman33465822011-07-08 23:31:17 +00003036
Rafael Espindolaeb265472013-08-21 21:59:03 +00003037 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3038 // matches the selected sse level.
3039 if (FPMath == FP_SSE && SSELevel < SSE1) {
3040 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
3041 return false;
3042 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
3043 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
3044 return false;
3045 }
3046
Alexey Bataev00396512015-07-02 03:40:19 +00003047 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003048 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003049 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003050}
Chris Lattnerecd49032009-03-02 22:27:17 +00003051
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003052/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3053/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003054void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003055 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003056 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003057 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003058 Builder.defineMacro("__amd64__");
3059 Builder.defineMacro("__amd64");
3060 Builder.defineMacro("__x86_64");
3061 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003062 if (getTriple().getArchName() == "x86_64h") {
3063 Builder.defineMacro("__x86_64h");
3064 Builder.defineMacro("__x86_64h__");
3065 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003066 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003067 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003068 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003069
Chris Lattnerecd49032009-03-02 22:27:17 +00003070 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003071 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3072 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003073 switch (CPU) {
3074 case CK_Generic:
3075 break;
3076 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003077 // The rest are coming from the i386 define above.
3078 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003079 break;
3080 case CK_i486:
3081 case CK_WinChipC6:
3082 case CK_WinChip2:
3083 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003084 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003085 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003086 case CK_PentiumMMX:
3087 Builder.defineMacro("__pentium_mmx__");
3088 Builder.defineMacro("__tune_pentium_mmx__");
3089 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003090 case CK_i586:
3091 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003092 defineCPUMacros(Builder, "i586");
3093 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003094 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003095 case CK_Pentium3:
3096 case CK_Pentium3M:
3097 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003098 Builder.defineMacro("__tune_pentium3__");
3099 // Fallthrough
3100 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003101 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003102 Builder.defineMacro("__tune_pentium2__");
3103 // Fallthrough
3104 case CK_PentiumPro:
3105 Builder.defineMacro("__tune_i686__");
3106 Builder.defineMacro("__tune_pentiumpro__");
3107 // Fallthrough
3108 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003109 Builder.defineMacro("__i686");
3110 Builder.defineMacro("__i686__");
3111 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3112 Builder.defineMacro("__pentiumpro");
3113 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003114 break;
3115 case CK_Pentium4:
3116 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003117 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003118 break;
3119 case CK_Yonah:
3120 case CK_Prescott:
3121 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003122 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003123 break;
3124 case CK_Core2:
3125 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003126 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003127 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003128 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003129 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003130 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003131 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003132 defineCPUMacros(Builder, "slm");
3133 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003134 case CK_Nehalem:
3135 case CK_Westmere:
3136 case CK_SandyBridge:
3137 case CK_IvyBridge:
3138 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003139 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003140 // FIXME: Historically, we defined this legacy name, it would be nice to
3141 // remove it at some point. We've never exposed fine-grained names for
3142 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003143 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003144 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003145 case CK_Skylake:
3146 // FIXME: Historically, we defined this legacy name, it would be nice to
3147 // remove it at some point. This is the only fine-grained CPU macro in the
3148 // main intel CPU line, and it would be better to not have these and force
3149 // people to use ISA macros.
3150 defineCPUMacros(Builder, "skx");
3151 break;
Craig Topper449314e2013-08-20 07:09:39 +00003152 case CK_KNL:
3153 defineCPUMacros(Builder, "knl");
3154 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003155 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003156 Builder.defineMacro("__k6_2__");
3157 Builder.defineMacro("__tune_k6_2__");
3158 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003159 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003160 if (CPU != CK_K6_2) { // In case of fallthrough
3161 // FIXME: GCC may be enabling these in cases where some other k6
3162 // architecture is specified but -m3dnow is explicitly provided. The
3163 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003164 Builder.defineMacro("__k6_3__");
3165 Builder.defineMacro("__tune_k6_3__");
3166 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003167 // Fallthrough
3168 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003169 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003170 break;
3171 case CK_Athlon:
3172 case CK_AthlonThunderbird:
3173 case CK_Athlon4:
3174 case CK_AthlonXP:
3175 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003176 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003177 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003178 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003179 Builder.defineMacro("__tune_athlon_sse__");
3180 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003181 break;
3182 case CK_K8:
3183 case CK_K8SSE3:
3184 case CK_x86_64:
3185 case CK_Opteron:
3186 case CK_OpteronSSE3:
3187 case CK_Athlon64:
3188 case CK_Athlon64SSE3:
3189 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003190 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003191 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003192 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003193 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003194 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003195 case CK_BTVER1:
3196 defineCPUMacros(Builder, "btver1");
3197 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003198 case CK_BTVER2:
3199 defineCPUMacros(Builder, "btver2");
3200 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003201 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003202 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003203 break;
3204 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003205 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003206 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003207 case CK_BDVER3:
3208 defineCPUMacros(Builder, "bdver3");
3209 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003210 case CK_BDVER4:
3211 defineCPUMacros(Builder, "bdver4");
3212 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003213 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003214 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003215 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003216 }
Chris Lattner96e43572009-03-02 22:40:39 +00003217
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003218 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003219 Builder.defineMacro("__REGISTER_PREFIX__", "");
3220
Chris Lattner6df41af2009-04-19 17:32:33 +00003221 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3222 // functions in glibc header files that use FP Stack inline asm which the
3223 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003224 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003225
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003226 if (HasAES)
3227 Builder.defineMacro("__AES__");
3228
Craig Topper3f122a72012-05-31 05:18:48 +00003229 if (HasPCLMUL)
3230 Builder.defineMacro("__PCLMUL__");
3231
Craig Topper22967d42011-12-25 05:06:45 +00003232 if (HasLZCNT)
3233 Builder.defineMacro("__LZCNT__");
3234
Benjamin Kramer1e250392012-07-07 09:39:18 +00003235 if (HasRDRND)
3236 Builder.defineMacro("__RDRND__");
3237
Craig Topper8c7f2512014-11-03 06:51:41 +00003238 if (HasFSGSBASE)
3239 Builder.defineMacro("__FSGSBASE__");
3240
Craig Topper22967d42011-12-25 05:06:45 +00003241 if (HasBMI)
3242 Builder.defineMacro("__BMI__");
3243
3244 if (HasBMI2)
3245 Builder.defineMacro("__BMI2__");
3246
Craig Topper1de83482011-12-29 16:10:46 +00003247 if (HasPOPCNT)
3248 Builder.defineMacro("__POPCNT__");
3249
Michael Liao625a8752012-11-10 05:17:46 +00003250 if (HasRTM)
3251 Builder.defineMacro("__RTM__");
3252
Michael Liao74f4eaf2013-03-26 17:52:08 +00003253 if (HasPRFCHW)
3254 Builder.defineMacro("__PRFCHW__");
3255
Michael Liaoffaae352013-03-29 05:17:55 +00003256 if (HasRDSEED)
3257 Builder.defineMacro("__RDSEED__");
3258
Robert Khasanov50e6f582014-09-19 09:53:48 +00003259 if (HasADX)
3260 Builder.defineMacro("__ADX__");
3261
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003262 if (HasTBM)
3263 Builder.defineMacro("__TBM__");
3264
Rafael Espindolae62e2792013-08-20 13:44:29 +00003265 switch (XOPLevel) {
3266 case XOP:
3267 Builder.defineMacro("__XOP__");
3268 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003269 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003270 case SSE4A:
3271 Builder.defineMacro("__SSE4A__");
3272 case NoXOP:
3273 break;
3274 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003275
Craig Topperbba778b2012-06-03 21:46:30 +00003276 if (HasFMA)
3277 Builder.defineMacro("__FMA__");
3278
Manman Rena45358c2012-10-11 00:59:55 +00003279 if (HasF16C)
3280 Builder.defineMacro("__F16C__");
3281
Craig Topper679b53a2013-08-21 05:29:10 +00003282 if (HasAVX512CD)
3283 Builder.defineMacro("__AVX512CD__");
3284 if (HasAVX512ER)
3285 Builder.defineMacro("__AVX512ER__");
3286 if (HasAVX512PF)
3287 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003288 if (HasAVX512DQ)
3289 Builder.defineMacro("__AVX512DQ__");
3290 if (HasAVX512BW)
3291 Builder.defineMacro("__AVX512BW__");
3292 if (HasAVX512VL)
3293 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003294
Ben Langmuir58078d02013-09-19 13:22:04 +00003295 if (HasSHA)
3296 Builder.defineMacro("__SHA__");
3297
Craig Topperda9fe562015-10-15 05:23:38 +00003298 if (HasXSAVE)
3299 Builder.defineMacro("__XSAVE__");
3300 if (HasXSAVEOPT)
3301 Builder.defineMacro("__XSAVEOPT__");
3302 if (HasXSAVEC)
3303 Builder.defineMacro("__XSAVEC__");
3304 if (HasXSAVES)
3305 Builder.defineMacro("__XSAVES__");
3306
Nick Lewycky50e8f482013-10-05 20:14:27 +00003307 if (HasCX16)
3308 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3309
Chris Lattner96e43572009-03-02 22:40:39 +00003310 // Each case falls through to the previous one here.
3311 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003312 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003313 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003314 case AVX2:
3315 Builder.defineMacro("__AVX2__");
3316 case AVX:
3317 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003318 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003319 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003320 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003321 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003322 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003323 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003324 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003325 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003326 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003327 Builder.defineMacro("__SSE2__");
3328 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003329 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003330 Builder.defineMacro("__SSE__");
3331 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003332 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003333 break;
3334 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003335
Derek Schuffc7dd7222012-10-11 15:52:22 +00003336 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003337 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003338 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003339 case AVX2:
3340 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003341 case SSE42:
3342 case SSE41:
3343 case SSSE3:
3344 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003345 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003346 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003347 break;
3348 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003349 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003350 break;
3351 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003352 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003353 }
3354 }
3355
Anders Carlssone437c682010-01-27 03:47:49 +00003356 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003357 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003358 case AMD3DNowAthlon:
3359 Builder.defineMacro("__3dNOW_A__");
3360 case AMD3DNow:
3361 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003362 case MMX:
3363 Builder.defineMacro("__MMX__");
3364 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003365 break;
3366 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003367
3368 if (CPU >= CK_i486) {
3369 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3370 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3371 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3372 }
3373 if (CPU >= CK_i586)
3374 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003375}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003376
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003377bool X86TargetInfo::hasFeature(StringRef Feature) const {
3378 return llvm::StringSwitch<bool>(Feature)
3379 .Case("aes", HasAES)
3380 .Case("avx", SSELevel >= AVX)
3381 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003382 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003383 .Case("avx512cd", HasAVX512CD)
3384 .Case("avx512er", HasAVX512ER)
3385 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003386 .Case("avx512dq", HasAVX512DQ)
3387 .Case("avx512bw", HasAVX512BW)
3388 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003389 .Case("bmi", HasBMI)
3390 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003391 .Case("cx16", HasCX16)
3392 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003393 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003394 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003395 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003396 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003397 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3398 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3399 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003400 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003401 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003402 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003403 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003404 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003405 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003406 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003407 .Case("sse", SSELevel >= SSE1)
3408 .Case("sse2", SSELevel >= SSE2)
3409 .Case("sse3", SSELevel >= SSE3)
3410 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003411 .Case("sse4.1", SSELevel >= SSE41)
3412 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003413 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003414 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003415 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003416 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3417 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003418 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003419 .Case("xsave", HasXSAVE)
3420 .Case("xsavec", HasXSAVEC)
3421 .Case("xsaves", HasXSAVES)
3422 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003423 .Default(false);
3424}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003425
Eric Christopherd9832702015-06-29 21:00:05 +00003426// We can't use a generic validation scheme for the features accepted here
3427// versus subtarget features accepted in the target attribute because the
3428// bitfield structure that's initialized in the runtime only supports the
3429// below currently rather than the full range of subtarget features. (See
3430// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3431bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3432 return llvm::StringSwitch<bool>(FeatureStr)
3433 .Case("cmov", true)
3434 .Case("mmx", true)
3435 .Case("popcnt", true)
3436 .Case("sse", true)
3437 .Case("sse2", true)
3438 .Case("sse3", true)
3439 .Case("sse4.1", true)
3440 .Case("sse4.2", true)
3441 .Case("avx", true)
3442 .Case("avx2", true)
3443 .Case("sse4a", true)
3444 .Case("fma4", true)
3445 .Case("xop", true)
3446 .Case("fma", true)
3447 .Case("avx512f", true)
3448 .Case("bmi", true)
3449 .Case("bmi2", true)
3450 .Default(false);
3451}
3452
Eli Friedman3fd920a2008-08-20 02:34:37 +00003453bool
Anders Carlsson58436352009-02-28 17:11:49 +00003454X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003455 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003456 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003457 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003458 // Constant constraints.
3459 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3460 // instructions.
3461 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3462 // x86_64 instructions.
3463 case 's':
3464 Info.setRequiresImmediate();
3465 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003466 case 'I':
3467 Info.setRequiresImmediate(0, 31);
3468 return true;
3469 case 'J':
3470 Info.setRequiresImmediate(0, 63);
3471 return true;
3472 case 'K':
3473 Info.setRequiresImmediate(-128, 127);
3474 return true;
3475 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003476 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003477 return true;
3478 case 'M':
3479 Info.setRequiresImmediate(0, 3);
3480 return true;
3481 case 'N':
3482 Info.setRequiresImmediate(0, 255);
3483 return true;
3484 case 'O':
3485 Info.setRequiresImmediate(0, 127);
3486 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003487 // Register constraints.
3488 case 'Y': // 'Y' is the first character for several 2-character constraints.
3489 // Shift the pointer to the second character of the constraint.
3490 Name++;
3491 switch (*Name) {
3492 default:
3493 return false;
3494 case '0': // First SSE register.
3495 case 't': // Any SSE register, when SSE2 is enabled.
3496 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3497 case 'm': // Any MMX register, when inter-unit moves enabled.
3498 Info.setAllowsRegister();
3499 return true;
3500 }
3501 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003502 // Constraint 'f' cannot be used for output operands.
3503 if (Info.ConstraintStr[0] == '=')
3504 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003505 Info.setAllowsRegister();
3506 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003507 case 'a': // eax.
3508 case 'b': // ebx.
3509 case 'c': // ecx.
3510 case 'd': // edx.
3511 case 'S': // esi.
3512 case 'D': // edi.
3513 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003514 case 't': // Top of floating point stack.
3515 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003516 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003517 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003518 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003519 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003520 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3521 case 'l': // "Index" registers: any general register that can be used as an
3522 // index in a base+index memory access.
3523 Info.setAllowsRegister();
3524 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003525 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003526 case 'C': // SSE floating point constant.
3527 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003528 return true;
3529 }
3530}
3531
Akira Hatanaka974131e2014-09-18 18:17:18 +00003532bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3533 unsigned Size) const {
3534 // Strip off constraint modifiers.
3535 while (Constraint[0] == '=' ||
3536 Constraint[0] == '+' ||
3537 Constraint[0] == '&')
3538 Constraint = Constraint.substr(1);
3539
3540 return validateOperandSize(Constraint, Size);
3541}
3542
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003543bool X86TargetInfo::validateInputSize(StringRef Constraint,
3544 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003545 return validateOperandSize(Constraint, Size);
3546}
3547
3548bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3549 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003550 switch (Constraint[0]) {
3551 default: break;
3552 case 'y':
3553 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003554 case 'f':
3555 case 't':
3556 case 'u':
3557 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003558 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003559 if (SSELevel >= AVX512F)
3560 // 512-bit zmm registers can be used if target supports AVX512F.
3561 return Size <= 512U;
3562 else if (SSELevel >= AVX)
3563 // 256-bit ymm registers can be used if target supports AVX.
3564 return Size <= 256U;
3565 return Size <= 128U;
3566 case 'Y':
3567 // 'Y' is the first character for several 2-character constraints.
3568 switch (Constraint[1]) {
3569 default: break;
3570 case 'm':
3571 // 'Ym' is synonymous with 'y'.
3572 return Size <= 64;
3573 case 'i':
3574 case 't':
3575 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3576 if (SSELevel >= AVX512F)
3577 return Size <= 512U;
3578 else if (SSELevel >= AVX)
3579 return Size <= 256U;
3580 return SSELevel >= SSE2 && Size <= 128U;
3581 }
3582
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003583 }
3584
3585 return true;
3586}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003587
Eli Friedman3fd920a2008-08-20 02:34:37 +00003588std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003589X86TargetInfo::convertConstraint(const char *&Constraint) const {
3590 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003591 case 'a': return std::string("{ax}");
3592 case 'b': return std::string("{bx}");
3593 case 'c': return std::string("{cx}");
3594 case 'd': return std::string("{dx}");
3595 case 'S': return std::string("{si}");
3596 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003597 case 'p': // address
3598 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003599 case 't': // top of floating point stack.
3600 return std::string("{st}");
3601 case 'u': // second from top of floating point stack.
3602 return std::string("{st(1)}"); // second from top of floating point stack.
3603 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003604 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003605 }
3606}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003607
Eli Friedman3fd920a2008-08-20 02:34:37 +00003608// X86-32 generic target
3609class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003610public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003611 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003612 DoubleAlign = LongLongAlign = 32;
3613 LongDoubleWidth = 96;
3614 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003615 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003616 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003617 SizeType = UnsignedInt;
3618 PtrDiffType = SignedInt;
3619 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003620 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003621
3622 // Use fpret for all types.
3623 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3624 (1 << TargetInfo::Double) |
3625 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003626
3627 // x86-32 has atomics up to 8 bytes
3628 // FIXME: Check that we actually have cmpxchg8b before setting
3629 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3630 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003631 }
Craig Topper3164f332014-03-11 03:39:26 +00003632 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003633 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003634 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003635
Craig Topper3164f332014-03-11 03:39:26 +00003636 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003637 if (RegNo == 0) return 0;
3638 if (RegNo == 1) return 2;
3639 return -1;
3640 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003641 bool validateOperandSize(StringRef Constraint,
3642 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003643 switch (Constraint[0]) {
3644 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003645 case 'R':
3646 case 'q':
3647 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003648 case 'a':
3649 case 'b':
3650 case 'c':
3651 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003652 case 'S':
3653 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003654 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003655 case 'A':
3656 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003657 }
3658
Akira Hatanaka974131e2014-09-18 18:17:18 +00003659 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003660 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003661};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003662
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003663class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3664public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003665 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3666 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003667
Craig Topper3164f332014-03-11 03:39:26 +00003668 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003669 unsigned Major, Minor, Micro;
3670 getTriple().getOSVersion(Major, Minor, Micro);
3671 // New NetBSD uses the default rounding mode.
3672 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3673 return X86_32TargetInfo::getFloatEvalMethod();
3674 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003675 return 1;
3676 }
3677};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003678
Eli Friedmane3aa4542009-07-05 18:47:56 +00003679class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3680public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003681 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3682 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003683 SizeType = UnsignedLong;
3684 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003685 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003686 }
3687};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003688
Eli Friedman9fa28852012-08-08 23:57:20 +00003689class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3690public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003691 BitrigI386TargetInfo(const llvm::Triple &Triple)
3692 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003693 SizeType = UnsignedLong;
3694 IntPtrType = SignedLong;
3695 PtrDiffType = SignedLong;
3696 }
3697};
Eli Friedman9fa28852012-08-08 23:57:20 +00003698
Torok Edwinb2b37c62009-06-30 17:10:35 +00003699class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003700public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003701 DarwinI386TargetInfo(const llvm::Triple &Triple)
3702 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003703 LongDoubleWidth = 128;
3704 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003705 SuitableAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003706 SizeType = UnsignedLong;
3707 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003708 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003709 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003710 }
3711
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003712 bool handleTargetFeatures(std::vector<std::string> &Features,
3713 DiagnosticsEngine &Diags) override {
3714 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3715 Diags))
3716 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003717 // We now know the features we have: we can decide how to align vectors.
3718 MaxVectorAlign =
3719 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003720 return true;
3721 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003722};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003723
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003724// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003725class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003726public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003727 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3728 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003729 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003730 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003731 bool IsWinCOFF =
3732 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003733 DataLayoutString = IsWinCOFF
3734 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3735 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003736 }
Craig Topper3164f332014-03-11 03:39:26 +00003737 void getTargetDefines(const LangOptions &Opts,
3738 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003739 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3740 }
3741};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003742
3743// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003744class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003745public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003746 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003747 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003748 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003749 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3750 }
Craig Topper3164f332014-03-11 03:39:26 +00003751 void getTargetDefines(const LangOptions &Opts,
3752 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003753 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3754 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3755 // The value of the following reflects processor type.
3756 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3757 // We lost the original triple, so we use the default.
3758 Builder.defineMacro("_M_IX86", "600");
3759 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003760};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003761
David Majnemerae1ed0e2015-05-28 04:36:18 +00003762static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003763 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3764 // supports __declspec natively under -fms-extensions, but we define a no-op
3765 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003766 if (Opts.MicrosoftExt)
3767 Builder.defineMacro("__declspec", "__declspec");
3768 else
3769 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3770
3771 if (!Opts.MicrosoftExt) {
3772 // Provide macros for all the calling convention keywords. Provide both
3773 // single and double underscore prefixed variants. These are available on
3774 // x64 as well as x86, even though they have no effect.
3775 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3776 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003777 std::string GCCSpelling = "__attribute__((__";
3778 GCCSpelling += CC;
3779 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003780 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3781 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3782 }
3783 }
3784}
3785
David Majnemerae1ed0e2015-05-28 04:36:18 +00003786static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3787 Builder.defineMacro("__MSVCRT__");
3788 Builder.defineMacro("__MINGW32__");
3789 addCygMingDefines(Opts, Builder);
3790}
3791
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003792// x86-32 MinGW target
3793class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3794public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003795 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003796 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003797 void getTargetDefines(const LangOptions &Opts,
3798 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003799 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003800 DefineStd(Builder, "WIN32", Opts);
3801 DefineStd(Builder, "WINNT", Opts);
3802 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003803 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003804 }
3805};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003806
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003807// x86-32 Cygwin target
3808class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3809public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003810 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3811 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003812 TLSSupported = false;
3813 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003814 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003815 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 +00003816 }
Craig Topper3164f332014-03-11 03:39:26 +00003817 void getTargetDefines(const LangOptions &Opts,
3818 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003819 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003820 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003821 Builder.defineMacro("__CYGWIN__");
3822 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003823 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003824 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003825 if (Opts.CPlusPlus)
3826 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003827 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003828};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003829
Chris Lattnerb986aba2010-04-11 19:29:39 +00003830// x86-32 Haiku target
3831class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3832public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003833 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003834 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003835 IntPtrType = SignedLong;
3836 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003837 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003838 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003839 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003840 }
Craig Topper3164f332014-03-11 03:39:26 +00003841 void getTargetDefines(const LangOptions &Opts,
3842 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003843 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3844 Builder.defineMacro("__INTEL__");
3845 Builder.defineMacro("__HAIKU__");
3846 }
3847};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003848
Douglas Gregor9fabd852011-07-01 22:41:14 +00003849// RTEMS Target
3850template<typename Target>
3851class RTEMSTargetInfo : public OSTargetInfo<Target> {
3852protected:
Craig Topper3164f332014-03-11 03:39:26 +00003853 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3854 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003855 // RTEMS defines; list based off of gcc output
3856
Douglas Gregor9fabd852011-07-01 22:41:14 +00003857 Builder.defineMacro("__rtems__");
3858 Builder.defineMacro("__ELF__");
3859 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003860
Douglas Gregor9fabd852011-07-01 22:41:14 +00003861public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003862 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3863 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003864
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003865 switch (Triple.getArch()) {
3866 default:
3867 case llvm::Triple::x86:
3868 // this->MCountName = ".mcount";
3869 break;
3870 case llvm::Triple::mips:
3871 case llvm::Triple::mipsel:
3872 case llvm::Triple::ppc:
3873 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003874 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003875 // this->MCountName = "_mcount";
3876 break;
3877 case llvm::Triple::arm:
3878 // this->MCountName = "__mcount";
3879 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003880 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003881 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003882};
3883
Douglas Gregor9fabd852011-07-01 22:41:14 +00003884// x86-32 RTEMS target
3885class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3886public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003887 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003888 SizeType = UnsignedLong;
3889 IntPtrType = SignedLong;
3890 PtrDiffType = SignedLong;
3891 this->UserLabelPrefix = "";
3892 }
Craig Topper3164f332014-03-11 03:39:26 +00003893 void getTargetDefines(const LangOptions &Opts,
3894 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003895 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3896 Builder.defineMacro("__INTEL__");
3897 Builder.defineMacro("__rtems__");
3898 }
3899};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003900
Eli Friedman3fd920a2008-08-20 02:34:37 +00003901// x86-64 generic target
3902class X86_64TargetInfo : public X86TargetInfo {
3903public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003904 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003905 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003906 bool IsWinCOFF =
3907 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003908 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003909 LongDoubleWidth = 128;
3910 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003911 LargeArrayMinWidth = 128;
3912 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003913 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003914 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3915 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3916 IntPtrType = IsX32 ? SignedInt : SignedLong;
3917 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003918 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003919 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003920
Eric Christopher917e9522014-11-18 22:36:15 +00003921 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003922 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3923 : IsWinCOFF
3924 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3925 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003926
3927 // Use fpret only for long double.
3928 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003929
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003930 // Use fp2ret for _Complex long double.
3931 ComplexLongDoubleUsesFP2Ret = true;
3932
Charles Davisc7d5c942015-09-17 20:55:33 +00003933 // Make __builtin_ms_va_list available.
3934 HasBuiltinMSVaList = true;
3935
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003936 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003937 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003938 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003939 }
Craig Topper3164f332014-03-11 03:39:26 +00003940 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003941 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003942 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003943
Craig Topper3164f332014-03-11 03:39:26 +00003944 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003945 if (RegNo == 0) return 0;
3946 if (RegNo == 1) return 1;
3947 return -1;
3948 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003949
Craig Topper3164f332014-03-11 03:39:26 +00003950 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003951 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003952 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003953 CC == CC_IntelOclBicc ||
3954 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003955 }
3956
Craig Topper3164f332014-03-11 03:39:26 +00003957 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003958 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003959 }
3960
Pavel Chupinfd223e12014-08-04 12:39:43 +00003961 // for x32 we need it here explicitly
3962 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003963};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003964
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003965// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003966class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003967public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003968 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3969 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003970 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003971 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003972 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003973 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003974 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003975 SizeType = UnsignedLongLong;
3976 PtrDiffType = SignedLongLong;
3977 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003978 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003979 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003980
Craig Topper3164f332014-03-11 03:39:26 +00003981 void getTargetDefines(const LangOptions &Opts,
3982 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003983 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003984 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003985 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003986
Craig Topper3164f332014-03-11 03:39:26 +00003987 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003988 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003989 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003990
Craig Topper3164f332014-03-11 03:39:26 +00003991 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003992 switch (CC) {
3993 case CC_X86StdCall:
3994 case CC_X86ThisCall:
3995 case CC_X86FastCall:
3996 return CCCR_Ignore;
3997 case CC_C:
3998 case CC_X86VectorCall:
3999 case CC_IntelOclBicc:
4000 case CC_X86_64SysV:
4001 return CCCR_OK;
4002 default:
4003 return CCCR_Warning;
4004 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004005 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004006};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004007
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004008// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004009class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004010public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004011 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004012 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00004013 LongDoubleWidth = LongDoubleAlign = 64;
4014 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004015 }
Craig Topper3164f332014-03-11 03:39:26 +00004016 void getTargetDefines(const LangOptions &Opts,
4017 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004018 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4019 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004020 Builder.defineMacro("_M_X64", "100");
4021 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004022 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004023};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004024
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004025// x86-64 MinGW target
4026class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4027public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004028 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Yaron Keren480bc9f2015-08-20 21:51:46 +00004029 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00004030 void getTargetDefines(const LangOptions &Opts,
4031 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004032 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004033 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004034 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004035 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004036
4037 // GCC defines this macro when it is using __gxx_personality_seh0.
4038 if (!Opts.SjLjExceptions)
4039 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004040 }
4041};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004042
Yaron Kerend030d112015-07-22 17:38:19 +00004043// x86-64 Cygwin target
4044class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4045public:
4046 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4047 : X86_64TargetInfo(Triple) {
4048 TLSSupported = false;
4049 WCharType = UnsignedShort;
4050 }
4051 void getTargetDefines(const LangOptions &Opts,
4052 MacroBuilder &Builder) const override {
4053 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4054 Builder.defineMacro("__x86_64__");
4055 Builder.defineMacro("__CYGWIN__");
4056 Builder.defineMacro("__CYGWIN64__");
4057 addCygMingDefines(Opts, Builder);
4058 DefineStd(Builder, "unix", Opts);
4059 if (Opts.CPlusPlus)
4060 Builder.defineMacro("_GNU_SOURCE");
4061
4062 // GCC defines this macro when it is using __gxx_personality_seh0.
4063 if (!Opts.SjLjExceptions)
4064 Builder.defineMacro("__SEH__");
4065 }
4066};
4067
Eli Friedman2857ccb2009-07-01 03:36:11 +00004068class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4069public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004070 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4071 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004072 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004073 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4074 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004075 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004076 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004077 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004078 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004079
4080 bool handleTargetFeatures(std::vector<std::string> &Features,
4081 DiagnosticsEngine &Diags) override {
4082 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4083 Diags))
4084 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004085 // We now know the features we have: we can decide how to align vectors.
4086 MaxVectorAlign =
4087 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004088 return true;
4089 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004090};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004091
Eli Friedman245f2292009-07-05 22:31:18 +00004092class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4093public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004094 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4095 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004096 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004097 Int64Type = SignedLongLong;
4098 }
4099};
Eli Friedman245f2292009-07-05 22:31:18 +00004100
Eli Friedman9fa28852012-08-08 23:57:20 +00004101class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4102public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004103 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4104 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4105 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004106 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004107 }
4108};
Tim Northover9bb857a2013-01-31 12:13:10 +00004109
Eli Friedmanf05b7722008-08-20 07:44:10 +00004110class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004111 // Possible FPU choices.
4112 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004113 VFP2FPU = (1 << 0),
4114 VFP3FPU = (1 << 1),
4115 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004116 NeonFPU = (1 << 3),
4117 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004118 };
4119
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004120 // Possible HWDiv features.
4121 enum HWDivMode {
4122 HWDivThumb = (1 << 0),
4123 HWDivARM = (1 << 1)
4124 };
4125
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004126 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004127 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004128 }
4129
4130 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4131 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004132
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004133 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004134
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004135 StringRef CPUProfile;
4136 StringRef CPUAttr;
4137
Rafael Espindolaeb265472013-08-21 21:59:03 +00004138 enum {
4139 FP_Default,
4140 FP_VFP,
4141 FP_Neon
4142 } FPMath;
4143
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004144 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004145 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004146 unsigned ArchProfile;
4147 unsigned ArchVersion;
4148
Bernard Ogdenda13af32013-10-24 18:32:51 +00004149 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004150
Logan Chien57086ce2012-10-10 06:56:20 +00004151 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004152 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004153
4154 // Initialized via features.
4155 unsigned SoftFloat : 1;
4156 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004157
Bernard Ogden18b57012013-10-29 09:47:51 +00004158 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004159 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004160 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004161 unsigned Unaligned : 1;
4162
4163 enum {
4164 LDREX_B = (1 << 0), /// byte (8-bit)
4165 LDREX_H = (1 << 1), /// half (16-bit)
4166 LDREX_W = (1 << 2), /// word (32-bit)
4167 LDREX_D = (1 << 3), /// double (64-bit)
4168 };
4169
4170 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004171
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004172 // ACLE 6.5.1 Hardware floating point
4173 enum {
4174 HW_FP_HP = (1 << 1), /// half (16-bit)
4175 HW_FP_SP = (1 << 2), /// single (32-bit)
4176 HW_FP_DP = (1 << 3), /// double (64-bit)
4177 };
4178 uint32_t HW_FP;
4179
Chris Lattner5cc15e02010-03-03 19:03:45 +00004180 static const Builtin::Info BuiltinInfo[];
4181
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004182 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004183 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004184
4185 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004186 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004187
Renato Golin9ba39232015-02-27 16:35:48 +00004188 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4189 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4190 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004191 SizeType = UnsignedLong;
4192 else
4193 SizeType = UnsignedInt;
4194
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004195 switch (T.getOS()) {
4196 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004197 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004198 break;
4199 case llvm::Triple::Win32:
4200 WCharType = UnsignedShort;
4201 break;
4202 case llvm::Triple::Linux:
4203 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004204 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4205 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004206 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004207 }
4208
4209 UseBitFieldTypeAlignment = true;
4210
4211 ZeroLengthBitfieldBoundary = 0;
4212
Tim Northover147cd2f2014-10-14 22:12:21 +00004213 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4214 // so set preferred for small types to 32.
4215 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004216 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004217 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4218 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4219 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004220 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004221 DataLayoutString = "e"
4222 "-m:w"
4223 "-p:32:32"
4224 "-i64:64"
4225 "-v128:64:128"
4226 "-a:0:32"
4227 "-n32"
4228 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004229 } else if (T.isOSNaCl()) {
4230 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004231 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004232 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004233 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004234 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4235 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004236 }
4237
4238 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004239 }
4240
4241 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004242 const llvm::Triple &T = getTriple();
4243
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004244 IsAAPCS = false;
4245
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004246 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004247
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004248 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004249 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004250 SizeType = UnsignedInt;
4251 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004252 SizeType = UnsignedLong;
4253
4254 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4255 WCharType = SignedInt;
4256
4257 // Do not respect the alignment of bit-field types when laying out
4258 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4259 UseBitFieldTypeAlignment = false;
4260
4261 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4262 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4263 /// gcc.
4264 ZeroLengthBitfieldBoundary = 32;
4265
Tim Northover147cd2f2014-10-14 22:12:21 +00004266 if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004267 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004268 BigEndian
4269 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4270 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4271 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004272 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004273 BigEndian
4274 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4275 : "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 +00004276
4277 // FIXME: Override "preferred align" for double and long long.
4278 }
4279
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004280 void setArchInfo() {
4281 StringRef ArchName = getTriple().getArchName();
4282
Renato Goline84b0002015-10-08 16:43:26 +00004283 ArchISA = llvm::ARM::parseArchISA(ArchName);
4284 CPU = llvm::ARM::getDefaultCPU(ArchName);
4285 unsigned AK = llvm::ARM::parseArch(ArchName);
4286 if (AK != llvm::ARM::AK_INVALID)
4287 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004288 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004289 }
4290
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004291 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004292 StringRef SubArch;
4293
4294 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004295 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004296 SubArch = llvm::ARM::getSubArch(ArchKind);
4297 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4298 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004299
4300 // cache CPU related strings
4301 CPUAttr = getCPUAttr();
4302 CPUProfile = getCPUProfile();
4303 }
4304
4305 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004306 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004307 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004308 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004309 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4310 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004311 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004312 if (ArchProfile == llvm::ARM::PK_M) {
4313 MaxAtomicPromoteWidth = 32;
4314 if (ShouldUseInlineAtomic)
4315 MaxAtomicInlineWidth = 32;
4316 }
4317 else {
4318 MaxAtomicPromoteWidth = 64;
4319 if (ShouldUseInlineAtomic)
4320 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004321 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004322 }
4323
4324 bool isThumb() const {
4325 return (ArchISA == llvm::ARM::IK_THUMB);
4326 }
4327
4328 bool supportsThumb() const {
4329 return CPUAttr.count('T') || ArchVersion >= 6;
4330 }
4331
4332 bool supportsThumb2() const {
4333 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4334 }
4335
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004336 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004337 // For most sub-arches, the build attribute CPU name is enough.
4338 // For Cortex variants, it's slightly different.
4339 switch(ArchKind) {
4340 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004341 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004342 case llvm::ARM::AK_ARMV6M:
4343 case llvm::ARM::AK_ARMV6SM:
4344 case llvm::ARM::AK_ARMV6HL:
4345 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004346 case llvm::ARM::AK_ARMV7S:
4347 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004348 case llvm::ARM::AK_ARMV7:
4349 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004350 case llvm::ARM::AK_ARMV7L:
4351 case llvm::ARM::AK_ARMV7HL:
4352 return "7A";
4353 case llvm::ARM::AK_ARMV7R:
4354 return "7R";
4355 case llvm::ARM::AK_ARMV7M:
4356 return "7M";
4357 case llvm::ARM::AK_ARMV7EM:
4358 return "7EM";
4359 case llvm::ARM::AK_ARMV8A:
4360 return "8A";
4361 case llvm::ARM::AK_ARMV8_1A:
4362 return "8_1A";
4363 }
4364 }
4365
4366 StringRef getCPUProfile() const {
4367 switch(ArchProfile) {
4368 case llvm::ARM::PK_A:
4369 return "A";
4370 case llvm::ARM::PK_R:
4371 return "R";
4372 case llvm::ARM::PK_M:
4373 return "M";
4374 default:
4375 return "";
4376 }
4377 }
4378
Chris Lattner17df24e2008-04-21 18:56:49 +00004379public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004380 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004381 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004382 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004383 BigEndian = IsBigEndian;
4384
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004385 switch (getTriple().getOS()) {
4386 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004387 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004388 break;
4389 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004390 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004391 break;
4392 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004393
Renato Goline84b0002015-10-08 16:43:26 +00004394 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004395 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004396
Chris Lattner1a8f3942010-04-23 16:29:58 +00004397 // {} in inline assembly are neon specifiers, not assembly variant
4398 // specifiers.
4399 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004400
Eric Christopher0e261882014-12-05 01:06:59 +00004401 // FIXME: This duplicates code from the driver that sets the -target-abi
4402 // option - this code is used if -target-abi isn't passed and should
4403 // be unified in some way.
4404 if (Triple.isOSBinFormatMachO()) {
4405 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4406 // the frontend matches that.
4407 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4408 Triple.getOS() == llvm::Triple::UnknownOS ||
4409 StringRef(CPU).startswith("cortex-m")) {
4410 setABI("aapcs");
4411 } else {
4412 setABI("apcs-gnu");
4413 }
4414 } else if (Triple.isOSWindows()) {
4415 // FIXME: this is invalid for WindowsCE
4416 setABI("aapcs");
4417 } else {
4418 // Select the default based on the platform.
4419 switch (Triple.getEnvironment()) {
4420 case llvm::Triple::Android:
4421 case llvm::Triple::GNUEABI:
4422 case llvm::Triple::GNUEABIHF:
4423 setABI("aapcs-linux");
4424 break;
4425 case llvm::Triple::EABIHF:
4426 case llvm::Triple::EABI:
4427 setABI("aapcs");
4428 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004429 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004430 setABI("apcs-gnu");
4431 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004432 default:
4433 if (Triple.getOS() == llvm::Triple::NetBSD)
4434 setABI("apcs-gnu");
4435 else
4436 setABI("aapcs");
4437 break;
4438 }
4439 }
John McCall86353412010-08-21 22:46:04 +00004440
4441 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004442 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004443
Renato Golin15b86152015-07-03 16:41:13 +00004444 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004445 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004446
James Molloya7139222012-03-12 09:14:10 +00004447 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004448 // the alignment of the zero-length bitfield is greater than the member
4449 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004450 // zero length bitfield.
4451 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004452 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004453
Alp Toker4925ba72014-06-07 23:30:42 +00004454 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004455
Craig Topper3164f332014-03-11 03:39:26 +00004456 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004457 ABI = Name;
4458
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004459 // The defaults (above) are for AAPCS, check if we need to change them.
4460 //
4461 // FIXME: We need support for -meabi... we could just mangle it into the
4462 // name.
4463 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004464 setABIAPCS();
4465 return true;
4466 }
4467 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4468 setABIAAPCS();
4469 return true;
4470 }
4471 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004472 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004473
Renato Golinf5c4dec2015-05-27 13:33:00 +00004474 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004475 bool
4476 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4477 StringRef CPU,
4478 const std::vector<std::string> &FeaturesVec) const override {
4479
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004480 std::vector<const char*> TargetFeatures;
4481
4482 // get default FPU features
4483 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU);
4484 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4485
4486 // get default Extension features
4487 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU);
4488 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4489
4490 for (const char *Feature : TargetFeatures)
4491 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004492 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004493
Eric Christopher007b0a02015-08-28 22:32:01 +00004494 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004495 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004496
Craig Topper3164f332014-03-11 03:39:26 +00004497 bool handleTargetFeatures(std::vector<std::string> &Features,
4498 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004499 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004500 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004501 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004502 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004503 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004504 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004505 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004506
Ranjeet Singhac08e532015-06-24 23:39:25 +00004507 // This does not diagnose illegal cases like having both
4508 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4509 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004510 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004511 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004512 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004513 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004514 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004515 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004516 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004517 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004518 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004519 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004520 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004521 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004522 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004523 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004524 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004525 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004526 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004527 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004528 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004529 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004530 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004531 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004532 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004533 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004534 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004535 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004536 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004537 Crypto = 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004538 } else if (Feature == "+t2dsp") {
4539 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004540 } else if (Feature == "+fp-only-sp") {
Ranjeet Singhac08e532015-06-24 23:39:25 +00004541 HW_FP_remove |= HW_FP_DP | HW_FP_HP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004542 } else if (Feature == "+strict-align") {
4543 Unaligned = 0;
4544 } else if (Feature == "+fp16") {
4545 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004546 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004547 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004548 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004549
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004550 switch (ArchVersion) {
4551 case 6:
4552 if (ArchProfile == llvm::ARM::PK_M)
4553 LDREX = 0;
4554 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4555 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4556 else
4557 LDREX = LDREX_W;
4558 break;
4559 case 7:
4560 if (ArchProfile == llvm::ARM::PK_M)
4561 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4562 else
4563 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4564 break;
4565 case 8:
4566 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4567 }
4568
Rafael Espindolaeb265472013-08-21 21:59:03 +00004569 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4570 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4571 return false;
4572 }
4573
4574 if (FPMath == FP_Neon)
4575 Features.push_back("+neonfp");
4576 else if (FPMath == FP_VFP)
4577 Features.push_back("-neonfp");
4578
Daniel Dunbar893d4752009-12-19 04:15:38 +00004579 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004580 auto Feature =
4581 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4582 if (Feature != Features.end())
4583 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004584
Rafael Espindolaeb265472013-08-21 21:59:03 +00004585 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004586 }
4587
Craig Topper3164f332014-03-11 03:39:26 +00004588 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004589 return llvm::StringSwitch<bool>(Feature)
4590 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004591 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004592 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004593 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004594 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004595 .Case("hwdiv", HWDiv & HWDivThumb)
4596 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004597 .Default(false);
4598 }
Renato Golin15b86152015-07-03 16:41:13 +00004599
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004600 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004601 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004602 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004603
Renato Golin15b86152015-07-03 16:41:13 +00004604 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004605 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004606 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004607 CPU = Name;
4608 return true;
4609 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004610
Craig Topper3164f332014-03-11 03:39:26 +00004611 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004612
Craig Topper3164f332014-03-11 03:39:26 +00004613 void getTargetDefines(const LangOptions &Opts,
4614 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004615 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004616 Builder.defineMacro("__arm");
4617 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004618
Chris Lattnerecd49032009-03-02 22:27:17 +00004619 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004620 Builder.defineMacro("__REGISTER_PREFIX__", "");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004621 if (!CPUAttr.empty())
4622 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004623
4624 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004625 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004626 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004627
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004628 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004629 // ACLE 6.5.7 Crypto Extension
4630 if (Crypto)
4631 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4632 // ACLE 6.5.8 CRC32 Extension
4633 if (CRC)
4634 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4635 // ACLE 6.5.10 Numeric Maximum and Minimum
4636 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4637 // ACLE 6.5.9 Directed Rounding
4638 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004639 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004640
4641 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4642 // is not defined for the M-profile.
4643 // NOTE that the deffault profile is assumed to be 'A'
4644 if (CPUProfile.empty() || CPUProfile != "M")
4645 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4646
4647 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4648 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4649 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004650 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004651 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004652 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004653 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4654
4655 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4656 // instruction set such as ARM or Thumb.
4657 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4658
4659 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4660
4661 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004662 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004663 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004664
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004665 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004666 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004667 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004668
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004669 // ACLE 6.4.4 LDREX/STREX
4670 if (LDREX)
4671 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4672
4673 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004674 if (ArchVersion == 5 ||
4675 (ArchVersion == 6 && CPUProfile != "M") ||
4676 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004677 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4678
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004679 // ACLE 6.5.1 Hardware Floating Point
4680 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004681 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004682
Yi Konga44c4d72014-06-27 21:25:42 +00004683 // ACLE predefines.
4684 Builder.defineMacro("__ARM_ACLE", "200");
4685
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004686 // FP16 support (we currently only support IEEE format).
4687 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4688 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4689
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004690 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4691 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4692 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4693
Mike Stump9d54bd72009-04-08 02:07:04 +00004694 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004695
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004696 // FIXME: It's more complicated than this and we don't really support
4697 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004698 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004699 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004700 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004701
David Tweed8f676532012-10-25 13:33:01 +00004702 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004703 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004704 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4705 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004706 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004707 Builder.defineMacro("__ARM_PCS", "1");
4708
David Tweed8f676532012-10-25 13:33:01 +00004709 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004710 Builder.defineMacro("__ARM_PCS_VFP", "1");
4711 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004712
Daniel Dunbar893d4752009-12-19 04:15:38 +00004713 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004714 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004715
4716 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004717 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004718
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004719 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004720 Builder.defineMacro("__THUMBEL__");
4721 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004722 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004723 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004724 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004725
4726 // ACLE 6.4.9 32-bit SIMD instructions
4727 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4728 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4729
4730 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004731 if (((HWDiv & HWDivThumb) && isThumb()) ||
4732 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004733 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004734 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004735 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004736
4737 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004738 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004739
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004740 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004741 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004742 if (FPU & VFP2FPU)
4743 Builder.defineMacro("__ARM_VFPV2__");
4744 if (FPU & VFP3FPU)
4745 Builder.defineMacro("__ARM_VFPV3__");
4746 if (FPU & VFP4FPU)
4747 Builder.defineMacro("__ARM_VFPV4__");
4748 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004749
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004750 // This only gets set when Neon instructions are actually available, unlike
4751 // the VFP define, hence the soft float and arch check. This is subtly
4752 // different from gcc, we follow the intent which was that it should be set
4753 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004754 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004755 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004756 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004757 // current AArch32 NEON implementations do not support double-precision
4758 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004759 Builder.defineMacro("__ARM_NEON_FP",
4760 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004761 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004762
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004763 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4764 Opts.ShortWChar ? "2" : "4");
4765
4766 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4767 Opts.ShortEnums ? "1" : "4");
4768
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004769 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004770 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4771 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4772 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4773 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4774 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004775
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004776 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004777 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004778 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004779 }
4780
4781 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004782 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004783 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4784 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004785 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004786 }
4787
4788 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004789 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004790 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004791
4792 if (Opts.UnsafeFPMath)
4793 Builder.defineMacro("__ARM_FP_FAST", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004794 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004795
Craig Topper3164f332014-03-11 03:39:26 +00004796 void getTargetBuiltins(const Builtin::Info *&Records,
4797 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004798 Records = BuiltinInfo;
4799 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004800 }
Craig Topper3164f332014-03-11 03:39:26 +00004801 bool isCLZForZeroUndef() const override { return false; }
4802 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004803 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004804 }
Craig Topper3164f332014-03-11 03:39:26 +00004805 void getGCCRegNames(const char * const *&Names,
4806 unsigned &NumNames) const override;
4807 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4808 unsigned &NumAliases) const override;
4809 bool validateAsmConstraint(const char *&Name,
4810 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004811 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004812 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004813 case 'l': // r0-r7
4814 case 'h': // r8-r15
4815 case 'w': // VFP Floating point register single precision
4816 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004817 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004818 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004819 case 'I':
4820 case 'J':
4821 case 'K':
4822 case 'L':
4823 case 'M':
4824 // FIXME
4825 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004826 case 'Q': // A memory address that is a single base register.
4827 Info.setAllowsMemory();
4828 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004829 case 'U': // a memory reference...
4830 switch (Name[1]) {
4831 case 'q': // ...ARMV4 ldrsb
4832 case 'v': // ...VFP load/store (reg+constant offset)
4833 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004834 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004835 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004836 case 'n': // valid address for Neon doubleword vector load/store
4837 case 'm': // valid address for Neon element and structure load/store
4838 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004839 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004840 Info.setAllowsMemory();
4841 Name++;
4842 return true;
4843 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004844 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004845 return false;
4846 }
Craig Topper3164f332014-03-11 03:39:26 +00004847 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004848 std::string R;
4849 switch (*Constraint) {
4850 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004851 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004852 Constraint++;
4853 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004854 case 'p': // 'p' should be translated to 'r' by default.
4855 R = std::string("r");
4856 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004857 default:
4858 return std::string(1, *Constraint);
4859 }
4860 return R;
4861 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004862 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004863 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004864 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004865 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004866 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004867
Bill Wendling9d1ee112012-10-25 23:28:48 +00004868 // Strip off constraint modifiers.
4869 while (Constraint[0] == '=' ||
4870 Constraint[0] == '+' ||
4871 Constraint[0] == '&')
4872 Constraint = Constraint.substr(1);
4873
4874 switch (Constraint[0]) {
4875 default: break;
4876 case 'r': {
4877 switch (Modifier) {
4878 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004879 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004880 case 'q':
4881 // A register of size 32 cannot fit a vector type.
4882 return false;
4883 }
4884 }
4885 }
4886
4887 return true;
4888 }
Craig Topper3164f332014-03-11 03:39:26 +00004889 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004890 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004891 return "";
4892 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004893
Craig Topper3164f332014-03-11 03:39:26 +00004894 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004895 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4896 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004897
Craig Topper3164f332014-03-11 03:39:26 +00004898 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004899 if (RegNo == 0) return 0;
4900 if (RegNo == 1) return 1;
4901 return -1;
4902 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004903
4904 bool hasSjLjLowering() const override {
4905 return true;
4906 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004907};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004908
Rafael Espindolaeb265472013-08-21 21:59:03 +00004909bool ARMTargetInfo::setFPMath(StringRef Name) {
4910 if (Name == "neon") {
4911 FPMath = FP_Neon;
4912 return true;
4913 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4914 Name == "vfp4") {
4915 FPMath = FP_VFP;
4916 return true;
4917 }
4918 return false;
4919}
4920
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004921const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004922 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004923 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004924 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4925
4926 // Float registers
4927 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4928 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4929 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004930 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004931
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004932 // Double registers
4933 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4934 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004935 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4936 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004937
4938 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004939 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4940 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004941};
4942
4943void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004944 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004945 Names = GCCRegNames;
4946 NumNames = llvm::array_lengthof(GCCRegNames);
4947}
4948
4949const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004950 { { "a1" }, "r0" },
4951 { { "a2" }, "r1" },
4952 { { "a3" }, "r2" },
4953 { { "a4" }, "r3" },
4954 { { "v1" }, "r4" },
4955 { { "v2" }, "r5" },
4956 { { "v3" }, "r6" },
4957 { { "v4" }, "r7" },
4958 { { "v5" }, "r8" },
4959 { { "v6", "rfp" }, "r9" },
4960 { { "sl" }, "r10" },
4961 { { "fp" }, "r11" },
4962 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004963 { { "r13" }, "sp" },
4964 { { "r14" }, "lr" },
4965 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004966 // The S, D and Q registers overlap, but aren't really aliases; we
4967 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004968};
4969
4970void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4971 unsigned &NumAliases) const {
4972 Aliases = GCCRegAliases;
4973 NumAliases = llvm::array_lengthof(GCCRegAliases);
4974}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004975
4976const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00004977#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004978 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004979#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4980 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00004981#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004982
Craig Topper07d3b622015-08-07 05:14:44 +00004983#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004984 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004985#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004986 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004987#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4988 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004989#include "clang/Basic/BuiltinsARM.def"
4990};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004991
4992class ARMleTargetInfo : public ARMTargetInfo {
4993public:
4994 ARMleTargetInfo(const llvm::Triple &Triple)
4995 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004996 void getTargetDefines(const LangOptions &Opts,
4997 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004998 Builder.defineMacro("__ARMEL__");
4999 ARMTargetInfo::getTargetDefines(Opts, Builder);
5000 }
5001};
5002
5003class ARMbeTargetInfo : public ARMTargetInfo {
5004public:
5005 ARMbeTargetInfo(const llvm::Triple &Triple)
5006 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005007 void getTargetDefines(const LangOptions &Opts,
5008 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005009 Builder.defineMacro("__ARMEB__");
5010 Builder.defineMacro("__ARM_BIG_ENDIAN");
5011 ARMTargetInfo::getTargetDefines(Opts, Builder);
5012 }
5013};
Chris Lattner17df24e2008-04-21 18:56:49 +00005014
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005015class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5016 const llvm::Triple Triple;
5017public:
5018 WindowsARMTargetInfo(const llvm::Triple &Triple)
5019 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
5020 TLSSupported = false;
5021 WCharType = UnsignedShort;
5022 SizeType = UnsignedInt;
5023 UserLabelPrefix = "";
5024 }
5025 void getVisualStudioDefines(const LangOptions &Opts,
5026 MacroBuilder &Builder) const {
5027 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5028
5029 // FIXME: this is invalid for WindowsCE
5030 Builder.defineMacro("_M_ARM_NT", "1");
5031 Builder.defineMacro("_M_ARMT", "_M_ARM");
5032 Builder.defineMacro("_M_THUMB", "_M_ARM");
5033
5034 assert((Triple.getArch() == llvm::Triple::arm ||
5035 Triple.getArch() == llvm::Triple::thumb) &&
5036 "invalid architecture for Windows ARM target info");
5037 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5038 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5039
5040 // TODO map the complete set of values
5041 // 31: VFPv3 40: VFPv4
5042 Builder.defineMacro("_M_ARM_FP", "31");
5043 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005044 BuiltinVaListKind getBuiltinVaListKind() const override {
5045 return TargetInfo::CharPtrBuiltinVaList;
5046 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005047 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5048 switch (CC) {
5049 case CC_X86StdCall:
5050 case CC_X86ThisCall:
5051 case CC_X86FastCall:
5052 case CC_X86VectorCall:
5053 return CCCR_Ignore;
5054 case CC_C:
5055 return CCCR_OK;
5056 default:
5057 return CCCR_Warning;
5058 }
5059 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005060};
5061
5062// Windows ARM + Itanium C++ ABI Target
5063class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5064public:
5065 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5066 : WindowsARMTargetInfo(Triple) {
5067 TheCXXABI.set(TargetCXXABI::GenericARM);
5068 }
5069
5070 void getTargetDefines(const LangOptions &Opts,
5071 MacroBuilder &Builder) const override {
5072 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5073
5074 if (Opts.MSVCCompat)
5075 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5076 }
5077};
5078
5079// Windows ARM, MS (C++) ABI
5080class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5081public:
5082 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5083 : WindowsARMTargetInfo(Triple) {
5084 TheCXXABI.set(TargetCXXABI::Microsoft);
5085 }
5086
5087 void getTargetDefines(const LangOptions &Opts,
5088 MacroBuilder &Builder) const override {
5089 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5090 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5091 }
5092};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005093
Yaron Keren321249c2015-07-15 13:32:23 +00005094// ARM MinGW target
5095class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5096public:
5097 MinGWARMTargetInfo(const llvm::Triple &Triple)
5098 : WindowsARMTargetInfo(Triple) {
5099 TheCXXABI.set(TargetCXXABI::GenericARM);
5100 }
5101
5102 void getTargetDefines(const LangOptions &Opts,
5103 MacroBuilder &Builder) const override {
5104 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5105 DefineStd(Builder, "WIN32", Opts);
5106 DefineStd(Builder, "WINNT", Opts);
5107 Builder.defineMacro("_ARM_");
5108 addMinGWDefines(Opts, Builder);
5109 }
5110};
5111
5112// ARM Cygwin target
5113class CygwinARMTargetInfo : public ARMleTargetInfo {
5114public:
5115 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5116 TLSSupported = false;
5117 WCharType = UnsignedShort;
5118 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005119 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005120 }
5121 void getTargetDefines(const LangOptions &Opts,
5122 MacroBuilder &Builder) const override {
5123 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5124 Builder.defineMacro("_ARM_");
5125 Builder.defineMacro("__CYGWIN__");
5126 Builder.defineMacro("__CYGWIN32__");
5127 DefineStd(Builder, "unix", Opts);
5128 if (Opts.CPlusPlus)
5129 Builder.defineMacro("_GNU_SOURCE");
5130 }
5131};
5132
Mike Stump11289f42009-09-09 15:08:12 +00005133class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005134 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005135protected:
Craig Topper3164f332014-03-11 03:39:26 +00005136 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5137 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005138 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005139 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005140
Torok Edwinb2b37c62009-06-30 17:10:35 +00005141public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005142 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005143 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005144 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005145 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005146 // FIXME: This should be based off of the target features in
5147 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005148 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005149
5150 // Darwin on iOS uses a variant of the ARM C++ ABI.
5151 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005152 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005153};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005154
Tim Northover573cbee2014-05-24 12:52:07 +00005155class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005156 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005157 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5158 static const char *const GCCRegNames[];
5159
James Molloy75f5f9e2014-04-16 15:33:48 +00005160 enum FPUModeEnum {
5161 FPUMode,
5162 NeonMode
5163 };
5164
5165 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005166 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005167 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005168 unsigned Unaligned;
James Molloy75f5f9e2014-04-16 15:33:48 +00005169
Tim Northovera2ee4332014-03-29 15:09:45 +00005170 static const Builtin::Info BuiltinInfo[];
5171
5172 std::string ABI;
5173
5174public:
Tim Northover573cbee2014-05-24 12:52:07 +00005175 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005176 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005177
5178 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5179 WCharType = SignedInt;
5180
5181 // NetBSD apparently prefers consistency across ARM targets to consistency
5182 // across 64-bit targets.
5183 Int64Type = SignedLongLong;
5184 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005185 } else {
5186 WCharType = UnsignedInt;
5187 Int64Type = SignedLong;
5188 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005189 }
5190
Tim Northovera2ee4332014-03-29 15:09:45 +00005191 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005192 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005193 MaxAtomicInlineWidth = 128;
5194 MaxAtomicPromoteWidth = 128;
5195
Tim Northovera6a19f12015-02-06 01:25:07 +00005196 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005197 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5198
Tim Northovera2ee4332014-03-29 15:09:45 +00005199 // {} in inline assembly are neon specifiers, not assembly variant
5200 // specifiers.
5201 NoAsmVariants = true;
5202
Tim Northover7ad87af2015-01-16 18:44:04 +00005203 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5204 // contributes to the alignment of the containing aggregate in the same way
5205 // a plain (non bit-field) member of that type would, without exception for
5206 // zero-sized or anonymous bit-fields."
5207 UseBitFieldTypeAlignment = true;
5208 UseZeroLengthBitfieldAlignment = true;
5209
Tim Northover573cbee2014-05-24 12:52:07 +00005210 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005211 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5212 }
5213
Alp Toker4925ba72014-06-07 23:30:42 +00005214 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005215 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005216 if (Name != "aapcs" && Name != "darwinpcs")
5217 return false;
5218
5219 ABI = Name;
5220 return true;
5221 }
5222
David Blaikie1cbb9712014-11-14 19:09:44 +00005223 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005224 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005225 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005226 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005227 .Case("cyclone", true)
5228 .Default(false);
5229 return CPUKnown;
5230 }
5231
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005232 void getTargetDefines(const LangOptions &Opts,
5233 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005234 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005235 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005236
5237 // Target properties.
5238 Builder.defineMacro("_LP64");
5239 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005240
5241 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5242 Builder.defineMacro("__ARM_ACLE", "200");
5243 Builder.defineMacro("__ARM_ARCH", "8");
5244 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5245
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005246 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005247 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005248 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005249
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005250 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5251 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5252 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5253 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005254 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005255 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5256 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005257
5258 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5259
5260 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005261 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005262
5263 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5264 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005265 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5266 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005267
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005268 if (Opts.UnsafeFPMath)
5269 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005270
5271 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5272
5273 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5274 Opts.ShortEnums ? "1" : "4");
5275
James Molloy75f5f9e2014-04-16 15:33:48 +00005276 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005277 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005278 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005279 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005280 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005281
Bradley Smith418c5932014-05-02 15:17:51 +00005282 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005283 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005284
James Molloy75f5f9e2014-04-16 15:33:48 +00005285 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005286 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5287
5288 if (Unaligned)
5289 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005290
5291 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5292 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5293 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5294 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5295 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005296 }
5297
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005298 void getTargetBuiltins(const Builtin::Info *&Records,
5299 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005300 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00005301 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00005302 }
5303
David Blaikie1cbb9712014-11-14 19:09:44 +00005304 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005305 return Feature == "aarch64" ||
5306 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005307 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005308 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005309 }
5310
James Molloy5e73df52014-04-16 15:06:20 +00005311 bool handleTargetFeatures(std::vector<std::string> &Features,
5312 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005313 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005314 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005315 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005316 Unaligned = 1;
5317
Eric Christopher610fe112015-08-26 08:21:55 +00005318 for (const auto &Feature : Features) {
5319 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005320 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005321 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005322 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005323 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005324 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005325 if (Feature == "+strict-align")
5326 Unaligned = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005327 }
5328
Eric Christopher964a5f32015-08-05 23:48:05 +00005329 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005330
5331 return true;
5332 }
5333
David Blaikie1cbb9712014-11-14 19:09:44 +00005334 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005335
David Blaikie1cbb9712014-11-14 19:09:44 +00005336 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005337 return TargetInfo::AArch64ABIBuiltinVaList;
5338 }
5339
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005340 void getGCCRegNames(const char *const *&Names,
5341 unsigned &NumNames) const override;
5342 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5343 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005344
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005345 bool validateAsmConstraint(const char *&Name,
5346 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005347 switch (*Name) {
5348 default:
5349 return false;
5350 case 'w': // Floating point and SIMD registers (V0-V31)
5351 Info.setAllowsRegister();
5352 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005353 case 'I': // Constant that can be used with an ADD instruction
5354 case 'J': // Constant that can be used with a SUB instruction
5355 case 'K': // Constant that can be used with a 32-bit logical instruction
5356 case 'L': // Constant that can be used with a 64-bit logical instruction
5357 case 'M': // Constant that can be used as a 32-bit MOV immediate
5358 case 'N': // Constant that can be used as a 64-bit MOV immediate
5359 case 'Y': // Floating point constant zero
5360 case 'Z': // Integer constant zero
5361 return true;
5362 case 'Q': // A memory reference with base register and no offset
5363 Info.setAllowsMemory();
5364 return true;
5365 case 'S': // A symbolic address
5366 Info.setAllowsRegister();
5367 return true;
5368 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005369 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5370 // Utf: A memory address suitable for ldp/stp in TF mode.
5371 // Usa: An absolute symbolic address.
5372 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5373 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005374 case 'z': // Zero register, wzr or xzr
5375 Info.setAllowsRegister();
5376 return true;
5377 case 'x': // Floating point and SIMD registers (V0-V15)
5378 Info.setAllowsRegister();
5379 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005380 }
5381 return false;
5382 }
5383
Akira Hatanaka987f1862014-08-22 06:05:21 +00005384 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005385 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005386 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005387 // Strip off constraint modifiers.
5388 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5389 Constraint = Constraint.substr(1);
5390
5391 switch (Constraint[0]) {
5392 default:
5393 return true;
5394 case 'z':
5395 case 'r': {
5396 switch (Modifier) {
5397 case 'x':
5398 case 'w':
5399 // For now assume that the person knows what they're
5400 // doing with the modifier.
5401 return true;
5402 default:
5403 // By default an 'r' constraint will be in the 'x'
5404 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005405 if (Size == 64)
5406 return true;
5407
5408 SuggestedModifier = "w";
5409 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005410 }
5411 }
5412 }
5413 }
5414
David Blaikie1cbb9712014-11-14 19:09:44 +00005415 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005416
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005417 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005418 if (RegNo == 0)
5419 return 0;
5420 if (RegNo == 1)
5421 return 1;
5422 return -1;
5423 }
5424};
5425
Tim Northover573cbee2014-05-24 12:52:07 +00005426const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005427 // 32-bit Integer registers
5428 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5429 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5430 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5431
5432 // 64-bit Integer registers
5433 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5434 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5435 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5436
5437 // 32-bit floating point regsisters
5438 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5439 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5440 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5441
5442 // 64-bit floating point regsisters
5443 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5444 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5445 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5446
5447 // Vector registers
5448 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5449 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5450 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5451};
5452
Tim Northover573cbee2014-05-24 12:52:07 +00005453void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005454 unsigned &NumNames) const {
5455 Names = GCCRegNames;
5456 NumNames = llvm::array_lengthof(GCCRegNames);
5457}
5458
Tim Northover573cbee2014-05-24 12:52:07 +00005459const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005460 { { "w31" }, "wsp" },
5461 { { "x29" }, "fp" },
5462 { { "x30" }, "lr" },
5463 { { "x31" }, "sp" },
5464 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5465 // don't want to substitute one of these for a different-sized one.
5466};
5467
Tim Northover573cbee2014-05-24 12:52:07 +00005468void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005469 unsigned &NumAliases) const {
5470 Aliases = GCCRegAliases;
5471 NumAliases = llvm::array_lengthof(GCCRegAliases);
5472}
5473
Tim Northover573cbee2014-05-24 12:52:07 +00005474const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005475#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005476 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005477#include "clang/Basic/BuiltinsNEON.def"
5478
5479#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005480 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005481#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005482};
James Molloy5e73df52014-04-16 15:06:20 +00005483
Tim Northover573cbee2014-05-24 12:52:07 +00005484class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005485 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005486 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005487 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005488 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005489 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005490 }
5491
5492public:
Tim Northover573cbee2014-05-24 12:52:07 +00005493 AArch64leTargetInfo(const llvm::Triple &Triple)
5494 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005495 BigEndian = false;
5496 }
5497 void getTargetDefines(const LangOptions &Opts,
5498 MacroBuilder &Builder) const override {
5499 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005500 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005501 }
5502};
5503
Tim Northover573cbee2014-05-24 12:52:07 +00005504class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005505 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005506 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005507 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005508 }
5509
5510public:
Tim Northover573cbee2014-05-24 12:52:07 +00005511 AArch64beTargetInfo(const llvm::Triple &Triple)
5512 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005513 void getTargetDefines(const LangOptions &Opts,
5514 MacroBuilder &Builder) const override {
5515 Builder.defineMacro("__AARCH64EB__");
5516 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5517 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005518 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005519 }
5520};
Tim Northovera2ee4332014-03-29 15:09:45 +00005521
Tim Northover573cbee2014-05-24 12:52:07 +00005522class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005523protected:
5524 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5525 MacroBuilder &Builder) const override {
5526 Builder.defineMacro("__AARCH64_SIMD__");
5527 Builder.defineMacro("__ARM64_ARCH_8__");
5528 Builder.defineMacro("__ARM_NEON__");
5529 Builder.defineMacro("__LITTLE_ENDIAN__");
5530 Builder.defineMacro("__REGISTER_PREFIX__", "");
5531 Builder.defineMacro("__arm64", "1");
5532 Builder.defineMacro("__arm64__", "1");
5533
5534 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5535 }
5536
Tim Northovera2ee4332014-03-29 15:09:45 +00005537public:
Tim Northover573cbee2014-05-24 12:52:07 +00005538 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5539 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005540 Int64Type = SignedLongLong;
5541 WCharType = SignedInt;
5542 UseSignedCharForObjCBool = false;
5543
Tim Northovera6a19f12015-02-06 01:25:07 +00005544 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005545 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5546
5547 TheCXXABI.set(TargetCXXABI::iOS64);
5548 }
5549
David Blaikie1cbb9712014-11-14 19:09:44 +00005550 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005551 return TargetInfo::CharPtrBuiltinVaList;
5552 }
5553};
Tim Northovera2ee4332014-03-29 15:09:45 +00005554
Tony Linthicum76329bf2011-12-12 21:14:55 +00005555// Hexagon abstract base class
5556class HexagonTargetInfo : public TargetInfo {
5557 static const Builtin::Info BuiltinInfo[];
5558 static const char * const GCCRegNames[];
5559 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5560 std::string CPU;
5561public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005562 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005563 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00005564 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005565
5566 // {} in inline assembly are packet specifiers, not assembly variant
5567 // specifiers.
5568 NoAsmVariants = true;
5569 }
5570
Craig Topper3164f332014-03-11 03:39:26 +00005571 void getTargetBuiltins(const Builtin::Info *&Records,
5572 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005573 Records = BuiltinInfo;
5574 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5575 }
5576
Craig Topper3164f332014-03-11 03:39:26 +00005577 bool validateAsmConstraint(const char *&Name,
5578 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005579 return true;
5580 }
5581
Craig Topper3164f332014-03-11 03:39:26 +00005582 void getTargetDefines(const LangOptions &Opts,
5583 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005584
Craig Topper3164f332014-03-11 03:39:26 +00005585 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005586 return Feature == "hexagon";
5587 }
Craig Topper3164f332014-03-11 03:39:26 +00005588
5589 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005590 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005591 }
Craig Topper3164f332014-03-11 03:39:26 +00005592 void getGCCRegNames(const char * const *&Names,
5593 unsigned &NumNames) const override;
5594 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5595 unsigned &NumAliases) const override;
5596 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005597 return "";
5598 }
Sebastian Pop86500282012-01-13 20:37:10 +00005599
5600 static const char *getHexagonCPUSuffix(StringRef Name) {
5601 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005602 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005603 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005604 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005605 }
5606
Craig Topper3164f332014-03-11 03:39:26 +00005607 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005608 if (!getHexagonCPUSuffix(Name))
5609 return false;
5610
Tony Linthicum76329bf2011-12-12 21:14:55 +00005611 CPU = Name;
5612 return true;
5613 }
5614};
5615
5616void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5617 MacroBuilder &Builder) const {
5618 Builder.defineMacro("qdsp6");
5619 Builder.defineMacro("__qdsp6", "1");
5620 Builder.defineMacro("__qdsp6__", "1");
5621
5622 Builder.defineMacro("hexagon");
5623 Builder.defineMacro("__hexagon", "1");
5624 Builder.defineMacro("__hexagon__", "1");
5625
5626 if(CPU == "hexagonv1") {
5627 Builder.defineMacro("__HEXAGON_V1__");
5628 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5629 if(Opts.HexagonQdsp6Compat) {
5630 Builder.defineMacro("__QDSP6_V1__");
5631 Builder.defineMacro("__QDSP6_ARCH__", "1");
5632 }
5633 }
5634 else if(CPU == "hexagonv2") {
5635 Builder.defineMacro("__HEXAGON_V2__");
5636 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5637 if(Opts.HexagonQdsp6Compat) {
5638 Builder.defineMacro("__QDSP6_V2__");
5639 Builder.defineMacro("__QDSP6_ARCH__", "2");
5640 }
5641 }
5642 else if(CPU == "hexagonv3") {
5643 Builder.defineMacro("__HEXAGON_V3__");
5644 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5645 if(Opts.HexagonQdsp6Compat) {
5646 Builder.defineMacro("__QDSP6_V3__");
5647 Builder.defineMacro("__QDSP6_ARCH__", "3");
5648 }
5649 }
5650 else if(CPU == "hexagonv4") {
5651 Builder.defineMacro("__HEXAGON_V4__");
5652 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5653 if(Opts.HexagonQdsp6Compat) {
5654 Builder.defineMacro("__QDSP6_V4__");
5655 Builder.defineMacro("__QDSP6_ARCH__", "4");
5656 }
5657 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005658 else if(CPU == "hexagonv5") {
5659 Builder.defineMacro("__HEXAGON_V5__");
5660 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5661 if(Opts.HexagonQdsp6Compat) {
5662 Builder.defineMacro("__QDSP6_V5__");
5663 Builder.defineMacro("__QDSP6_ARCH__", "5");
5664 }
5665 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005666}
5667
5668const char * const HexagonTargetInfo::GCCRegNames[] = {
5669 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5670 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5671 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5672 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5673 "p0", "p1", "p2", "p3",
5674 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5675};
5676
5677void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5678 unsigned &NumNames) const {
5679 Names = GCCRegNames;
5680 NumNames = llvm::array_lengthof(GCCRegNames);
5681}
5682
5683
5684const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5685 { { "sp" }, "r29" },
5686 { { "fp" }, "r30" },
5687 { { "lr" }, "r31" },
5688 };
5689
5690void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5691 unsigned &NumAliases) const {
5692 Aliases = GCCRegAliases;
5693 NumAliases = llvm::array_lengthof(GCCRegAliases);
5694}
5695
5696
5697const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005698#define BUILTIN(ID, TYPE, ATTRS) \
5699 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5700#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5701 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005702#include "clang/Basic/BuiltinsHexagon.def"
5703};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005704
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005705// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5706class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005707 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5708 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005709 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005710public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005711 SparcTargetInfo(const llvm::Triple &Triple)
5712 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005713
Craig Topper3164f332014-03-11 03:39:26 +00005714 bool handleTargetFeatures(std::vector<std::string> &Features,
5715 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005716 // The backend doesn't actually handle soft float yet, but in case someone
5717 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005718 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5719 if (Feature != Features.end()) {
5720 SoftFloat = true;
5721 Features.erase(Feature);
5722 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005723 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005724 }
Craig Topper3164f332014-03-11 03:39:26 +00005725 void getTargetDefines(const LangOptions &Opts,
5726 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005727 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005728 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005729
5730 if (SoftFloat)
5731 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005732 }
Craig Topper3164f332014-03-11 03:39:26 +00005733
5734 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005735 return llvm::StringSwitch<bool>(Feature)
5736 .Case("softfloat", SoftFloat)
5737 .Case("sparc", true)
5738 .Default(false);
5739 }
Craig Topper3164f332014-03-11 03:39:26 +00005740
5741 void getTargetBuiltins(const Builtin::Info *&Records,
5742 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005743 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005744 }
Craig Topper3164f332014-03-11 03:39:26 +00005745 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005746 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005747 }
Craig Topper3164f332014-03-11 03:39:26 +00005748 void getGCCRegNames(const char * const *&Names,
5749 unsigned &NumNames) const override;
5750 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5751 unsigned &NumAliases) const override;
5752 bool validateAsmConstraint(const char *&Name,
5753 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005754 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005755 switch (*Name) {
5756 case 'I': // Signed 13-bit constant
5757 case 'J': // Zero
5758 case 'K': // 32-bit constant with the low 12 bits clear
5759 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5760 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5761 case 'N': // Same as 'K' but zext (required for SIMode)
5762 case 'O': // The constant 4096
5763 return true;
5764 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005765 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005766 }
Craig Topper3164f332014-03-11 03:39:26 +00005767 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005768 // FIXME: Implement!
5769 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005770 }
5771};
5772
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005773const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005774 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5775 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5776 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5777 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5778};
5779
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005780void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5781 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005782 Names = GCCRegNames;
5783 NumNames = llvm::array_lengthof(GCCRegNames);
5784}
5785
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005786const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005787 { { "g0" }, "r0" },
5788 { { "g1" }, "r1" },
5789 { { "g2" }, "r2" },
5790 { { "g3" }, "r3" },
5791 { { "g4" }, "r4" },
5792 { { "g5" }, "r5" },
5793 { { "g6" }, "r6" },
5794 { { "g7" }, "r7" },
5795 { { "o0" }, "r8" },
5796 { { "o1" }, "r9" },
5797 { { "o2" }, "r10" },
5798 { { "o3" }, "r11" },
5799 { { "o4" }, "r12" },
5800 { { "o5" }, "r13" },
5801 { { "o6", "sp" }, "r14" },
5802 { { "o7" }, "r15" },
5803 { { "l0" }, "r16" },
5804 { { "l1" }, "r17" },
5805 { { "l2" }, "r18" },
5806 { { "l3" }, "r19" },
5807 { { "l4" }, "r20" },
5808 { { "l5" }, "r21" },
5809 { { "l6" }, "r22" },
5810 { { "l7" }, "r23" },
5811 { { "i0" }, "r24" },
5812 { { "i1" }, "r25" },
5813 { { "i2" }, "r26" },
5814 { { "i3" }, "r27" },
5815 { { "i4" }, "r28" },
5816 { { "i5" }, "r29" },
5817 { { "i6", "fp" }, "r30" },
5818 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005819};
5820
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005821void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5822 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005823 Aliases = GCCRegAliases;
5824 NumAliases = llvm::array_lengthof(GCCRegAliases);
5825}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005826
5827// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5828class SparcV8TargetInfo : public SparcTargetInfo {
5829public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005830 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005831 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00005832 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
5833 switch (getTriple().getOS()) {
5834 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00005835 SizeType = UnsignedInt;
5836 IntPtrType = SignedInt;
5837 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00005838 break;
5839 case llvm::Triple::NetBSD:
5840 case llvm::Triple::OpenBSD:
5841 SizeType = UnsignedLong;
5842 IntPtrType = SignedLong;
5843 PtrDiffType = SignedLong;
5844 break;
Brad Smith56495d52015-08-13 22:00:53 +00005845 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005846 }
5847
Craig Topper3164f332014-03-11 03:39:26 +00005848 void getTargetDefines(const LangOptions &Opts,
5849 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005850 SparcTargetInfo::getTargetDefines(Opts, Builder);
5851 Builder.defineMacro("__sparcv8");
5852 }
5853};
5854
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005855// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5856class SparcV8elTargetInfo : public SparcV8TargetInfo {
5857 public:
5858 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005859 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005860 BigEndian = false;
5861 }
5862};
5863
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005864// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5865class SparcV9TargetInfo : public SparcTargetInfo {
5866public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005867 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005868 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00005869 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005870 // This is an LP64 platform.
5871 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005872
5873 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005874 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005875 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005876 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005877 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005878 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005879
5880 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5881 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5882 LongDoubleWidth = 128;
5883 LongDoubleAlign = 128;
5884 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005885 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005886 }
5887
Craig Topper3164f332014-03-11 03:39:26 +00005888 void getTargetDefines(const LangOptions &Opts,
5889 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005890 SparcTargetInfo::getTargetDefines(Opts, Builder);
5891 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005892 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005893 // Solaris doesn't need these variants, but the BSDs do.
5894 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005895 Builder.defineMacro("__sparc64__");
5896 Builder.defineMacro("__sparc_v9__");
5897 Builder.defineMacro("__sparcv9__");
5898 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005899 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005900
Craig Topper3164f332014-03-11 03:39:26 +00005901 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005902 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5903 .Case("v9", true)
5904 .Case("ultrasparc", true)
5905 .Case("ultrasparc3", true)
5906 .Case("niagara", true)
5907 .Case("niagara2", true)
5908 .Case("niagara3", true)
5909 .Case("niagara4", true)
5910 .Default(false);
5911
5912 // No need to store the CPU yet. There aren't any CPU-specific
5913 // macros to define.
5914 return CPUKnown;
5915 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005916};
5917
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005918class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005919 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005920 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005921 std::string CPU;
5922 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005923 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005924
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005925public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005926 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00005927 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
5928 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005929 IntMaxType = SignedLong;
5930 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005931 TLSSupported = true;
5932 IntWidth = IntAlign = 32;
5933 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5934 PointerWidth = PointerAlign = 64;
5935 LongDoubleWidth = 128;
5936 LongDoubleAlign = 64;
5937 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005938 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005939 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00005940 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 +00005941 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5942 }
5943 void getTargetDefines(const LangOptions &Opts,
5944 MacroBuilder &Builder) const override {
5945 Builder.defineMacro("__s390__");
5946 Builder.defineMacro("__s390x__");
5947 Builder.defineMacro("__zarch__");
5948 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005949 if (HasTransactionalExecution)
5950 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005951 if (Opts.ZVector)
5952 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005953 }
5954 void getTargetBuiltins(const Builtin::Info *&Records,
5955 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005956 Records = BuiltinInfo;
5957 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005958 }
5959
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005960 void getGCCRegNames(const char *const *&Names,
5961 unsigned &NumNames) const override;
5962 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5963 unsigned &NumAliases) const override {
5964 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005965 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005966 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005967 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005968 bool validateAsmConstraint(const char *&Name,
5969 TargetInfo::ConstraintInfo &info) const override;
5970 const char *getClobbers() const override {
5971 // FIXME: Is this really right?
5972 return "";
5973 }
5974 BuiltinVaListKind getBuiltinVaListKind() const override {
5975 return TargetInfo::SystemZBuiltinVaList;
5976 }
5977 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005978 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005979 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5980 .Case("z10", true)
5981 .Case("z196", true)
5982 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005983 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005984 .Default(false);
5985
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005986 return CPUKnown;
5987 }
Eric Christopher8c47b422015-10-09 18:39:55 +00005988 bool
5989 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5990 StringRef CPU,
5991 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005992 if (CPU == "zEC12")
5993 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005994 if (CPU == "z13") {
5995 Features["transactional-execution"] = true;
5996 Features["vector"] = true;
5997 }
Eric Christopher007b0a02015-08-28 22:32:01 +00005998 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005999 }
6000
6001 bool handleTargetFeatures(std::vector<std::string> &Features,
6002 DiagnosticsEngine &Diags) override {
6003 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006004 for (const auto &Feature : Features) {
6005 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006006 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006007 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006008 HasVector = true;
6009 }
6010 // If we use the vector ABI, vector types are 64-bit aligned.
6011 if (HasVector) {
6012 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006013 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6014 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006015 }
6016 return true;
6017 }
6018
6019 bool hasFeature(StringRef Feature) const override {
6020 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006021 .Case("systemz", true)
6022 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006023 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006024 .Default(false);
6025 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006026
6027 StringRef getABI() const override {
6028 if (HasVector)
6029 return "vector";
6030 return "";
6031 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006032
6033 bool useFloat128ManglingForLongDouble() const override {
6034 return true;
6035 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006036};
6037
6038const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6039#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006040 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006041#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006042};
6043
6044const char *const SystemZTargetInfo::GCCRegNames[] = {
6045 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6046 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6047 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6048 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6049};
6050
6051void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
6052 unsigned &NumNames) const {
6053 Names = GCCRegNames;
6054 NumNames = llvm::array_lengthof(GCCRegNames);
6055}
6056
6057bool SystemZTargetInfo::
6058validateAsmConstraint(const char *&Name,
6059 TargetInfo::ConstraintInfo &Info) const {
6060 switch (*Name) {
6061 default:
6062 return false;
6063
6064 case 'a': // Address register
6065 case 'd': // Data register (equivalent to 'r')
6066 case 'f': // Floating-point register
6067 Info.setAllowsRegister();
6068 return true;
6069
6070 case 'I': // Unsigned 8-bit constant
6071 case 'J': // Unsigned 12-bit constant
6072 case 'K': // Signed 16-bit constant
6073 case 'L': // Signed 20-bit displacement (on all targets we support)
6074 case 'M': // 0x7fffffff
6075 return true;
6076
6077 case 'Q': // Memory with base and unsigned 12-bit displacement
6078 case 'R': // Likewise, plus an index
6079 case 'S': // Memory with base and signed 20-bit displacement
6080 case 'T': // Likewise, plus an index
6081 Info.setAllowsMemory();
6082 return true;
6083 }
6084}
Ulrich Weigand47445072013-05-06 16:26:41 +00006085
Eric Christopherc48497a2015-09-18 21:26:24 +00006086class MSP430TargetInfo : public TargetInfo {
6087 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006088
Eric Christopherc48497a2015-09-18 21:26:24 +00006089public:
6090 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6091 BigEndian = false;
6092 TLSSupported = false;
6093 IntWidth = 16;
6094 IntAlign = 16;
6095 LongWidth = 32;
6096 LongLongWidth = 64;
6097 LongAlign = LongLongAlign = 16;
6098 PointerWidth = 16;
6099 PointerAlign = 16;
6100 SuitableAlign = 16;
6101 SizeType = UnsignedInt;
6102 IntMaxType = SignedLongLong;
6103 IntPtrType = SignedInt;
6104 PtrDiffType = SignedInt;
6105 SigAtomicType = SignedLong;
6106 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006107 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006108 void getTargetDefines(const LangOptions &Opts,
6109 MacroBuilder &Builder) const override {
6110 Builder.defineMacro("MSP430");
6111 Builder.defineMacro("__MSP430__");
6112 // FIXME: defines for different 'flavours' of MCU
6113 }
6114 void getTargetBuiltins(const Builtin::Info *&Records,
6115 unsigned &NumRecords) const override {
6116 // FIXME: Implement.
6117 Records = nullptr;
6118 NumRecords = 0;
6119 }
6120 bool hasFeature(StringRef Feature) const override {
6121 return Feature == "msp430";
6122 }
6123 void getGCCRegNames(const char *const *&Names,
6124 unsigned &NumNames) const override;
6125 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6126 unsigned &NumAliases) const override {
6127 // No aliases.
6128 Aliases = nullptr;
6129 NumAliases = 0;
6130 }
6131 bool validateAsmConstraint(const char *&Name,
6132 TargetInfo::ConstraintInfo &info) const override {
6133 // FIXME: implement
6134 switch (*Name) {
6135 case 'K': // the constant 1
6136 case 'L': // constant -1^20 .. 1^19
6137 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006138 return true;
6139 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006140 // No target constraints for now.
6141 return false;
6142 }
6143 const char *getClobbers() const override {
6144 // FIXME: Is this really right?
6145 return "";
6146 }
6147 BuiltinVaListKind getBuiltinVaListKind() const override {
6148 // FIXME: implement
6149 return TargetInfo::CharPtrBuiltinVaList;
6150 }
6151};
6152
6153const char *const MSP430TargetInfo::GCCRegNames[] = {
6154 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6155 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6156
6157void MSP430TargetInfo::getGCCRegNames(const char *const *&Names,
6158 unsigned &NumNames) const {
6159 Names = GCCRegNames;
6160 NumNames = llvm::array_lengthof(GCCRegNames);
6161}
6162
6163// LLVM and Clang cannot be used directly to output native binaries for
6164// target, but is used to compile C code to llvm bitcode with correct
6165// type and alignment information.
6166//
6167// TCE uses the llvm bitcode as input and uses it for generating customized
6168// target processor and program binary. TCE co-design environment is
6169// publicly available in http://tce.cs.tut.fi
6170
6171static const unsigned TCEOpenCLAddrSpaceMap[] = {
6172 3, // opencl_global
6173 4, // opencl_local
6174 5, // opencl_constant
6175 // FIXME: generic has to be added to the target
6176 0, // opencl_generic
6177 0, // cuda_device
6178 0, // cuda_constant
6179 0 // cuda_shared
6180};
6181
6182class TCETargetInfo : public TargetInfo {
6183public:
6184 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6185 TLSSupported = false;
6186 IntWidth = 32;
6187 LongWidth = LongLongWidth = 32;
6188 PointerWidth = 32;
6189 IntAlign = 32;
6190 LongAlign = LongLongAlign = 32;
6191 PointerAlign = 32;
6192 SuitableAlign = 32;
6193 SizeType = UnsignedInt;
6194 IntMaxType = SignedLong;
6195 IntPtrType = SignedInt;
6196 PtrDiffType = SignedInt;
6197 FloatWidth = 32;
6198 FloatAlign = 32;
6199 DoubleWidth = 32;
6200 DoubleAlign = 32;
6201 LongDoubleWidth = 32;
6202 LongDoubleAlign = 32;
6203 FloatFormat = &llvm::APFloat::IEEEsingle;
6204 DoubleFormat = &llvm::APFloat::IEEEsingle;
6205 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6206 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6207 "-f64:32-v64:32-v128:32-a:0:32-n32";
6208 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6209 UseAddrSpaceMapMangling = true;
6210 }
6211
6212 void getTargetDefines(const LangOptions &Opts,
6213 MacroBuilder &Builder) const override {
6214 DefineStd(Builder, "tce", Opts);
6215 Builder.defineMacro("__TCE__");
6216 Builder.defineMacro("__TCE_V1__");
6217 }
6218 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6219
6220 void getTargetBuiltins(const Builtin::Info *&Records,
6221 unsigned &NumRecords) const override {}
6222 const char *getClobbers() const override { return ""; }
6223 BuiltinVaListKind getBuiltinVaListKind() const override {
6224 return TargetInfo::VoidPtrBuiltinVaList;
6225 }
6226 void getGCCRegNames(const char *const *&Names,
6227 unsigned &NumNames) const override {}
6228 bool validateAsmConstraint(const char *&Name,
6229 TargetInfo::ConstraintInfo &info) const override {
6230 return true;
6231 }
6232 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6233 unsigned &NumAliases) const override {}
6234};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006235
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006236class BPFTargetInfo : public TargetInfo {
6237public:
6238 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6239 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6240 SizeType = UnsignedLong;
6241 PtrDiffType = SignedLong;
6242 IntPtrType = SignedLong;
6243 IntMaxType = SignedLong;
6244 Int64Type = SignedLong;
6245 RegParmMax = 5;
6246 if (Triple.getArch() == llvm::Triple::bpfeb) {
6247 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006248 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006249 } else {
6250 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006251 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006252 }
6253 MaxAtomicPromoteWidth = 64;
6254 MaxAtomicInlineWidth = 64;
6255 TLSSupported = false;
6256 }
6257 void getTargetDefines(const LangOptions &Opts,
6258 MacroBuilder &Builder) const override {
6259 DefineStd(Builder, "bpf", Opts);
6260 Builder.defineMacro("__BPF__");
6261 }
6262 bool hasFeature(StringRef Feature) const override {
6263 return Feature == "bpf";
6264 }
6265
6266 void getTargetBuiltins(const Builtin::Info *&Records,
6267 unsigned &NumRecords) const override {}
6268 const char *getClobbers() const override {
6269 return "";
6270 }
6271 BuiltinVaListKind getBuiltinVaListKind() const override {
6272 return TargetInfo::VoidPtrBuiltinVaList;
6273 }
6274 void getGCCRegNames(const char * const *&Names,
6275 unsigned &NumNames) const override {
6276 Names = nullptr;
6277 NumNames = 0;
6278 }
6279 bool validateAsmConstraint(const char *&Name,
6280 TargetInfo::ConstraintInfo &info) const override {
6281 return true;
6282 }
6283 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6284 unsigned &NumAliases) const override {
6285 Aliases = nullptr;
6286 NumAliases = 0;
6287 }
6288};
6289
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006290class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006291 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006292
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006293 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006294 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006295 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006296 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006297 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006298 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006299 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006300 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006301 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006302 enum DspRevEnum {
6303 NoDSP, DSP1, DSP2
6304 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006305 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006306
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006307protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006308 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006309 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006310
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006311public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006312 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6313 const std::string &CPUStr)
6314 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006315 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006316 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6317 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6318 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006319
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006320 bool isNaN2008Default() const {
6321 return CPU == "mips32r6" || CPU == "mips64r6";
6322 }
6323
6324 bool isFP64Default() const {
6325 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6326 }
6327
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006328 bool isNan2008() const override {
6329 return IsNan2008;
6330 }
6331
Alp Toker4925ba72014-06-07 23:30:42 +00006332 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006333 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006334 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6335 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006336 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006337 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006338 .Case("mips1", IsMips32)
6339 .Case("mips2", IsMips32)
6340 .Case("mips3", true)
6341 .Case("mips4", true)
6342 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006343 .Case("mips32", IsMips32)
6344 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006345 .Case("mips32r3", IsMips32)
6346 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006347 .Case("mips32r6", IsMips32)
6348 .Case("mips64", true)
6349 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006350 .Case("mips64r3", true)
6351 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006352 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006353 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006354 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006355 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006356 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006357 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006358 bool
6359 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6360 StringRef CPU,
6361 const std::vector<std::string> &FeaturesVec) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006362 if (CPU == "octeon")
6363 Features["mips64r2"] = Features["cnmips"] = true;
6364 else
6365 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006366 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006367 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006368
Craig Topper3164f332014-03-11 03:39:26 +00006369 void getTargetDefines(const LangOptions &Opts,
6370 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006371 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006372 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006373 if (Opts.GNUMode)
6374 Builder.defineMacro("mips");
6375
Simon Atanasyan683535b2012-08-29 19:14:58 +00006376 Builder.defineMacro("__REGISTER_PREFIX__", "");
6377
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006378 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006379 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006380 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006381 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006382 case SoftFloat:
6383 Builder.defineMacro("__mips_soft_float", Twine(1));
6384 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006385 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006386
Simon Atanasyan16071912013-04-14 14:07:30 +00006387 if (IsSingleFloat)
6388 Builder.defineMacro("__mips_single_float", Twine(1));
6389
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006390 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6391 Builder.defineMacro("_MIPS_FPSET",
6392 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6393
Simon Atanasyan72244b62012-07-05 16:06:06 +00006394 if (IsMips16)
6395 Builder.defineMacro("__mips16", Twine(1));
6396
Simon Atanasyan60777612013-04-14 14:07:51 +00006397 if (IsMicromips)
6398 Builder.defineMacro("__mips_micromips", Twine(1));
6399
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006400 if (IsNan2008)
6401 Builder.defineMacro("__mips_nan2008", Twine(1));
6402
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006403 switch (DspRev) {
6404 default:
6405 break;
6406 case DSP1:
6407 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6408 Builder.defineMacro("__mips_dsp", Twine(1));
6409 break;
6410 case DSP2:
6411 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6412 Builder.defineMacro("__mips_dspr2", Twine(1));
6413 Builder.defineMacro("__mips_dsp", Twine(1));
6414 break;
6415 }
6416
Jack Carter44ff1e52013-08-12 17:20:29 +00006417 if (HasMSA)
6418 Builder.defineMacro("__mips_msa", Twine(1));
6419
Simon Atanasyan26f19672012-04-05 19:28:31 +00006420 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6421 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6422 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006423
6424 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6425 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006426 }
6427
Craig Topper3164f332014-03-11 03:39:26 +00006428 void getTargetBuiltins(const Builtin::Info *&Records,
6429 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006430 Records = BuiltinInfo;
6431 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006432 }
Craig Topper3164f332014-03-11 03:39:26 +00006433 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006434 return llvm::StringSwitch<bool>(Feature)
6435 .Case("mips", true)
6436 .Case("fp64", HasFP64)
6437 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006438 }
Craig Topper3164f332014-03-11 03:39:26 +00006439 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006440 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006441 }
Craig Topper3164f332014-03-11 03:39:26 +00006442 void getGCCRegNames(const char * const *&Names,
6443 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006444 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006445 // CPU register names
6446 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006447 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6448 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6449 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006450 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6451 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006452 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6453 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6454 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6455 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006456 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006457 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006458 "$fcc5","$fcc6","$fcc7",
6459 // MSA register names
6460 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6461 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6462 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6463 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6464 // MSA control register names
6465 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6466 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006467 };
6468 Names = GCCRegNames;
6469 NumNames = llvm::array_lengthof(GCCRegNames);
6470 }
Craig Topper3164f332014-03-11 03:39:26 +00006471 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6472 unsigned &NumAliases) const override = 0;
6473 bool validateAsmConstraint(const char *&Name,
6474 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006475 switch (*Name) {
6476 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006477 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006478 case 'r': // CPU registers.
6479 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006480 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006481 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006482 case 'c': // $25 for indirect jumps
6483 case 'l': // lo register
6484 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006485 Info.setAllowsRegister();
6486 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006487 case 'I': // Signed 16-bit constant
6488 case 'J': // Integer 0
6489 case 'K': // Unsigned 16-bit constant
6490 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6491 case 'M': // Constants not loadable via lui, addiu, or ori
6492 case 'N': // Constant -1 to -65535
6493 case 'O': // A signed 15-bit constant
6494 case 'P': // A constant between 1 go 65535
6495 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006496 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006497 Info.setAllowsMemory();
6498 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006499 case 'Z':
6500 if (Name[1] == 'C') { // An address usable by ll, and sc.
6501 Info.setAllowsMemory();
6502 Name++; // Skip over 'Z'.
6503 return true;
6504 }
6505 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006506 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006507 }
6508
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006509 std::string convertConstraint(const char *&Constraint) const override {
6510 std::string R;
6511 switch (*Constraint) {
6512 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6513 if (Constraint[1] == 'C') {
6514 R = std::string("^") + std::string(Constraint, 2);
6515 Constraint++;
6516 return R;
6517 }
6518 break;
6519 }
6520 return TargetInfo::convertConstraint(Constraint);
6521 }
6522
Craig Topper3164f332014-03-11 03:39:26 +00006523 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006524 // In GCC, $1 is not widely used in generated code (it's used only in a few
6525 // specific situations), so there is no real need for users to add it to
6526 // the clobbers list if they want to use it in their inline assembly code.
6527 //
6528 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6529 // code generation, so using it in inline assembly without adding it to the
6530 // clobbers list can cause conflicts between the inline assembly code and
6531 // the surrounding generated code.
6532 //
6533 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6534 // operands, which will conflict with the ".set at" assembler option (which
6535 // we use only for inline assembly, in order to maintain compatibility with
6536 // GCC) and will also conflict with the user's usage of $1.
6537 //
6538 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6539 // register for generated code is to automatically clobber $1 for all inline
6540 // assembly code.
6541 //
6542 // FIXME: We should automatically clobber $1 only for inline assembly code
6543 // which actually uses it. This would allow LLVM to use $1 for inline
6544 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006545 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006546 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006547
Craig Topper3164f332014-03-11 03:39:26 +00006548 bool handleTargetFeatures(std::vector<std::string> &Features,
6549 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006550 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006551 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006552 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006553 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006554 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006555 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006556 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006557
Eric Christopher610fe112015-08-26 08:21:55 +00006558 for (const auto &Feature : Features) {
6559 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006560 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006561 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006562 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006563 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006564 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006565 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006566 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006567 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006568 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006569 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006570 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006571 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006572 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006573 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006574 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006575 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006576 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006577 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006578 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006579 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006580 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006581 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006582
Eric Christopher964a5f32015-08-05 23:48:05 +00006583 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006584
Rafael Espindolaeb265472013-08-21 21:59:03 +00006585 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006586 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006587
Craig Topper3164f332014-03-11 03:39:26 +00006588 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006589 if (RegNo == 0) return 4;
6590 if (RegNo == 1) return 5;
6591 return -1;
6592 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006593
6594 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006595};
6596
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006597const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006598#define BUILTIN(ID, TYPE, ATTRS) \
6599 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6600#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6601 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006602#include "clang/Basic/BuiltinsMips.def"
6603};
6604
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006605class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006606public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006607 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006608 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006609 SizeType = UnsignedInt;
6610 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006611 Int64Type = SignedLongLong;
6612 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006613 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006614 }
Craig Topper3164f332014-03-11 03:39:26 +00006615 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006616 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006617 ABI = Name;
6618 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006619 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006620 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006621 }
Craig Topper3164f332014-03-11 03:39:26 +00006622 void getTargetDefines(const LangOptions &Opts,
6623 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006624 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006625
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006626 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006627 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6628
6629 const std::string& CPUStr = getCPU();
6630 if (CPUStr == "mips32")
6631 Builder.defineMacro("__mips_isa_rev", "1");
6632 else if (CPUStr == "mips32r2")
6633 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006634 else if (CPUStr == "mips32r3")
6635 Builder.defineMacro("__mips_isa_rev", "3");
6636 else if (CPUStr == "mips32r5")
6637 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006638 else if (CPUStr == "mips32r6")
6639 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006640
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006641 if (ABI == "o32") {
6642 Builder.defineMacro("__mips_o32");
6643 Builder.defineMacro("_ABIO32", "1");
6644 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6645 }
6646 else if (ABI == "eabi")
6647 Builder.defineMacro("__mips_eabi");
6648 else
David Blaikie83d382b2011-09-23 05:06:16 +00006649 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006650 }
Craig Topper3164f332014-03-11 03:39:26 +00006651 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6652 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006653 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6654 { { "at" }, "$1" },
6655 { { "v0" }, "$2" },
6656 { { "v1" }, "$3" },
6657 { { "a0" }, "$4" },
6658 { { "a1" }, "$5" },
6659 { { "a2" }, "$6" },
6660 { { "a3" }, "$7" },
6661 { { "t0" }, "$8" },
6662 { { "t1" }, "$9" },
6663 { { "t2" }, "$10" },
6664 { { "t3" }, "$11" },
6665 { { "t4" }, "$12" },
6666 { { "t5" }, "$13" },
6667 { { "t6" }, "$14" },
6668 { { "t7" }, "$15" },
6669 { { "s0" }, "$16" },
6670 { { "s1" }, "$17" },
6671 { { "s2" }, "$18" },
6672 { { "s3" }, "$19" },
6673 { { "s4" }, "$20" },
6674 { { "s5" }, "$21" },
6675 { { "s6" }, "$22" },
6676 { { "s7" }, "$23" },
6677 { { "t8" }, "$24" },
6678 { { "t9" }, "$25" },
6679 { { "k0" }, "$26" },
6680 { { "k1" }, "$27" },
6681 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006682 { { "sp","$sp" }, "$29" },
6683 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006684 { { "ra" }, "$31" }
6685 };
6686 Aliases = GCCRegAliases;
6687 NumAliases = llvm::array_lengthof(GCCRegAliases);
6688 }
6689};
6690
6691class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006692 void setDataLayoutString() override {
6693 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006694 }
6695
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006696public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006697 Mips32EBTargetInfo(const llvm::Triple &Triple)
6698 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006699 }
Craig Topper3164f332014-03-11 03:39:26 +00006700 void getTargetDefines(const LangOptions &Opts,
6701 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006702 DefineStd(Builder, "MIPSEB", Opts);
6703 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006704 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006705 }
6706};
6707
6708class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006709 void setDataLayoutString() override {
6710 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006711 }
6712
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006713public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006714 Mips32ELTargetInfo(const llvm::Triple &Triple)
6715 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006716 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006717 }
Craig Topper3164f332014-03-11 03:39:26 +00006718 void getTargetDefines(const LangOptions &Opts,
6719 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006720 DefineStd(Builder, "MIPSEL", Opts);
6721 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006722 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006723 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006724};
Akira Hatanakabef17452011-09-20 19:21:49 +00006725
6726class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006727public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006728 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006729 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006730 LongDoubleWidth = LongDoubleAlign = 128;
6731 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006732 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6733 LongDoubleWidth = LongDoubleAlign = 64;
6734 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6735 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006736 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006737 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006738 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006739 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006740
6741 void setN64ABITypes() {
6742 LongWidth = LongAlign = 64;
6743 PointerWidth = PointerAlign = 64;
6744 SizeType = UnsignedLong;
6745 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006746 Int64Type = SignedLong;
6747 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006748 }
6749
6750 void setN32ABITypes() {
6751 LongWidth = LongAlign = 32;
6752 PointerWidth = PointerAlign = 32;
6753 SizeType = UnsignedInt;
6754 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006755 Int64Type = SignedLongLong;
6756 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006757 }
6758
Craig Topper3164f332014-03-11 03:39:26 +00006759 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006760 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006761 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006762 ABI = Name;
6763 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006764 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006765 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006766 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006767 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006768 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006769 }
6770 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006771 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006772
Craig Topper3164f332014-03-11 03:39:26 +00006773 void getTargetDefines(const LangOptions &Opts,
6774 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006775 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006776
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006777 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006778 Builder.defineMacro("__mips64");
6779 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006780 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6781
6782 const std::string& CPUStr = getCPU();
6783 if (CPUStr == "mips64")
6784 Builder.defineMacro("__mips_isa_rev", "1");
6785 else if (CPUStr == "mips64r2")
6786 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006787 else if (CPUStr == "mips64r3")
6788 Builder.defineMacro("__mips_isa_rev", "3");
6789 else if (CPUStr == "mips64r5")
6790 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006791 else if (CPUStr == "mips64r6")
6792 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006793
Akira Hatanakabef17452011-09-20 19:21:49 +00006794 if (ABI == "n32") {
6795 Builder.defineMacro("__mips_n32");
6796 Builder.defineMacro("_ABIN32", "2");
6797 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6798 }
6799 else if (ABI == "n64") {
6800 Builder.defineMacro("__mips_n64");
6801 Builder.defineMacro("_ABI64", "3");
6802 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6803 }
6804 else
David Blaikie83d382b2011-09-23 05:06:16 +00006805 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006806 }
Craig Topper3164f332014-03-11 03:39:26 +00006807 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6808 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006809 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6810 { { "at" }, "$1" },
6811 { { "v0" }, "$2" },
6812 { { "v1" }, "$3" },
6813 { { "a0" }, "$4" },
6814 { { "a1" }, "$5" },
6815 { { "a2" }, "$6" },
6816 { { "a3" }, "$7" },
6817 { { "a4" }, "$8" },
6818 { { "a5" }, "$9" },
6819 { { "a6" }, "$10" },
6820 { { "a7" }, "$11" },
6821 { { "t0" }, "$12" },
6822 { { "t1" }, "$13" },
6823 { { "t2" }, "$14" },
6824 { { "t3" }, "$15" },
6825 { { "s0" }, "$16" },
6826 { { "s1" }, "$17" },
6827 { { "s2" }, "$18" },
6828 { { "s3" }, "$19" },
6829 { { "s4" }, "$20" },
6830 { { "s5" }, "$21" },
6831 { { "s6" }, "$22" },
6832 { { "s7" }, "$23" },
6833 { { "t8" }, "$24" },
6834 { { "t9" }, "$25" },
6835 { { "k0" }, "$26" },
6836 { { "k1" }, "$27" },
6837 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006838 { { "sp","$sp" }, "$29" },
6839 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006840 { { "ra" }, "$31" }
6841 };
6842 Aliases = GCCRegAliases;
6843 NumAliases = llvm::array_lengthof(GCCRegAliases);
6844 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006845
6846 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006847};
6848
6849class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006850 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006851 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006852 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 +00006853 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006854 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006855
Akira Hatanakabef17452011-09-20 19:21:49 +00006856 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006857
Akira Hatanakabef17452011-09-20 19:21:49 +00006858public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006859 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006860 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006861 void getTargetDefines(const LangOptions &Opts,
6862 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006863 DefineStd(Builder, "MIPSEB", Opts);
6864 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006865 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006866 }
6867};
6868
6869class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006870 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006871 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006872 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 +00006873 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006874 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006875 }
6876public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006877 Mips64ELTargetInfo(const llvm::Triple &Triple)
6878 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006879 // Default ABI is n64.
6880 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006881 }
Craig Topper3164f332014-03-11 03:39:26 +00006882 void getTargetDefines(const LangOptions &Opts,
6883 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006884 DefineStd(Builder, "MIPSEL", Opts);
6885 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006886 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006887 }
6888};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006889
Ivan Krasindd7403e2011-08-24 20:22:22 +00006890class PNaClTargetInfo : public TargetInfo {
6891public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006892 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006893 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006894 this->UserLabelPrefix = "";
6895 this->LongAlign = 32;
6896 this->LongWidth = 32;
6897 this->PointerAlign = 32;
6898 this->PointerWidth = 32;
6899 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006900 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006901 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006902 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006903 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006904 this->SizeType = TargetInfo::UnsignedInt;
6905 this->PtrDiffType = TargetInfo::SignedInt;
6906 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006907 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006908 }
6909
Craig Toppere6f17d02014-03-11 04:07:52 +00006910 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006911 Builder.defineMacro("__le32__");
6912 Builder.defineMacro("__pnacl__");
6913 }
Craig Topper3164f332014-03-11 03:39:26 +00006914 void getTargetDefines(const LangOptions &Opts,
6915 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006916 getArchDefines(Opts, Builder);
6917 }
Craig Topper3164f332014-03-11 03:39:26 +00006918 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006919 return Feature == "pnacl";
6920 }
Craig Topper3164f332014-03-11 03:39:26 +00006921 void getTargetBuiltins(const Builtin::Info *&Records,
6922 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006923 }
Craig Topper3164f332014-03-11 03:39:26 +00006924 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006925 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006926 }
Craig Topper3164f332014-03-11 03:39:26 +00006927 void getGCCRegNames(const char * const *&Names,
6928 unsigned &NumNames) const override;
6929 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6930 unsigned &NumAliases) const override;
6931 bool validateAsmConstraint(const char *&Name,
6932 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006933 return false;
6934 }
6935
Craig Topper3164f332014-03-11 03:39:26 +00006936 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006937 return "";
6938 }
6939};
6940
6941void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6942 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006943 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006944 NumNames = 0;
6945}
6946
6947void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6948 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006949 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006950 NumAliases = 0;
6951}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006952
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006953// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6954class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6955public:
6956 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00006957 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006958 }
6959
6960 BuiltinVaListKind getBuiltinVaListKind() const override {
6961 return TargetInfo::PNaClABIBuiltinVaList;
6962 }
6963};
6964
JF Bastien643817d2014-09-12 17:52:47 +00006965class Le64TargetInfo : public TargetInfo {
6966 static const Builtin::Info BuiltinInfo[];
6967
6968public:
6969 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6970 BigEndian = false;
6971 NoAsmVariants = true;
6972 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6973 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006974 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006975 }
6976
6977 void getTargetDefines(const LangOptions &Opts,
6978 MacroBuilder &Builder) const override {
6979 DefineStd(Builder, "unix", Opts);
6980 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6981 Builder.defineMacro("__ELF__");
6982 }
6983 void getTargetBuiltins(const Builtin::Info *&Records,
6984 unsigned &NumRecords) const override {
6985 Records = BuiltinInfo;
6986 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6987 }
6988 BuiltinVaListKind getBuiltinVaListKind() const override {
6989 return TargetInfo::PNaClABIBuiltinVaList;
6990 }
6991 const char *getClobbers() const override { return ""; }
6992 void getGCCRegNames(const char *const *&Names,
6993 unsigned &NumNames) const override {
6994 Names = nullptr;
6995 NumNames = 0;
6996 }
6997 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6998 unsigned &NumAliases) const override {
6999 Aliases = nullptr;
7000 NumAliases = 0;
7001 }
7002 bool validateAsmConstraint(const char *&Name,
7003 TargetInfo::ConstraintInfo &Info) const override {
7004 return false;
7005 }
7006
7007 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007008};
Dan Gohmanc2853072015-09-03 22:51:53 +00007009
7010class WebAssemblyTargetInfo : public TargetInfo {
7011 static const Builtin::Info BuiltinInfo[];
7012
7013 enum SIMDEnum {
7014 NoSIMD,
7015 SIMD128,
7016 } SIMDLevel;
7017
7018public:
7019 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
7020 : TargetInfo(T), SIMDLevel(NoSIMD) {
7021 BigEndian = false;
7022 NoAsmVariants = true;
7023 SuitableAlign = 128;
7024 LargeArrayMinWidth = 128;
7025 LargeArrayAlign = 128;
7026 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007027 SigAtomicType = SignedLong;
Dan Gohmanc2853072015-09-03 22:51:53 +00007028 }
7029
7030protected:
7031 void getTargetDefines(const LangOptions &Opts,
7032 MacroBuilder &Builder) const override {
7033 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7034 if (SIMDLevel >= SIMD128)
7035 Builder.defineMacro("__wasm_simd128__");
7036 }
7037
7038private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007039 bool
7040 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7041 StringRef CPU,
7042 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007043 if (CPU == "bleeding-edge")
7044 Features["simd128"] = true;
7045 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7046 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007047 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007048 return llvm::StringSwitch<bool>(Feature)
7049 .Case("simd128", SIMDLevel >= SIMD128)
7050 .Default(false);
7051 }
7052 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007053 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007054 for (const auto &Feature : Features) {
7055 if (Feature == "+simd128") {
7056 SIMDLevel = std::max(SIMDLevel, SIMD128);
7057 continue;
7058 }
7059 if (Feature == "-simd128") {
7060 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7061 continue;
7062 }
7063
7064 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7065 << "-target-feature";
7066 return false;
7067 }
7068 return true;
7069 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007070 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007071 return llvm::StringSwitch<bool>(Name)
7072 .Case("mvp", true)
7073 .Case("bleeding-edge", true)
7074 .Case("generic", true)
7075 .Default(false);
7076 }
7077 void getTargetBuiltins(const Builtin::Info *&Records,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007078 unsigned &NumRecords) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007079 Records = BuiltinInfo;
7080 NumRecords = clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin;
7081 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007082 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007083 // TODO: Implement va_list properly.
7084 return VoidPtrBuiltinVaList;
7085 }
7086 void getGCCRegNames(const char *const *&Names,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007087 unsigned &NumNames) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007088 Names = nullptr;
7089 NumNames = 0;
7090 }
7091 void getGCCRegAliases(const GCCRegAlias *&Aliases,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007092 unsigned &NumAliases) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007093 Aliases = nullptr;
7094 NumAliases = 0;
7095 }
7096 bool
7097 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007098 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007099 return false;
7100 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007101 const char *getClobbers() const final { return ""; }
7102 bool isCLZForZeroUndef() const final { return false; }
7103 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007104 IntType getIntTypeByWidth(unsigned BitWidth,
7105 bool IsSigned) const final {
7106 // WebAssembly prefers long long for explicitly 64-bit integers.
7107 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7108 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7109 }
7110 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7111 bool IsSigned) const final {
7112 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7113 return BitWidth == 64
7114 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7115 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7116 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007117};
7118
7119const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7120#define BUILTIN(ID, TYPE, ATTRS) \
7121 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7122#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7123 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7124#include "clang/Basic/BuiltinsWebAssembly.def"
7125};
7126
7127class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7128public:
7129 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7130 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007131 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohmanc2853072015-09-03 22:51:53 +00007132 DataLayoutString = "e-p:32:32-i64:64-n32:64-S128";
7133 }
7134
7135protected:
7136 void getTargetDefines(const LangOptions &Opts,
7137 MacroBuilder &Builder) const override {
7138 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7139 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7140 }
7141};
7142
7143class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7144public:
7145 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7146 : WebAssemblyTargetInfo(T) {
7147 LongAlign = LongWidth = 64;
7148 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007149 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohmanc2853072015-09-03 22:51:53 +00007150 DataLayoutString = "e-p:64:64-i64:64-n32:64-S128";
7151 }
7152
7153protected:
7154 void getTargetDefines(const LangOptions &Opts,
7155 MacroBuilder &Builder) const override {
7156 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7157 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7158 }
7159};
7160
JF Bastien643817d2014-09-12 17:52:47 +00007161const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7162#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007163 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007164#include "clang/Basic/BuiltinsLe64.def"
7165};
7166
Eric Christopherc48497a2015-09-18 21:26:24 +00007167static const unsigned SPIRAddrSpaceMap[] = {
7168 1, // opencl_global
7169 3, // opencl_local
7170 2, // opencl_constant
7171 4, // opencl_generic
7172 0, // cuda_device
7173 0, // cuda_constant
7174 0 // cuda_shared
7175};
7176class SPIRTargetInfo : public TargetInfo {
7177public:
7178 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7179 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7180 "SPIR target must use unknown OS");
7181 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7182 "SPIR target must use unknown environment type");
7183 BigEndian = false;
7184 TLSSupported = false;
7185 LongWidth = LongAlign = 64;
7186 AddrSpaceMap = &SPIRAddrSpaceMap;
7187 UseAddrSpaceMapMangling = true;
7188 // Define available target features
7189 // These must be defined in sorted order!
7190 NoAsmVariants = true;
7191 }
7192 void getTargetDefines(const LangOptions &Opts,
7193 MacroBuilder &Builder) const override {
7194 DefineStd(Builder, "SPIR", Opts);
7195 }
7196 bool hasFeature(StringRef Feature) const override {
7197 return Feature == "spir";
7198 }
Craig Topper3164f332014-03-11 03:39:26 +00007199
Eric Christopherc48497a2015-09-18 21:26:24 +00007200 void getTargetBuiltins(const Builtin::Info *&Records,
7201 unsigned &NumRecords) const override {}
7202 const char *getClobbers() const override { return ""; }
7203 void getGCCRegNames(const char *const *&Names,
7204 unsigned &NumNames) const override {}
7205 bool validateAsmConstraint(const char *&Name,
7206 TargetInfo::ConstraintInfo &info) const override {
7207 return true;
7208 }
7209 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7210 unsigned &NumAliases) const override {}
7211 BuiltinVaListKind getBuiltinVaListKind() const override {
7212 return TargetInfo::VoidPtrBuiltinVaList;
7213 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007214
Eric Christopherc48497a2015-09-18 21:26:24 +00007215 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7216 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7217 : CCCR_Warning;
7218 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007219
Eric Christopherc48497a2015-09-18 21:26:24 +00007220 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7221 return CC_SpirFunction;
7222 }
7223};
Guy Benyeib798fc92012-12-11 21:38:14 +00007224
Eric Christopherc48497a2015-09-18 21:26:24 +00007225class SPIR32TargetInfo : public SPIRTargetInfo {
7226public:
7227 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7228 PointerWidth = PointerAlign = 32;
7229 SizeType = TargetInfo::UnsignedInt;
7230 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7231 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7232 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7233 }
7234 void getTargetDefines(const LangOptions &Opts,
7235 MacroBuilder &Builder) const override {
7236 DefineStd(Builder, "SPIR32", Opts);
7237 }
7238};
Guy Benyeib798fc92012-12-11 21:38:14 +00007239
Eric Christopherc48497a2015-09-18 21:26:24 +00007240class SPIR64TargetInfo : public SPIRTargetInfo {
7241public:
7242 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7243 PointerWidth = PointerAlign = 64;
7244 SizeType = TargetInfo::UnsignedLong;
7245 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7246 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7247 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7248 }
7249 void getTargetDefines(const LangOptions &Opts,
7250 MacroBuilder &Builder) const override {
7251 DefineStd(Builder, "SPIR64", Opts);
7252 }
7253};
Guy Benyeib798fc92012-12-11 21:38:14 +00007254
Robert Lytton0e076492013-08-13 09:43:10 +00007255class XCoreTargetInfo : public TargetInfo {
7256 static const Builtin::Info BuiltinInfo[];
7257public:
7258 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7259 BigEndian = false;
7260 NoAsmVariants = true;
7261 LongLongAlign = 32;
7262 SuitableAlign = 32;
7263 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007264 SizeType = UnsignedInt;
7265 PtrDiffType = SignedInt;
7266 IntPtrType = SignedInt;
7267 WCharType = UnsignedChar;
7268 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007269 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007270 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7271 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007272 }
Craig Topper3164f332014-03-11 03:39:26 +00007273 void getTargetDefines(const LangOptions &Opts,
7274 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007275 Builder.defineMacro("__XS1B__");
7276 }
Craig Topper3164f332014-03-11 03:39:26 +00007277 void getTargetBuiltins(const Builtin::Info *&Records,
7278 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007279 Records = BuiltinInfo;
7280 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
7281 }
Craig Topper3164f332014-03-11 03:39:26 +00007282 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007283 return TargetInfo::VoidPtrBuiltinVaList;
7284 }
Craig Topper3164f332014-03-11 03:39:26 +00007285 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007286 return "";
7287 }
Craig Topper3164f332014-03-11 03:39:26 +00007288 void getGCCRegNames(const char * const *&Names,
7289 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007290 static const char * const GCCRegNames[] = {
7291 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7292 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7293 };
7294 Names = GCCRegNames;
7295 NumNames = llvm::array_lengthof(GCCRegNames);
7296 }
Craig Topper3164f332014-03-11 03:39:26 +00007297 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7298 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00007299 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00007300 NumAliases = 0;
7301 }
Craig Topper3164f332014-03-11 03:39:26 +00007302 bool validateAsmConstraint(const char *&Name,
7303 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007304 return false;
7305 }
Craig Topper3164f332014-03-11 03:39:26 +00007306 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007307 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7308 return (RegNo < 2)? RegNo : -1;
7309 }
Robert Lytton0e076492013-08-13 09:43:10 +00007310};
7311
7312const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007313#define BUILTIN(ID, TYPE, ATTRS) \
7314 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7315#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7316 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007317#include "clang/Basic/BuiltinsXCore.def"
7318};
Robert Lytton0e076492013-08-13 09:43:10 +00007319
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007320// x86_32 Android target
7321class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7322public:
7323 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7324 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7325 SuitableAlign = 32;
7326 LongDoubleWidth = 64;
7327 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7328 }
7329};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007330
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007331// x86_64 Android target
7332class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7333public:
7334 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7335 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7336 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7337 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007338
7339 bool useFloat128ManglingForLongDouble() const override {
7340 return true;
7341 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007342};
7343} // end anonymous namespace
7344
Chris Lattner5ba61f02006-10-14 07:39:34 +00007345//===----------------------------------------------------------------------===//
7346// Driver code
7347//===----------------------------------------------------------------------===//
7348
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007349static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007350 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007351
Daniel Dunbar52322032009-08-18 05:47:58 +00007352 switch (Triple.getArch()) {
7353 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007354 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007355
Tim Northover2a0783d2014-05-30 14:14:07 +00007356 case llvm::Triple::xcore:
7357 return new XCoreTargetInfo(Triple);
7358
7359 case llvm::Triple::hexagon:
7360 return new HexagonTargetInfo(Triple);
7361
7362 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007363 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007364 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007365
7366 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007367 case llvm::Triple::FreeBSD:
7368 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007369 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007370 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007371 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007372 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007373 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007374 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007375 }
7376
Christian Pirker9b019ae2014-02-25 13:51:00 +00007377 case llvm::Triple::aarch64_be:
7378 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007379 case llvm::Triple::FreeBSD:
7380 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007381 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007382 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007383 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007384 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007385 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007386 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007387 }
7388
Daniel Dunbar52322032009-08-18 05:47:58 +00007389 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007390 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007391 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007392 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007393
Daniel Dunbar52322032009-08-18 05:47:58 +00007394 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007395 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007396 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007397 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007398 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007399 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007400 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007401 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007402 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007403 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007404 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007405 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007406 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007407 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007408 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007409 case llvm::Triple::Win32:
7410 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007411 case llvm::Triple::Cygnus:
7412 return new CygwinARMTargetInfo(Triple);
7413 case llvm::Triple::GNU:
7414 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007415 case llvm::Triple::Itanium:
7416 return new ItaniumWindowsARMleTargetInfo(Triple);
7417 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007418 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007419 return new MicrosoftARMleTargetInfo(Triple);
7420 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007421 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007422 return new ARMleTargetInfo(Triple);
7423 }
7424
7425 case llvm::Triple::armeb:
7426 case llvm::Triple::thumbeb:
7427 if (Triple.isOSDarwin())
7428 return new DarwinARMTargetInfo(Triple);
7429
7430 switch (os) {
7431 case llvm::Triple::Linux:
7432 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7433 case llvm::Triple::FreeBSD:
7434 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7435 case llvm::Triple::NetBSD:
7436 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7437 case llvm::Triple::OpenBSD:
7438 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7439 case llvm::Triple::Bitrig:
7440 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7441 case llvm::Triple::RTEMS:
7442 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7443 case llvm::Triple::NaCl:
7444 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7445 default:
7446 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007447 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007448
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007449 case llvm::Triple::bpfeb:
7450 case llvm::Triple::bpfel:
7451 return new BPFTargetInfo(Triple);
7452
Daniel Dunbar52322032009-08-18 05:47:58 +00007453 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007454 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007455
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007456 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007457 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007458 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007459 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007460 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007461 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007462 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007463 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007464 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007465 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007466 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007467 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007468 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007469
7470 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007471 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007472 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007473 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007474 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007475 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007476 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007477 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007478 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007479 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007480 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007481 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007482 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007483 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007484 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007485
Akira Hatanakabef17452011-09-20 19:21:49 +00007486 case llvm::Triple::mips64:
7487 switch (os) {
7488 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007489 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007490 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007491 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007492 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007493 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007494 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007495 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007496 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007497 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007498 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007499 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007500 }
7501
7502 case llvm::Triple::mips64el:
7503 switch (os) {
7504 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007505 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007506 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007507 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007508 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007509 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007510 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007511 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007512 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007513 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007514 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007515 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007516 }
7517
Ivan Krasindd7403e2011-08-24 20:22:22 +00007518 case llvm::Triple::le32:
7519 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007520 case llvm::Triple::NaCl:
7521 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7522 default:
7523 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007524 }
7525
JF Bastien643817d2014-09-12 17:52:47 +00007526 case llvm::Triple::le64:
7527 return new Le64TargetInfo(Triple);
7528
Daniel Dunbar52322032009-08-18 05:47:58 +00007529 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007530 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007531 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007532 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007533 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007534 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007535 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007536 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007537 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007538 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007539 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007540 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007541 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007542 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007543 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007544 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007545 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007546
7547 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007548 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007549 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007550 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007551 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007552 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007553 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007554 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007555 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007556 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007557 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007558 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007559 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007560 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007561 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007562
Bill Schmidt778d3872013-07-26 01:36:11 +00007563 case llvm::Triple::ppc64le:
7564 switch (os) {
7565 case llvm::Triple::Linux:
7566 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007567 case llvm::Triple::NetBSD:
7568 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007569 default:
7570 return new PPC64TargetInfo(Triple);
7571 }
7572
Peter Collingbournec947aae2012-05-20 23:28:41 +00007573 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007574 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007575 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007576 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007577
Tom Stellardd8e38a32015-01-06 20:34:47 +00007578 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007579 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007580 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007581
Daniel Dunbar52322032009-08-18 05:47:58 +00007582 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007583 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007584 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007585 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007586 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007587 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007588 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007589 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007590 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007591 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007592 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007593 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007594 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007595 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007596 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007597
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007598 // The 'sparcel' architecture copies all the above cases except for Solaris.
7599 case llvm::Triple::sparcel:
7600 switch (os) {
7601 case llvm::Triple::Linux:
7602 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7603 case llvm::Triple::NetBSD:
7604 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7605 case llvm::Triple::OpenBSD:
7606 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7607 case llvm::Triple::RTEMS:
7608 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7609 default:
7610 return new SparcV8elTargetInfo(Triple);
7611 }
7612
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007613 case llvm::Triple::sparcv9:
7614 switch (os) {
7615 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007616 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007617 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007618 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007619 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007620 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007621 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007622 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007623 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007624 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007625 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007626 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007627 }
7628
Ulrich Weigand47445072013-05-06 16:26:41 +00007629 case llvm::Triple::systemz:
7630 switch (os) {
7631 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007632 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007633 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007634 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007635 }
7636
Eli Friedmana9c3d712009-08-19 20:47:07 +00007637 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007638 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007639
Daniel Dunbar52322032009-08-18 05:47:58 +00007640 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007641 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007642 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007643
Daniel Dunbar52322032009-08-18 05:47:58 +00007644 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007645 case llvm::Triple::CloudABI:
7646 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007647 case llvm::Triple::Linux: {
7648 switch (Triple.getEnvironment()) {
7649 default:
7650 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7651 case llvm::Triple::Android:
7652 return new AndroidX86_32TargetInfo(Triple);
7653 }
7654 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007655 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007656 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007657 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007658 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007659 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007660 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007661 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007662 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007663 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007664 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007665 case llvm::Triple::KFreeBSD:
7666 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007667 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007668 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007669 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007670 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007671 case llvm::Triple::Win32: {
7672 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007673 case llvm::Triple::Cygnus:
7674 return new CygwinX86_32TargetInfo(Triple);
7675 case llvm::Triple::GNU:
7676 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007677 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007678 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007679 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007680 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007681 }
7682 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007683 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007684 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007685 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007686 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007687 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007688 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007689 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007690 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007691 }
7692
7693 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007694 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007695 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007696
Daniel Dunbar52322032009-08-18 05:47:58 +00007697 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007698 case llvm::Triple::CloudABI:
7699 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007700 case llvm::Triple::Linux: {
7701 switch (Triple.getEnvironment()) {
7702 default:
7703 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7704 case llvm::Triple::Android:
7705 return new AndroidX86_64TargetInfo(Triple);
7706 }
7707 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007708 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007709 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007710 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007711 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007712 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007713 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007714 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007715 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007716 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007717 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007718 case llvm::Triple::KFreeBSD:
7719 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007720 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007721 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007722 case llvm::Triple::Win32: {
7723 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007724 case llvm::Triple::Cygnus:
7725 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007726 case llvm::Triple::GNU:
7727 return new MinGWX86_64TargetInfo(Triple);
7728 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007729 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007730 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007731 }
7732 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007733 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007734 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007735 case llvm::Triple::PS4:
7736 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007737 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007738 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007739 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007740
Douglas Katzman78d7c542015-05-12 21:18:10 +00007741 case llvm::Triple::spir: {
7742 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7743 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7744 return nullptr;
7745 return new SPIR32TargetInfo(Triple);
7746 }
7747 case llvm::Triple::spir64: {
7748 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7749 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7750 return nullptr;
7751 return new SPIR64TargetInfo(Triple);
7752 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007753 case llvm::Triple::wasm32:
7754 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7755 return nullptr;
7756 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7757 case llvm::Triple::wasm64:
7758 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7759 return nullptr;
7760 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007761 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007762}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007763
7764/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007765/// options.
Alp Toker80758082014-07-06 05:26:44 +00007766TargetInfo *
7767TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7768 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007769 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007770
7771 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007772 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007773 if (!Target) {
7774 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007775 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007776 }
Alp Toker80758082014-07-06 05:26:44 +00007777 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007778
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007779 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007780 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7781 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007782 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007783 }
7784
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007785 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007786 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7787 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007788 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007789 }
7790
Rafael Espindolaeb265472013-08-21 21:59:03 +00007791 // Set the fp math unit.
7792 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7793 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007794 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007795 }
7796
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007797 // Compute the default target features, we need the target to handle this
7798 // because features may have dependencies on one another.
7799 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00007800 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
7801 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00007802 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007803
7804 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007805 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007806 for (const auto &F : Features)
7807 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7808
Eric Christopher3ff21b32013-10-16 21:26:26 +00007809 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007810 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007811
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007812 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007813}