blob: da91694768ba5aef40b8b58743fc981298ad3674 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000030#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000032#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000033
Chris Lattner5ba61f02006-10-14 07:39:34 +000034using namespace clang;
35
Chris Lattner5ba61f02006-10-14 07:39:34 +000036//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000037// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000038//===----------------------------------------------------------------------===//
39
Chris Lattner1e1c0b92009-03-20 16:06:38 +000040/// DefineStd - Define a macro name and standard variants. For example if
41/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
42/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000043static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000044 const LangOptions &Opts) {
45 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000046
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
48 // in the user's namespace.
49 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000050 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000051
Chris Lattner1e1c0b92009-03-20 16:06:38 +000052 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000057}
58
Benjamin Kramere3b442d2012-01-10 11:50:09 +000059static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
60 bool Tuning = true) {
61 Builder.defineMacro("__" + CPUName);
62 Builder.defineMacro("__" + CPUName + "__");
63 if (Tuning)
64 Builder.defineMacro("__tune_" + CPUName + "__");
65}
66
Chris Lattner09d98f52008-10-05 21:50:58 +000067//===----------------------------------------------------------------------===//
68// Defines specific to certain operating systems.
69//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000070
Torok Edwinb2b37c62009-06-30 17:10:35 +000071namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000072template<typename TgtInfo>
73class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000074protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000075 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000076 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000077public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000078 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000079 void getTargetDefines(const LangOptions &Opts,
80 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000081 TgtInfo::getTargetDefines(Opts, Builder);
82 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000083 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000084
85};
Chris Lattner30ba6742009-08-10 19:03:04 +000086
Eric Christopher7d0c7252015-09-24 21:17:04 +000087// CloudABI Target
88template <typename Target>
89class CloudABITargetInfo : public OSTargetInfo<Target> {
90protected:
91 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
92 MacroBuilder &Builder) const override {
93 Builder.defineMacro("__CloudABI__");
94 Builder.defineMacro("__ELF__");
95
96 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
97 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
98 Builder.defineMacro("__STDC_UTF_16__");
99 Builder.defineMacro("__STDC_UTF_32__");
100 }
101
102public:
103 CloudABITargetInfo(const llvm::Triple &Triple)
104 : OSTargetInfo<Target>(Triple) {
105 this->UserLabelPrefix = "";
106 }
107};
108
Daniel Dunbard86666f2010-01-26 01:44:04 +0000109static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000110 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000111 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000112 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000113 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000114 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000115 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000116 // AddressSanitizer doesn't play well with source fortification, which is on
117 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000118 if (Opts.Sanitize.has(SanitizerKind::Address))
119 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000120
John McCall5d36a8c2011-06-16 00:03:19 +0000121 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000122 // __weak is always defined, for use in blocks and with objc pointers.
123 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000124
John McCall31168b02011-06-15 23:02:42 +0000125 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000126 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000127 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
128 else
129 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000130
John McCall31168b02011-06-15 23:02:42 +0000131 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
132 // allow this in C, since one might have block pointers in structs that
133 // are used in pure C code and in Objective-C ARC.
134 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000135 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000136
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000137 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000138 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000139 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000141
142 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000143 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000144
Daniel Dunbarecf13562011-04-19 21:40:34 +0000145 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000146 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000147 if (Triple.isMacOSX()) {
148 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000149 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000151 Triple.getOSVersion(Maj, Min, Rev);
152 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000153 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000154
Sebastian Pop422377c2012-01-20 22:01:23 +0000155 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000156 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000157 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
158 if (PlatformName == "win32") {
159 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
160 return;
161 }
162
Evan Cheng31dd9a62014-01-26 23:12:43 +0000163 // Set the appropriate OS version define.
164 if (Triple.isiOS()) {
165 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
166 char Str[6];
167 Str[0] = '0' + Maj;
168 Str[1] = '0' + (Min / 10);
169 Str[2] = '0' + (Min % 10);
170 Str[3] = '0' + (Rev / 10);
171 Str[4] = '0' + (Rev % 10);
172 Str[5] = '\0';
Eric Christopher7d0c7252015-09-24 21:17:04 +0000173 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000174 } else if (Triple.isMacOSX()) {
175 // Note that the Driver allows versions which aren't representable in the
176 // define (because we only get a single digit for the minor and micro
177 // revision numbers). So, we limit them to the maximum representable
178 // version.
179 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000180 char Str[7];
181 if (Maj < 10 || (Maj == 10 && Min < 10)) {
182 Str[0] = '0' + (Maj / 10);
183 Str[1] = '0' + (Maj % 10);
184 Str[2] = '0' + std::min(Min, 9U);
185 Str[3] = '0' + std::min(Rev, 9U);
186 Str[4] = '\0';
187 } else {
188 // Handle versions > 10.9.
189 Str[0] = '0' + (Maj / 10);
190 Str[1] = '0' + (Maj % 10);
191 Str[2] = '0' + (Min / 10);
192 Str[3] = '0' + (Min % 10);
193 Str[4] = '0' + (Rev / 10);
194 Str[5] = '0' + (Rev % 10);
195 Str[6] = '\0';
196 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000198 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000199
Tim Northover157d9112014-01-16 08:48:16 +0000200 // Tell users about the kernel if there is one.
201 if (Triple.isOSDarwin())
202 Builder.defineMacro("__MACH__");
203
Daniel Dunbarecf13562011-04-19 21:40:34 +0000204 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000205}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000206
Torok Edwinb2b37c62009-06-30 17:10:35 +0000207template<typename Target>
208class DarwinTargetInfo : public OSTargetInfo<Target> {
209protected:
Craig Topper3164f332014-03-11 03:39:26 +0000210 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
211 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000212 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000213 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000214 }
Mike Stump11289f42009-09-09 15:08:12 +0000215
Torok Edwinb2b37c62009-06-30 17:10:35 +0000216public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000217 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
218 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
219 this->MCountName = "\01mcount";
220 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000221
Craig Topper3164f332014-03-11 03:39:26 +0000222 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000223 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000224 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000225 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000226 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000227 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000228 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000229 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000230
Craig Topper3164f332014-03-11 03:39:26 +0000231 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000232 // FIXME: We should return 0 when building kexts.
233 return "__TEXT,__StaticInit,regular,pure_instructions";
234 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000235
John McCalleed64c72012-01-29 01:20:30 +0000236 /// Darwin does not support protected visibility. Darwin's "default"
237 /// is very similar to ELF's "protected"; Darwin requires a "weak"
238 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000239 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000240 return false;
241 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000242};
243
Chris Lattner30ba6742009-08-10 19:03:04 +0000244
Torok Edwinb2b37c62009-06-30 17:10:35 +0000245// DragonFlyBSD Target
246template<typename Target>
247class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
248protected:
Craig Topper3164f332014-03-11 03:39:26 +0000249 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
250 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000251 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000252 Builder.defineMacro("__DragonFly__");
253 Builder.defineMacro("__DragonFly_cc_version", "100001");
254 Builder.defineMacro("__ELF__");
255 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
256 Builder.defineMacro("__tune_i386__");
257 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000258 }
259public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000260 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
261 : OSTargetInfo<Target>(Triple) {
262 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 switch (Triple.getArch()) {
265 default:
266 case llvm::Triple::x86:
267 case llvm::Triple::x86_64:
268 this->MCountName = ".mcount";
269 break;
270 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000271 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000272};
273
274// FreeBSD Target
275template<typename Target>
276class FreeBSDTargetInfo : public OSTargetInfo<Target> {
277protected:
Craig Topper3164f332014-03-11 03:39:26 +0000278 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
279 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000280 // FreeBSD defines; list based off of gcc output
281
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000282 unsigned Release = Triple.getOSMajorVersion();
283 if (Release == 0U)
284 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000285
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000286 Builder.defineMacro("__FreeBSD__", Twine(Release));
287 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000288 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
289 DefineStd(Builder, "unix", Opts);
290 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000291
292 // On FreeBSD, wchar_t contains the number of the code point as
293 // used by the character set of the locale. These character sets are
294 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000295 //
296 // FIXME: This is wrong; the macro refers to the numerical values
297 // of wchar_t *literals*, which are not locale-dependent. However,
298 // FreeBSD systems apparently depend on us getting this wrong, and
299 // setting this to 1 is conforming even if all the basic source
300 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000301 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000302 }
303public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000304 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
305 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000306
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000307 switch (Triple.getArch()) {
308 default:
309 case llvm::Triple::x86:
310 case llvm::Triple::x86_64:
311 this->MCountName = ".mcount";
312 break;
313 case llvm::Triple::mips:
314 case llvm::Triple::mipsel:
315 case llvm::Triple::ppc:
316 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000317 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000318 this->MCountName = "_mcount";
319 break;
320 case llvm::Triple::arm:
321 this->MCountName = "__mcount";
322 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000323 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000324 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000325};
326
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000327// GNU/kFreeBSD Target
328template<typename Target>
329class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
330protected:
Craig Topper3164f332014-03-11 03:39:26 +0000331 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
332 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000333 // GNU/kFreeBSD defines; list based off of gcc output
334
335 DefineStd(Builder, "unix", Opts);
336 Builder.defineMacro("__FreeBSD_kernel__");
337 Builder.defineMacro("__GLIBC__");
338 Builder.defineMacro("__ELF__");
339 if (Opts.POSIXThreads)
340 Builder.defineMacro("_REENTRANT");
341 if (Opts.CPlusPlus)
342 Builder.defineMacro("_GNU_SOURCE");
343 }
344public:
Eric Christopher917e9522014-11-18 22:36:15 +0000345 KFreeBSDTargetInfo(const llvm::Triple &Triple)
346 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000347 this->UserLabelPrefix = "";
348 }
349};
350
Chris Lattner3e2ee142010-07-07 16:01:42 +0000351// Minix Target
352template<typename Target>
353class MinixTargetInfo : public OSTargetInfo<Target> {
354protected:
Craig Topper3164f332014-03-11 03:39:26 +0000355 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
356 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000357 // Minix defines
358
359 Builder.defineMacro("__minix", "3");
360 Builder.defineMacro("_EM_WSIZE", "4");
361 Builder.defineMacro("_EM_PSIZE", "4");
362 Builder.defineMacro("_EM_SSIZE", "2");
363 Builder.defineMacro("_EM_LSIZE", "4");
364 Builder.defineMacro("_EM_FSIZE", "4");
365 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000366 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000367 DefineStd(Builder, "unix", Opts);
368 }
369public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000370 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
371 this->UserLabelPrefix = "";
372 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000373};
374
Torok Edwinb2b37c62009-06-30 17:10:35 +0000375// Linux target
376template<typename Target>
377class LinuxTargetInfo : public OSTargetInfo<Target> {
378protected:
Craig Topper3164f332014-03-11 03:39:26 +0000379 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
380 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000382 DefineStd(Builder, "unix", Opts);
383 DefineStd(Builder, "linux", Opts);
384 Builder.defineMacro("__gnu_linux__");
385 Builder.defineMacro("__ELF__");
Dan Albert84aee012015-03-03 18:28:38 +0000386 if (Triple.getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000387 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000388 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000389 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000390 this->PlatformName = "android";
391 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
392 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000393 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000394 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000395 if (Opts.CPlusPlus)
396 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000397 }
398public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000399 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000400 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000401 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000402
403 switch (Triple.getArch()) {
404 default:
405 break;
406 case llvm::Triple::ppc:
407 case llvm::Triple::ppc64:
408 case llvm::Triple::ppc64le:
409 this->MCountName = "_mcount";
410 break;
411 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000412 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000413
Craig Topper3164f332014-03-11 03:39:26 +0000414 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000415 return ".text.startup";
416 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000417};
418
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000419// NetBSD Target
420template<typename Target>
421class NetBSDTargetInfo : public OSTargetInfo<Target> {
422protected:
Craig Topper3164f332014-03-11 03:39:26 +0000423 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
424 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000425 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000426 Builder.defineMacro("__NetBSD__");
427 Builder.defineMacro("__unix__");
428 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000429 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000430 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000431
432 switch (Triple.getArch()) {
433 default:
434 break;
435 case llvm::Triple::arm:
436 case llvm::Triple::armeb:
437 case llvm::Triple::thumb:
438 case llvm::Triple::thumbeb:
439 Builder.defineMacro("__ARM_DWARF_EH__");
440 break;
441 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000442 }
443public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000444 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
445 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000446 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000447 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000448};
449
Torok Edwinb2b37c62009-06-30 17:10:35 +0000450// OpenBSD Target
451template<typename Target>
452class OpenBSDTargetInfo : public OSTargetInfo<Target> {
453protected:
Craig Topper3164f332014-03-11 03:39:26 +0000454 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
455 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000456 // OpenBSD defines; list based off of gcc output
457
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 Builder.defineMacro("__OpenBSD__");
459 DefineStd(Builder, "unix", Opts);
460 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000461 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000462 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000463 }
464public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000465 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
466 this->UserLabelPrefix = "";
467 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000468
Eli Friedman3715d1f2011-12-15 02:15:56 +0000469 switch (Triple.getArch()) {
470 default:
471 case llvm::Triple::x86:
472 case llvm::Triple::x86_64:
473 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000474 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000475 this->MCountName = "__mcount";
476 break;
477 case llvm::Triple::mips64:
478 case llvm::Triple::mips64el:
479 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000480 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000481 this->MCountName = "_mcount";
482 break;
483 }
484 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000485};
486
Eli Friedman9fa28852012-08-08 23:57:20 +0000487// Bitrig Target
488template<typename Target>
489class BitrigTargetInfo : public OSTargetInfo<Target> {
490protected:
Craig Topper3164f332014-03-11 03:39:26 +0000491 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
492 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000493 // Bitrig defines; list based off of gcc output
494
495 Builder.defineMacro("__Bitrig__");
496 DefineStd(Builder, "unix", Opts);
497 Builder.defineMacro("__ELF__");
498 if (Opts.POSIXThreads)
499 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000500
501 switch (Triple.getArch()) {
502 default:
503 break;
504 case llvm::Triple::arm:
505 case llvm::Triple::armeb:
506 case llvm::Triple::thumb:
507 case llvm::Triple::thumbeb:
508 Builder.defineMacro("__ARM_DWARF_EH__");
509 break;
510 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000511 }
512public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000513 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
514 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000515 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000516 }
517};
518
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000519// PSP Target
520template<typename Target>
521class PSPTargetInfo : public OSTargetInfo<Target> {
522protected:
Craig Topper3164f332014-03-11 03:39:26 +0000523 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
524 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000525 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000526 Builder.defineMacro("PSP");
527 Builder.defineMacro("_PSP");
528 Builder.defineMacro("__psp__");
529 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000530 }
531public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000532 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000533 this->UserLabelPrefix = "";
534 }
535};
536
John Thompsone467e192009-11-19 17:18:50 +0000537// PS3 PPU Target
538template<typename Target>
539class PS3PPUTargetInfo : public OSTargetInfo<Target> {
540protected:
Craig Topper3164f332014-03-11 03:39:26 +0000541 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
542 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000543 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000544 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000545 Builder.defineMacro("__PPU__");
546 Builder.defineMacro("__CELLOS_LV2__");
547 Builder.defineMacro("__ELF__");
548 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000549 Builder.defineMacro("_ARCH_PPC64");
550 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000551 }
552public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000553 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000554 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000555 this->LongWidth = this->LongAlign = 32;
556 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000557 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000558 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000559 this->SizeType = TargetInfo::UnsignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +0000560 this->DataLayoutString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000561 }
562};
563
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000564template <typename Target>
565class PS4OSTargetInfo : public OSTargetInfo<Target> {
566protected:
567 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
568 MacroBuilder &Builder) const override {
569 Builder.defineMacro("__FreeBSD__", "9");
570 Builder.defineMacro("__FreeBSD_cc_version", "900001");
571 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
572 DefineStd(Builder, "unix", Opts);
573 Builder.defineMacro("__ELF__");
574 Builder.defineMacro("__PS4__");
575 }
576public:
577 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
578 this->WCharType = this->UnsignedShort;
579
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000580 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
581 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000582 this->UserLabelPrefix = "";
583
584 switch (Triple.getArch()) {
585 default:
586 case llvm::Triple::x86_64:
587 this->MCountName = ".mcount";
588 break;
589 }
590 }
591};
592
Torok Edwinb2b37c62009-06-30 17:10:35 +0000593// Solaris target
594template<typename Target>
595class SolarisTargetInfo : public OSTargetInfo<Target> {
596protected:
Craig Topper3164f332014-03-11 03:39:26 +0000597 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
598 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000599 DefineStd(Builder, "sun", Opts);
600 DefineStd(Builder, "unix", Opts);
601 Builder.defineMacro("__ELF__");
602 Builder.defineMacro("__svr4__");
603 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000604 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
605 // newer, but to 500 for everything else. feature_test.h has a check to
606 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000607 // with a new version.
608 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000609 Builder.defineMacro("_XOPEN_SOURCE", "600");
610 else
611 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000612 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000613 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000614 Builder.defineMacro("_LARGEFILE_SOURCE");
615 Builder.defineMacro("_LARGEFILE64_SOURCE");
616 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000617 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000618 }
619public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000620 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000621 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000622 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000623 // FIXME: WIntType should be SignedLong
624 }
625};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000626
627// Windows target
628template<typename Target>
629class WindowsTargetInfo : public OSTargetInfo<Target> {
630protected:
Craig Topper3164f332014-03-11 03:39:26 +0000631 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
632 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000633 Builder.defineMacro("_WIN32");
634 }
635 void getVisualStudioDefines(const LangOptions &Opts,
636 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000637 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000638 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000639 Builder.defineMacro("_CPPRTTI");
640
Reid Kleckner16514352015-01-30 21:42:55 +0000641 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000642 Builder.defineMacro("_CPPUNWIND");
643 }
644
David Majnemer6a658902015-07-22 22:36:26 +0000645 if (Opts.Bool)
646 Builder.defineMacro("__BOOL_DEFINED");
647
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000648 if (!Opts.CharIsSigned)
649 Builder.defineMacro("_CHAR_UNSIGNED");
650
651 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
652 // but it works for now.
653 if (Opts.POSIXThreads)
654 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000655
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000656 if (Opts.MSCompatibilityVersion) {
657 Builder.defineMacro("_MSC_VER",
658 Twine(Opts.MSCompatibilityVersion / 100000));
659 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000660 // FIXME We cannot encode the revision information into 32-bits
661 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000662
David Majnemerb710a932015-05-11 03:57:49 +0000663 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000664 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000665 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000666
667 if (Opts.MicrosoftExt) {
668 Builder.defineMacro("_MSC_EXTENSIONS");
669
670 if (Opts.CPlusPlus11) {
671 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
672 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
673 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
674 }
675 }
676
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000677 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000678 }
679
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000680public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000681 WindowsTargetInfo(const llvm::Triple &Triple)
682 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000683};
684
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000685template <typename Target>
686class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000687protected:
Craig Topper3164f332014-03-11 03:39:26 +0000688 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
689 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000690 if (Opts.POSIXThreads)
691 Builder.defineMacro("_REENTRANT");
692 if (Opts.CPlusPlus)
693 Builder.defineMacro("_GNU_SOURCE");
694
695 DefineStd(Builder, "unix", Opts);
696 Builder.defineMacro("__ELF__");
697 Builder.defineMacro("__native_client__");
698 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000699
700public:
701 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000702 this->UserLabelPrefix = "";
703 this->LongAlign = 32;
704 this->LongWidth = 32;
705 this->PointerAlign = 32;
706 this->PointerWidth = 32;
707 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000708 this->Int64Type = TargetInfo::SignedLongLong;
709 this->DoubleAlign = 64;
710 this->LongDoubleWidth = 64;
711 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000712 this->LongLongWidth = 64;
713 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000714 this->SizeType = TargetInfo::UnsignedInt;
715 this->PtrDiffType = TargetInfo::SignedInt;
716 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000717 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000718 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000719 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000720 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000721 } else if (Triple.getArch() == llvm::Triple::x86) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000722 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000723 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000724 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000725 } else if (Triple.getArch() == llvm::Triple::mipsel) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000726 // Handled on mips' setDataLayoutString.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000727 } else {
728 assert(Triple.getArch() == llvm::Triple::le32);
Eric Christopher964a5f32015-08-05 23:48:05 +0000729 this->DataLayoutString = "e-p:32:32-i64:64";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000730 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000731 }
732};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000733
Dan Gohmanc2853072015-09-03 22:51:53 +0000734// WebAssembly target
735template <typename Target>
736class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
737 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000738 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000739 // A common platform macro.
740 if (Opts.POSIXThreads)
741 Builder.defineMacro("_REENTRANT");
742 // Follow g++ convention and predefine _GNU_SOURCE for C++.
743 if (Opts.CPlusPlus)
744 Builder.defineMacro("_GNU_SOURCE");
745 }
746
747 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000748 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000749 return ".text.__startup";
750 }
751
752public:
753 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
754 : OSTargetInfo<Target>(Triple) {
755 this->MCountName = "__mcount";
756 this->UserLabelPrefix = "";
757 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
758 }
759};
Dan Gohmanc2853072015-09-03 22:51:53 +0000760
Chris Lattner09d98f52008-10-05 21:50:58 +0000761//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000762// Specific target implementations.
763//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000764
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000765// PPC abstract base class
766class PPCTargetInfo : public TargetInfo {
767 static const Builtin::Info BuiltinInfo[];
768 static const char * const GCCRegNames[];
769 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000770 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000771
772 // Target cpu features.
773 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000774 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000775 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000776 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000777 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000778 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000779 bool HasBPERMD;
780 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000781
Ulrich Weigand8afad612014-07-28 13:17:52 +0000782protected:
783 std::string ABI;
784
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000785public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000786 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000787 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000788 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000789 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000790 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000791 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000792 LongDoubleWidth = LongDoubleAlign = 128;
793 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
794 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000795
Hal Finkel6b984f02012-07-03 16:51:04 +0000796 /// \brief Flags for architecture specific defines.
797 typedef enum {
798 ArchDefineNone = 0,
799 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
800 ArchDefinePpcgr = 1 << 1,
801 ArchDefinePpcsq = 1 << 2,
802 ArchDefine440 = 1 << 3,
803 ArchDefine603 = 1 << 4,
804 ArchDefine604 = 1 << 5,
805 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000806 ArchDefinePwr5 = 1 << 7,
807 ArchDefinePwr5x = 1 << 8,
808 ArchDefinePwr6 = 1 << 9,
809 ArchDefinePwr6x = 1 << 10,
810 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000811 ArchDefinePwr8 = 1 << 12,
812 ArchDefineA2 = 1 << 13,
813 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000814 } ArchDefineTypes;
815
Bill Schmidt38378a02013-02-01 20:23:10 +0000816 // Note: GCC recognizes the following additional cpus:
817 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
818 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
819 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000820 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000821 bool CPUKnown = llvm::StringSwitch<bool>(Name)
822 .Case("generic", true)
823 .Case("440", true)
824 .Case("450", true)
825 .Case("601", true)
826 .Case("602", true)
827 .Case("603", true)
828 .Case("603e", true)
829 .Case("603ev", true)
830 .Case("604", true)
831 .Case("604e", true)
832 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000833 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000834 .Case("g3", true)
835 .Case("7400", true)
836 .Case("g4", true)
837 .Case("7450", true)
838 .Case("g4+", true)
839 .Case("750", true)
840 .Case("970", true)
841 .Case("g5", true)
842 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000843 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000844 .Case("e500mc", true)
845 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000846 .Case("power3", true)
847 .Case("pwr3", true)
848 .Case("power4", true)
849 .Case("pwr4", true)
850 .Case("power5", true)
851 .Case("pwr5", true)
852 .Case("power5x", true)
853 .Case("pwr5x", true)
854 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000855 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000856 .Case("power6x", true)
857 .Case("pwr6x", true)
858 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000859 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000860 .Case("power8", true)
861 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000862 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000863 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000864 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000865 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000866 .Case("powerpc64le", true)
867 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000868 .Default(false);
869
870 if (CPUKnown)
871 CPU = Name;
872
873 return CPUKnown;
874 }
875
Ulrich Weigand8afad612014-07-28 13:17:52 +0000876
877 StringRef getABI() const override { return ABI; }
878
Craig Topper3164f332014-03-11 03:39:26 +0000879 void getTargetBuiltins(const Builtin::Info *&Records,
880 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000881 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000882 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000883 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000884
Craig Topper3164f332014-03-11 03:39:26 +0000885 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000886
Craig Topper3164f332014-03-11 03:39:26 +0000887 void getTargetDefines(const LangOptions &Opts,
888 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000889
Eric Christopheref1e2952015-08-28 02:13:58 +0000890 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
891 StringRef CPU,
Eric Christopher007b0a02015-08-28 22:32:01 +0000892 std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000893
Craig Topper3164f332014-03-11 03:39:26 +0000894 bool handleTargetFeatures(std::vector<std::string> &Features,
895 DiagnosticsEngine &Diags) override;
896 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000897 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
898 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000899
900 void getGCCRegNames(const char * const *&Names,
901 unsigned &NumNames) const override;
902 void getGCCRegAliases(const GCCRegAlias *&Aliases,
903 unsigned &NumAliases) const override;
904 bool validateAsmConstraint(const char *&Name,
905 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000906 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000907 default: return false;
908 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000909 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000910 case 'b': // Base register
911 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000912 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000913 break;
914 // FIXME: The following are added to allow parsing.
915 // I just took a guess at what the actions should be.
916 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000917 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000918 case 'v': // Altivec vector register
919 Info.setAllowsRegister();
920 break;
921 case 'w':
922 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000923 case 'd':// VSX vector register to hold vector double data
924 case 'f':// VSX vector register to hold vector float data
925 case 's':// VSX vector register to hold scalar float data
926 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000927 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000928 break;
929 default:
930 return false;
931 }
932 Info.setAllowsRegister();
933 Name++; // Skip over 'w'.
934 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000935 case 'h': // `MQ', `CTR', or `LINK' register
936 case 'q': // `MQ' register
937 case 'c': // `CTR' register
938 case 'l': // `LINK' register
939 case 'x': // `CR' register (condition register) number 0
940 case 'y': // `CR' register (condition register)
941 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000942 Info.setAllowsRegister();
943 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000944 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000945 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000946 // (use `L' instead for SImode constants)
947 case 'K': // Unsigned 16-bit constant
948 case 'L': // Signed 16-bit constant shifted left 16 bits
949 case 'M': // Constant larger than 31
950 case 'N': // Exact power of 2
951 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000952 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000953 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000954 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000955 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000956 break;
957 case 'm': // Memory operand. Note that on PowerPC targets, m can
958 // include addresses that update the base register. It
959 // is therefore only safe to use `m' in an asm statement
960 // if that asm statement accesses the operand exactly once.
961 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000962 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000963 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000964 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000965 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000966 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
967 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000968 // register to be updated.
969 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000970 if (Name[1] != 's')
971 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000972 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000973 // include any automodification of the base register. Unlike
974 // `m', this constraint can be used in asm statements that
975 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000976 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000977 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000978 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000979 break;
980 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000981 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000982 case 'Z': // Memory operand that is an indexed or indirect from a
983 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000984 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000985 Info.setAllowsMemory();
986 Info.setAllowsRegister();
987 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000988 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000989 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000990 // register (`p' is preferable for asm statements)
991 case 'S': // Constant suitable as a 64-bit mask operand
992 case 'T': // Constant suitable as a 32-bit mask operand
993 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000994 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000995 // instructions
996 case 'W': // Vector constant that does not require memory
997 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000998 break;
999 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001000 }
John Thompson07a61a42010-06-24 22:44:13 +00001001 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001002 }
Craig Topper3164f332014-03-11 03:39:26 +00001003 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001004 std::string R;
1005 switch (*Constraint) {
1006 case 'e':
1007 case 'w':
1008 // Two-character constraint; add "^" hint for later parsing.
1009 R = std::string("^") + std::string(Constraint, 2);
1010 Constraint++;
1011 break;
1012 default:
1013 return TargetInfo::convertConstraint(Constraint);
1014 }
1015 return R;
1016 }
Craig Topper3164f332014-03-11 03:39:26 +00001017 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001018 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001019 }
Craig Topper3164f332014-03-11 03:39:26 +00001020 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001021 if (RegNo == 0) return 3;
1022 if (RegNo == 1) return 4;
1023 return -1;
1024 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001025
1026 bool hasSjLjLowering() const override {
1027 return true;
1028 }
David Majnemer2617ea62015-06-09 18:05:33 +00001029
1030 bool useFloat128ManglingForLongDouble() const override {
1031 return LongDoubleWidth == 128 &&
1032 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1033 getTriple().isOSBinFormatELF();
1034 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001035};
Anders Carlssonf511f642007-11-27 04:11:28 +00001036
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001037const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001038#define BUILTIN(ID, TYPE, ATTRS) \
1039 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1040#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1041 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001042#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001043};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001044
Eric Christopher917e9522014-11-18 22:36:15 +00001045/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001046/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001047bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001048 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001049 for (const auto &Feature : Features) {
1050 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001051 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001052 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001053 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001054 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001055 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001056 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001057 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001058 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001059 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001060 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001061 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001062 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001063 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001064 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001065 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001066 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001067 // TODO: Finish this list and add an assert that we've handled them
1068 // all.
1069 }
Eric Christopher02c33352015-08-25 00:59:11 +00001070
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001071 return true;
1072}
1073
Chris Lattnerecd49032009-03-02 22:27:17 +00001074/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1075/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001076void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001077 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001078 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001079 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001080 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001081 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001082 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001083 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001084 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001085 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001086 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001087 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001088 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001089 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001090
Chris Lattnerecd49032009-03-02 22:27:17 +00001091 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001092 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1093 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001094 } else {
1095 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1096 getTriple().getOS() != llvm::Triple::OpenBSD)
1097 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001098 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001099
Ulrich Weigand8afad612014-07-28 13:17:52 +00001100 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001101 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001102 Builder.defineMacro("_CALL_ELF", "1");
1103 if (ABI == "elfv2")
1104 Builder.defineMacro("_CALL_ELF", "2");
1105
Chris Lattnerecd49032009-03-02 22:27:17 +00001106 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001107 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1108 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001109
Chris Lattnerecd49032009-03-02 22:27:17 +00001110 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001111 if (LongDoubleWidth == 128)
1112 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001113
John Thompsone467e192009-11-19 17:18:50 +00001114 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001115 Builder.defineMacro("__VEC__", "10206");
1116 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001117 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001118
1119 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001120 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1121 .Case("440", ArchDefineName)
1122 .Case("450", ArchDefineName | ArchDefine440)
1123 .Case("601", ArchDefineName)
1124 .Case("602", ArchDefineName | ArchDefinePpcgr)
1125 .Case("603", ArchDefineName | ArchDefinePpcgr)
1126 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1127 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1128 .Case("604", ArchDefineName | ArchDefinePpcgr)
1129 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1130 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001131 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001132 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1133 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1134 .Case("750", ArchDefineName | ArchDefinePpcgr)
1135 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1136 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001137 .Case("a2", ArchDefineA2)
1138 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001139 .Case("pwr3", ArchDefinePpcgr)
1140 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1141 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1142 | ArchDefinePpcsq)
1143 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1144 | ArchDefinePpcgr | ArchDefinePpcsq)
1145 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1146 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1147 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1148 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1149 | ArchDefinePpcsq)
1150 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1151 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001152 | ArchDefinePpcgr | ArchDefinePpcsq)
1153 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1154 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1155 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001156 .Case("power3", ArchDefinePpcgr)
1157 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1158 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1159 | ArchDefinePpcsq)
1160 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1161 | ArchDefinePpcgr | ArchDefinePpcsq)
1162 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1163 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1164 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1165 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1166 | ArchDefinePpcsq)
1167 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1168 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001169 | ArchDefinePpcgr | ArchDefinePpcsq)
1170 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1171 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1172 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001173 .Default(ArchDefineNone);
1174
1175 if (defs & ArchDefineName)
1176 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1177 if (defs & ArchDefinePpcgr)
1178 Builder.defineMacro("_ARCH_PPCGR");
1179 if (defs & ArchDefinePpcsq)
1180 Builder.defineMacro("_ARCH_PPCSQ");
1181 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001182 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001183 if (defs & ArchDefine603)
1184 Builder.defineMacro("_ARCH_603");
1185 if (defs & ArchDefine604)
1186 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001187 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001188 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001189 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001190 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001191 if (defs & ArchDefinePwr5x)
1192 Builder.defineMacro("_ARCH_PWR5X");
1193 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001194 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001195 if (defs & ArchDefinePwr6x)
1196 Builder.defineMacro("_ARCH_PWR6X");
1197 if (defs & ArchDefinePwr7)
1198 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001199 if (defs & ArchDefinePwr8)
1200 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001201 if (defs & ArchDefineA2)
1202 Builder.defineMacro("_ARCH_A2");
1203 if (defs & ArchDefineA2q) {
1204 Builder.defineMacro("_ARCH_A2Q");
1205 Builder.defineMacro("_ARCH_QP");
1206 }
1207
1208 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1209 Builder.defineMacro("__bg__");
1210 Builder.defineMacro("__THW_BLUEGENE__");
1211 Builder.defineMacro("__bgq__");
1212 Builder.defineMacro("__TOS_BGQ__");
1213 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001214
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001215 if (HasVSX)
1216 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001217 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001218 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001219 if (HasP8Crypto)
1220 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001221 if (HasHTM)
1222 Builder.defineMacro("__HTM__");
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001223 if (getTriple().getArch() == llvm::Triple::ppc64le ||
Nemanja Ivanovice97e1112015-05-14 20:02:24 +00001224 (defs & ArchDefinePwr8) || (CPU == "pwr8")) {
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001225 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");
1230 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001231
Bill Schmidt38378a02013-02-01 20:23:10 +00001232 // FIXME: The following are not yet generated here by Clang, but are
1233 // generated by GCC:
1234 //
1235 // _SOFT_FLOAT_
1236 // __RECIP_PRECISION__
1237 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001238 // __RECIP__
1239 // __RECIPF__
1240 // __RSQRTE__
1241 // __RSQRTEF__
1242 // _SOFT_DOUBLE_
1243 // __NO_LWSYNC__
1244 // __HAVE_BSWAP__
1245 // __LONGDOUBLE128
1246 // __CMODEL_MEDIUM__
1247 // __CMODEL_LARGE__
1248 // _CALL_SYSV
1249 // _CALL_DARWIN
1250 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001251}
1252
Eric Christophera8a14c32015-08-31 18:39:16 +00001253// Handle explicit options being passed to the compiler here: if we've
1254// explicitly turned off vsx and turned on power8-vector or direct-move then
1255// go ahead and error since the customer has expressed a somewhat incompatible
1256// set of options.
1257static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
1258 std::vector<std::string> &FeaturesVec) {
1259
1260 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1261 FeaturesVec.end()) {
1262 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1263 FeaturesVec.end()) {
1264 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1265 << "-mno-vsx";
1266 return false;
1267 }
1268
1269 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1270 FeaturesVec.end()) {
1271 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1272 << "-mno-vsx";
1273 return false;
1274 }
1275 }
1276
1277 return true;
1278}
1279
1280bool PPCTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
1281 DiagnosticsEngine &Diags, StringRef CPU,
1282 std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001283 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1284 .Case("7400", true)
1285 .Case("g4", true)
1286 .Case("7450", true)
1287 .Case("g4+", true)
1288 .Case("970", true)
1289 .Case("g5", true)
1290 .Case("pwr6", true)
1291 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001292 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001293 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001294 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001295 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001296
1297 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001298 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1299 .Case("ppc64le", true)
1300 .Case("pwr8", true)
1301 .Default(false);
1302 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1303 .Case("ppc64le", true)
1304 .Case("pwr8", true)
1305 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001306 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1307 .Case("ppc64le", true)
1308 .Case("pwr8", true)
1309 .Case("pwr7", true)
1310 .Default(false);
1311 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1312 .Case("ppc64le", true)
1313 .Case("pwr8", true)
1314 .Case("pwr7", true)
1315 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001316 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1317 .Case("ppc64le", true)
1318 .Case("pwr8", true)
1319 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001320 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1321 .Case("ppc64le", true)
1322 .Case("pwr8", true)
1323 .Case("pwr7", true)
1324 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001325
Eric Christophera8a14c32015-08-31 18:39:16 +00001326 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1327 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001328
Eric Christopher007b0a02015-08-28 22:32:01 +00001329 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001330}
1331
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001332bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001333 return llvm::StringSwitch<bool>(Feature)
1334 .Case("powerpc", true)
1335 .Case("vsx", HasVSX)
1336 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001337 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001338 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001339 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001340 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001341 .Case("bpermd", HasBPERMD)
1342 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001343 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001344}
Chris Lattner17df24e2008-04-21 18:56:49 +00001345
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001346void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1347 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001348 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1349 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1350 // incompatible options.
1351 if (Enabled) {
1352 if (Name == "vsx") {
1353 Features[Name] = true;
1354 } else if (Name == "direct-move") {
1355 Features[Name] = Features["vsx"] = true;
1356 } else if (Name == "power8-vector") {
1357 Features[Name] = Features["vsx"] = true;
1358 } else {
1359 Features[Name] = true;
1360 }
1361 } else {
1362 if (Name == "vsx") {
1363 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1364 false;
1365 } else {
1366 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001367 }
1368 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001369}
1370
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001371const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001372 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1373 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1374 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1375 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1376 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1377 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1378 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1379 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001380 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001381 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001382 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001383 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1384 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1385 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1386 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001387 "vrsave", "vscr",
1388 "spe_acc", "spefscr",
1389 "sfp"
1390};
Chris Lattner10a5b382007-01-29 05:24:35 +00001391
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001392void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001393 unsigned &NumNames) const {
1394 Names = GCCRegNames;
1395 NumNames = llvm::array_lengthof(GCCRegNames);
1396}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001397
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001398const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1399 // While some of these aliases do map to different registers
1400 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001401 { { "0" }, "r0" },
1402 { { "1"}, "r1" },
1403 { { "2" }, "r2" },
1404 { { "3" }, "r3" },
1405 { { "4" }, "r4" },
1406 { { "5" }, "r5" },
1407 { { "6" }, "r6" },
1408 { { "7" }, "r7" },
1409 { { "8" }, "r8" },
1410 { { "9" }, "r9" },
1411 { { "10" }, "r10" },
1412 { { "11" }, "r11" },
1413 { { "12" }, "r12" },
1414 { { "13" }, "r13" },
1415 { { "14" }, "r14" },
1416 { { "15" }, "r15" },
1417 { { "16" }, "r16" },
1418 { { "17" }, "r17" },
1419 { { "18" }, "r18" },
1420 { { "19" }, "r19" },
1421 { { "20" }, "r20" },
1422 { { "21" }, "r21" },
1423 { { "22" }, "r22" },
1424 { { "23" }, "r23" },
1425 { { "24" }, "r24" },
1426 { { "25" }, "r25" },
1427 { { "26" }, "r26" },
1428 { { "27" }, "r27" },
1429 { { "28" }, "r28" },
1430 { { "29" }, "r29" },
1431 { { "30" }, "r30" },
1432 { { "31" }, "r31" },
1433 { { "fr0" }, "f0" },
1434 { { "fr1" }, "f1" },
1435 { { "fr2" }, "f2" },
1436 { { "fr3" }, "f3" },
1437 { { "fr4" }, "f4" },
1438 { { "fr5" }, "f5" },
1439 { { "fr6" }, "f6" },
1440 { { "fr7" }, "f7" },
1441 { { "fr8" }, "f8" },
1442 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001443 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001444 { { "fr11" }, "f11" },
1445 { { "fr12" }, "f12" },
1446 { { "fr13" }, "f13" },
1447 { { "fr14" }, "f14" },
1448 { { "fr15" }, "f15" },
1449 { { "fr16" }, "f16" },
1450 { { "fr17" }, "f17" },
1451 { { "fr18" }, "f18" },
1452 { { "fr19" }, "f19" },
1453 { { "fr20" }, "f20" },
1454 { { "fr21" }, "f21" },
1455 { { "fr22" }, "f22" },
1456 { { "fr23" }, "f23" },
1457 { { "fr24" }, "f24" },
1458 { { "fr25" }, "f25" },
1459 { { "fr26" }, "f26" },
1460 { { "fr27" }, "f27" },
1461 { { "fr28" }, "f28" },
1462 { { "fr29" }, "f29" },
1463 { { "fr30" }, "f30" },
1464 { { "fr31" }, "f31" },
1465 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001466};
1467
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001468void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001469 unsigned &NumAliases) const {
1470 Aliases = GCCRegAliases;
1471 NumAliases = llvm::array_lengthof(GCCRegAliases);
1472}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001473
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001474class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001475public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001476 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001477 DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001478
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001479 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001480 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001481 case llvm::Triple::FreeBSD:
1482 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001483 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001484 PtrDiffType = SignedInt;
1485 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001486 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001487 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001488 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001489 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001490
Roman Divacky3ffe7462012-03-13 19:20:17 +00001491 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1492 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001493 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001494 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001495
1496 // PPC32 supports atomics up to 4 bytes.
1497 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001498 }
1499
Craig Topper3164f332014-03-11 03:39:26 +00001500 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001501 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001502 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001503 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001504};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001505
Bill Schmidt778d3872013-07-26 01:36:11 +00001506// Note: ABI differences may eventually require us to have a separate
1507// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001508class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001509public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001510 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001511 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001512 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001513 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001514
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001515 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001516 DataLayoutString = "e-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001517 ABI = "elfv2";
1518 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001519 DataLayoutString = "E-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001520 ABI = "elfv1";
1521 }
1522
1523 switch (getTriple().getOS()) {
1524 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001525 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001526 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001527 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001528 case llvm::Triple::NetBSD:
1529 IntMaxType = SignedLongLong;
1530 Int64Type = SignedLongLong;
1531 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001532 default:
1533 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001534 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001535
1536 // PPC64 supports atomics up to 8 bytes.
1537 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001538 }
Craig Topper3164f332014-03-11 03:39:26 +00001539 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001540 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001541 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001542 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001543 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001544 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001545 ABI = Name;
1546 return true;
1547 }
1548 return false;
1549 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001550};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001551
Roman Divacky965b0b72011-01-06 08:27:10 +00001552class DarwinPPC32TargetInfo :
1553 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001554public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001555 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1556 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001557 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001558 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001559 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001560 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001561 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001562 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001563 }
Craig Topper3164f332014-03-11 03:39:26 +00001564 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001565 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001566 }
1567};
1568
1569class DarwinPPC64TargetInfo :
1570 public DarwinTargetInfo<PPC64TargetInfo> {
1571public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001572 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1573 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001574 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001575 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001576 DataLayoutString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001577 }
1578};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001579
Eric Christopherc48497a2015-09-18 21:26:24 +00001580static const unsigned NVPTXAddrSpaceMap[] = {
1581 1, // opencl_global
1582 3, // opencl_local
1583 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001584 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001585 0, // opencl_generic
1586 1, // cuda_device
1587 4, // cuda_constant
1588 3, // cuda_shared
1589};
1590
1591class NVPTXTargetInfo : public TargetInfo {
1592 static const char *const GCCRegNames[];
1593 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001594
1595 // The GPU profiles supported by the NVPTX backend
1596 enum GPUKind {
1597 GK_NONE,
1598 GK_SM20,
1599 GK_SM21,
1600 GK_SM30,
1601 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001602 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001603 } GPU;
1604
Eric Christopherc48497a2015-09-18 21:26:24 +00001605public:
1606 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1607 BigEndian = false;
1608 TLSSupported = false;
1609 LongWidth = LongAlign = 64;
1610 AddrSpaceMap = &NVPTXAddrSpaceMap;
1611 UseAddrSpaceMapMangling = true;
1612 // Define available target features
1613 // These must be defined in sorted order!
1614 NoAsmVariants = true;
1615 // Set the default GPU to sm20
1616 GPU = GK_SM20;
1617 }
1618 void getTargetDefines(const LangOptions &Opts,
1619 MacroBuilder &Builder) const override {
1620 Builder.defineMacro("__PTX__");
1621 Builder.defineMacro("__NVPTX__");
1622 if (Opts.CUDAIsDevice) {
1623 // Set __CUDA_ARCH__ for the GPU specified.
1624 std::string CUDAArchCode;
1625 switch (GPU) {
1626 case GK_SM20:
1627 CUDAArchCode = "200";
1628 break;
1629 case GK_SM21:
1630 CUDAArchCode = "210";
1631 break;
1632 case GK_SM30:
1633 CUDAArchCode = "300";
1634 break;
1635 case GK_SM35:
1636 CUDAArchCode = "350";
1637 break;
1638 case GK_SM37:
1639 CUDAArchCode = "370";
1640 break;
1641 default:
1642 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001643 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001644 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001645 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001646 }
1647 void getTargetBuiltins(const Builtin::Info *&Records,
1648 unsigned &NumRecords) const override {
1649 Records = BuiltinInfo;
1650 NumRecords = clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin;
1651 }
1652 bool hasFeature(StringRef Feature) const override {
1653 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001654 }
1655
Eric Christopherc48497a2015-09-18 21:26:24 +00001656 void getGCCRegNames(const char *const *&Names,
1657 unsigned &NumNames) const override;
1658 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1659 unsigned &NumAliases) const override {
1660 // No aliases.
1661 Aliases = nullptr;
1662 NumAliases = 0;
1663 }
1664 bool validateAsmConstraint(const char *&Name,
1665 TargetInfo::ConstraintInfo &Info) const override {
1666 switch (*Name) {
1667 default:
1668 return false;
1669 case 'c':
1670 case 'h':
1671 case 'r':
1672 case 'l':
1673 case 'f':
1674 case 'd':
1675 Info.setAllowsRegister();
1676 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001677 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001678 }
1679 const char *getClobbers() const override {
1680 // FIXME: Is this really right?
1681 return "";
1682 }
1683 BuiltinVaListKind getBuiltinVaListKind() const override {
1684 // FIXME: implement
1685 return TargetInfo::CharPtrBuiltinVaList;
1686 }
1687 bool setCPU(const std::string &Name) override {
1688 GPU = llvm::StringSwitch<GPUKind>(Name)
1689 .Case("sm_20", GK_SM20)
1690 .Case("sm_21", GK_SM21)
1691 .Case("sm_30", GK_SM30)
1692 .Case("sm_35", GK_SM35)
1693 .Case("sm_37", GK_SM37)
1694 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001695
Eric Christopherc48497a2015-09-18 21:26:24 +00001696 return GPU != GK_NONE;
1697 }
1698};
1699
1700const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1701#define BUILTIN(ID, TYPE, ATTRS) \
1702 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1703#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1704 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1705#include "clang/Basic/BuiltinsNVPTX.def"
1706};
1707
1708const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1709
1710void NVPTXTargetInfo::getGCCRegNames(const char *const *&Names,
1711 unsigned &NumNames) const {
1712 Names = GCCRegNames;
1713 NumNames = llvm::array_lengthof(GCCRegNames);
1714}
1715
1716class NVPTX32TargetInfo : public NVPTXTargetInfo {
1717public:
1718 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1719 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
Chris Lattner96e43572009-03-02 22:40:39 +00002063 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00002064 enum MMX3DNowEnum {
2065 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
2066 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002067 enum XOPEnum {
2068 NoXOP,
2069 SSE4A,
2070 FMA4,
2071 XOP
2072 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00002073
Eric Christophere1ddaf92010-04-02 23:50:19 +00002074 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00002075 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00002076 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00002077 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00002078 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00002079 bool HasBMI;
2080 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00002081 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00002082 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00002083 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00002084 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00002085 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002086 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00002087 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00002088 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00002089 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
2090 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00002091 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002092 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002093
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002094 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2095 ///
2096 /// Each enumeration represents a particular CPU supported by Clang. These
2097 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2098 enum CPUKind {
2099 CK_Generic,
2100
2101 /// \name i386
2102 /// i386-generation processors.
2103 //@{
2104 CK_i386,
2105 //@}
2106
2107 /// \name i486
2108 /// i486-generation processors.
2109 //@{
2110 CK_i486,
2111 CK_WinChipC6,
2112 CK_WinChip2,
2113 CK_C3,
2114 //@}
2115
2116 /// \name i586
2117 /// i586-generation processors, P5 microarchitecture based.
2118 //@{
2119 CK_i586,
2120 CK_Pentium,
2121 CK_PentiumMMX,
2122 //@}
2123
2124 /// \name i686
2125 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2126 //@{
2127 CK_i686,
2128 CK_PentiumPro,
2129 CK_Pentium2,
2130 CK_Pentium3,
2131 CK_Pentium3M,
2132 CK_PentiumM,
2133 CK_C3_2,
2134
2135 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2136 /// Clang however has some logic to suport this.
2137 // FIXME: Warn, deprecate, and potentially remove this.
2138 CK_Yonah,
2139 //@}
2140
2141 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002142 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002143 //@{
2144 CK_Pentium4,
2145 CK_Pentium4M,
2146 CK_Prescott,
2147 CK_Nocona,
2148 //@}
2149
2150 /// \name Core
2151 /// Core microarchitecture based processors.
2152 //@{
2153 CK_Core2,
2154
2155 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2156 /// codename which GCC no longer accepts as an option to -march, but Clang
2157 /// has some logic for recognizing it.
2158 // FIXME: Warn, deprecate, and potentially remove this.
2159 CK_Penryn,
2160 //@}
2161
2162 /// \name Atom
2163 /// Atom processors
2164 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002165 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002166 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002167 //@}
2168
2169 /// \name Nehalem
2170 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002171 CK_Nehalem,
2172
2173 /// \name Westmere
2174 /// Westmere microarchitecture based processors.
2175 CK_Westmere,
2176
2177 /// \name Sandy Bridge
2178 /// Sandy Bridge microarchitecture based processors.
2179 CK_SandyBridge,
2180
2181 /// \name Ivy Bridge
2182 /// Ivy Bridge microarchitecture based processors.
2183 CK_IvyBridge,
2184
2185 /// \name Haswell
2186 /// Haswell microarchitecture based processors.
2187 CK_Haswell,
2188
2189 /// \name Broadwell
2190 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002191 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002192
2193 /// \name Skylake
2194 /// Skylake microarchitecture based processors.
2195 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002196
Craig Topper449314e2013-08-20 07:09:39 +00002197 /// \name Knights Landing
2198 /// Knights Landing processor.
2199 CK_KNL,
2200
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002201 /// \name K6
2202 /// K6 architecture processors.
2203 //@{
2204 CK_K6,
2205 CK_K6_2,
2206 CK_K6_3,
2207 //@}
2208
2209 /// \name K7
2210 /// K7 architecture processors.
2211 //@{
2212 CK_Athlon,
2213 CK_AthlonThunderbird,
2214 CK_Athlon4,
2215 CK_AthlonXP,
2216 CK_AthlonMP,
2217 //@}
2218
2219 /// \name K8
2220 /// K8 architecture processors.
2221 //@{
2222 CK_Athlon64,
2223 CK_Athlon64SSE3,
2224 CK_AthlonFX,
2225 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002226 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002227 CK_Opteron,
2228 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002229 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002230 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002231
Benjamin Kramer569f2152012-01-10 11:50:18 +00002232 /// \name Bobcat
2233 /// Bobcat architecture processors.
2234 //@{
2235 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002236 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002237 //@}
2238
2239 /// \name Bulldozer
2240 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002241 //@{
2242 CK_BDVER1,
2243 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002244 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002245 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002246 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002247
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002248 /// This specification is deprecated and will be removed in the future.
2249 /// Users should prefer \see CK_K8.
2250 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002251 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002252 CK_x86_64,
2253 //@}
2254
2255 /// \name Geode
2256 /// Geode processors.
2257 //@{
2258 CK_Geode
2259 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002260 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002261
Eric Christopherc50738f2015-08-27 00:05:50 +00002262 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002263 return llvm::StringSwitch<CPUKind>(CPU)
2264 .Case("i386", CK_i386)
2265 .Case("i486", CK_i486)
2266 .Case("winchip-c6", CK_WinChipC6)
2267 .Case("winchip2", CK_WinChip2)
2268 .Case("c3", CK_C3)
2269 .Case("i586", CK_i586)
2270 .Case("pentium", CK_Pentium)
2271 .Case("pentium-mmx", CK_PentiumMMX)
2272 .Case("i686", CK_i686)
2273 .Case("pentiumpro", CK_PentiumPro)
2274 .Case("pentium2", CK_Pentium2)
2275 .Case("pentium3", CK_Pentium3)
2276 .Case("pentium3m", CK_Pentium3M)
2277 .Case("pentium-m", CK_PentiumM)
2278 .Case("c3-2", CK_C3_2)
2279 .Case("yonah", CK_Yonah)
2280 .Case("pentium4", CK_Pentium4)
2281 .Case("pentium4m", CK_Pentium4M)
2282 .Case("prescott", CK_Prescott)
2283 .Case("nocona", CK_Nocona)
2284 .Case("core2", CK_Core2)
2285 .Case("penryn", CK_Penryn)
2286 .Case("bonnell", CK_Bonnell)
2287 .Case("atom", CK_Bonnell) // Legacy name.
2288 .Case("silvermont", CK_Silvermont)
2289 .Case("slm", CK_Silvermont) // Legacy name.
2290 .Case("nehalem", CK_Nehalem)
2291 .Case("corei7", CK_Nehalem) // Legacy name.
2292 .Case("westmere", CK_Westmere)
2293 .Case("sandybridge", CK_SandyBridge)
2294 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2295 .Case("ivybridge", CK_IvyBridge)
2296 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2297 .Case("haswell", CK_Haswell)
2298 .Case("core-avx2", CK_Haswell) // Legacy name.
2299 .Case("broadwell", CK_Broadwell)
2300 .Case("skylake", CK_Skylake)
2301 .Case("skx", CK_Skylake) // Legacy name.
2302 .Case("knl", CK_KNL)
2303 .Case("k6", CK_K6)
2304 .Case("k6-2", CK_K6_2)
2305 .Case("k6-3", CK_K6_3)
2306 .Case("athlon", CK_Athlon)
2307 .Case("athlon-tbird", CK_AthlonThunderbird)
2308 .Case("athlon-4", CK_Athlon4)
2309 .Case("athlon-xp", CK_AthlonXP)
2310 .Case("athlon-mp", CK_AthlonMP)
2311 .Case("athlon64", CK_Athlon64)
2312 .Case("athlon64-sse3", CK_Athlon64SSE3)
2313 .Case("athlon-fx", CK_AthlonFX)
2314 .Case("k8", CK_K8)
2315 .Case("k8-sse3", CK_K8SSE3)
2316 .Case("opteron", CK_Opteron)
2317 .Case("opteron-sse3", CK_OpteronSSE3)
2318 .Case("barcelona", CK_AMDFAM10)
2319 .Case("amdfam10", CK_AMDFAM10)
2320 .Case("btver1", CK_BTVER1)
2321 .Case("btver2", CK_BTVER2)
2322 .Case("bdver1", CK_BDVER1)
2323 .Case("bdver2", CK_BDVER2)
2324 .Case("bdver3", CK_BDVER3)
2325 .Case("bdver4", CK_BDVER4)
2326 .Case("x86-64", CK_x86_64)
2327 .Case("geode", CK_Geode)
2328 .Default(CK_Generic);
2329 }
2330
Rafael Espindolaeb265472013-08-21 21:59:03 +00002331 enum FPMathKind {
2332 FP_Default,
2333 FP_SSE,
2334 FP_387
2335 } FPMath;
2336
Eli Friedman3fd920a2008-08-20 02:34:37 +00002337public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002338 X86TargetInfo(const llvm::Triple &Triple)
2339 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002340 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002341 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2342 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2343 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2344 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2345 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2346 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
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 Christopheref1e2952015-08-28 02:13:58 +00002404 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2405 StringRef CPU,
Eric Christopher007b0a02015-08-28 22:32:01 +00002406 std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002407 bool hasFeature(StringRef Feature) const override;
2408 bool handleTargetFeatures(std::vector<std::string> &Features,
2409 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002410 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002411 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2412 return "avx512";
2413 else if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002414 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002415 else if (getTriple().getArch() == llvm::Triple::x86 &&
2416 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002417 return "no-mmx";
2418 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002419 }
Craig Topper3164f332014-03-11 03:39:26 +00002420 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002421 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002422
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002423 // Perform any per-CPU checks necessary to determine if this CPU is
2424 // acceptable.
2425 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2426 // invalid without explaining *why*.
2427 switch (CPU) {
2428 case CK_Generic:
2429 // No processor selected!
2430 return false;
2431
2432 case CK_i386:
2433 case CK_i486:
2434 case CK_WinChipC6:
2435 case CK_WinChip2:
2436 case CK_C3:
2437 case CK_i586:
2438 case CK_Pentium:
2439 case CK_PentiumMMX:
2440 case CK_i686:
2441 case CK_PentiumPro:
2442 case CK_Pentium2:
2443 case CK_Pentium3:
2444 case CK_Pentium3M:
2445 case CK_PentiumM:
2446 case CK_Yonah:
2447 case CK_C3_2:
2448 case CK_Pentium4:
2449 case CK_Pentium4M:
2450 case CK_Prescott:
2451 case CK_K6:
2452 case CK_K6_2:
2453 case CK_K6_3:
2454 case CK_Athlon:
2455 case CK_AthlonThunderbird:
2456 case CK_Athlon4:
2457 case CK_AthlonXP:
2458 case CK_AthlonMP:
2459 case CK_Geode:
2460 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002461 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002462 return false;
2463
2464 // Fallthrough
2465 case CK_Nocona:
2466 case CK_Core2:
2467 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002468 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002469 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002470 case CK_Nehalem:
2471 case CK_Westmere:
2472 case CK_SandyBridge:
2473 case CK_IvyBridge:
2474 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002475 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002476 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002477 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002478 case CK_Athlon64:
2479 case CK_Athlon64SSE3:
2480 case CK_AthlonFX:
2481 case CK_K8:
2482 case CK_K8SSE3:
2483 case CK_Opteron:
2484 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002485 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002486 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002487 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002488 case CK_BDVER1:
2489 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002490 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002491 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002492 case CK_x86_64:
2493 return true;
2494 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002495 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002496 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002497
Craig Topper3164f332014-03-11 03:39:26 +00002498 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002499
Craig Topper3164f332014-03-11 03:39:26 +00002500 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002501 // We accept all non-ARM calling conventions
2502 return (CC == CC_X86ThisCall ||
2503 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002504 CC == CC_X86StdCall ||
2505 CC == CC_X86VectorCall ||
2506 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002507 CC == CC_X86Pascal ||
2508 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002509 }
2510
Craig Topper3164f332014-03-11 03:39:26 +00002511 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002512 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002513 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002514
2515 bool hasSjLjLowering() const override {
2516 return true;
2517 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002518};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002519
Rafael Espindolaeb265472013-08-21 21:59:03 +00002520bool X86TargetInfo::setFPMath(StringRef Name) {
2521 if (Name == "387") {
2522 FPMath = FP_387;
2523 return true;
2524 }
2525 if (Name == "sse") {
2526 FPMath = FP_SSE;
2527 return true;
2528 }
2529 return false;
2530}
2531
Eric Christopher007b0a02015-08-28 22:32:01 +00002532bool X86TargetInfo::initFeatureMap(
2533 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
2534 std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002535 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002536 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002537 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002538 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002539
Eric Christopher2b4a7252015-08-27 00:05:52 +00002540 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002541 case CK_Generic:
2542 case CK_i386:
2543 case CK_i486:
2544 case CK_i586:
2545 case CK_Pentium:
2546 case CK_i686:
2547 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002548 break;
2549 case CK_PentiumMMX:
2550 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002551 case CK_K6:
2552 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002553 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002554 break;
2555 case CK_Pentium3:
2556 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002557 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002558 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002559 break;
2560 case CK_PentiumM:
2561 case CK_Pentium4:
2562 case CK_Pentium4M:
2563 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002564 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002565 break;
2566 case CK_Yonah:
2567 case CK_Prescott:
2568 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002569 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002570 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002571 break;
2572 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002573 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002574 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002575 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002576 break;
2577 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002578 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002579 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002580 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002581 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002582 setFeatureEnabledImpl(Features, "avx512f", true);
2583 setFeatureEnabledImpl(Features, "avx512cd", true);
2584 setFeatureEnabledImpl(Features, "avx512dq", true);
2585 setFeatureEnabledImpl(Features, "avx512bw", true);
2586 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002587 // FALLTHROUGH
2588 case CK_Broadwell:
2589 setFeatureEnabledImpl(Features, "rdseed", true);
2590 setFeatureEnabledImpl(Features, "adx", true);
2591 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002592 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002593 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002594 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002595 setFeatureEnabledImpl(Features, "bmi", true);
2596 setFeatureEnabledImpl(Features, "bmi2", true);
2597 setFeatureEnabledImpl(Features, "rtm", true);
2598 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002599 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002600 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002601 setFeatureEnabledImpl(Features, "rdrnd", true);
2602 setFeatureEnabledImpl(Features, "f16c", true);
2603 setFeatureEnabledImpl(Features, "fsgsbase", true);
2604 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002605 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002606 setFeatureEnabledImpl(Features, "avx", true);
2607 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002608 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002609 case CK_Silvermont:
2610 setFeatureEnabledImpl(Features, "aes", true);
2611 setFeatureEnabledImpl(Features, "pclmul", true);
2612 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002613 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002614 setFeatureEnabledImpl(Features, "sse4.2", true);
2615 setFeatureEnabledImpl(Features, "cx16", true);
2616 break;
2617 case CK_KNL:
2618 setFeatureEnabledImpl(Features, "avx512f", true);
2619 setFeatureEnabledImpl(Features, "avx512cd", true);
2620 setFeatureEnabledImpl(Features, "avx512er", true);
2621 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002622 setFeatureEnabledImpl(Features, "rdseed", true);
2623 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002624 setFeatureEnabledImpl(Features, "lzcnt", true);
2625 setFeatureEnabledImpl(Features, "bmi", true);
2626 setFeatureEnabledImpl(Features, "bmi2", true);
2627 setFeatureEnabledImpl(Features, "rtm", true);
2628 setFeatureEnabledImpl(Features, "fma", true);
2629 setFeatureEnabledImpl(Features, "rdrnd", true);
2630 setFeatureEnabledImpl(Features, "f16c", true);
2631 setFeatureEnabledImpl(Features, "fsgsbase", true);
2632 setFeatureEnabledImpl(Features, "aes", true);
2633 setFeatureEnabledImpl(Features, "pclmul", true);
2634 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002635 break;
2636 case CK_K6_2:
2637 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002638 case CK_WinChip2:
2639 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002640 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002641 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002642 case CK_Athlon:
2643 case CK_AthlonThunderbird:
2644 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002645 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002646 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002647 case CK_Athlon4:
2648 case CK_AthlonXP:
2649 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002650 setFeatureEnabledImpl(Features, "sse", true);
2651 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002652 break;
2653 case CK_K8:
2654 case CK_Opteron:
2655 case CK_Athlon64:
2656 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002657 setFeatureEnabledImpl(Features, "sse2", true);
2658 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002659 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002660 case CK_AMDFAM10:
2661 setFeatureEnabledImpl(Features, "sse4a", true);
2662 setFeatureEnabledImpl(Features, "lzcnt", true);
2663 setFeatureEnabledImpl(Features, "popcnt", true);
2664 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002665 case CK_K8SSE3:
2666 case CK_OpteronSSE3:
2667 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002668 setFeatureEnabledImpl(Features, "sse3", true);
2669 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002670 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002671 case CK_BTVER2:
2672 setFeatureEnabledImpl(Features, "avx", true);
2673 setFeatureEnabledImpl(Features, "aes", true);
2674 setFeatureEnabledImpl(Features, "pclmul", true);
2675 setFeatureEnabledImpl(Features, "bmi", true);
2676 setFeatureEnabledImpl(Features, "f16c", true);
2677 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002678 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002679 setFeatureEnabledImpl(Features, "ssse3", true);
2680 setFeatureEnabledImpl(Features, "sse4a", true);
2681 setFeatureEnabledImpl(Features, "lzcnt", true);
2682 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002683 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002684 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002685 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002686 case CK_BDVER4:
2687 setFeatureEnabledImpl(Features, "avx2", true);
2688 setFeatureEnabledImpl(Features, "bmi2", true);
2689 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002690 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002691 setFeatureEnabledImpl(Features, "fsgsbase", true);
2692 // FALLTHROUGH
2693 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002694 setFeatureEnabledImpl(Features, "bmi", true);
2695 setFeatureEnabledImpl(Features, "fma", true);
2696 setFeatureEnabledImpl(Features, "f16c", true);
2697 setFeatureEnabledImpl(Features, "tbm", true);
2698 // FALLTHROUGH
2699 case CK_BDVER1:
2700 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002701 setFeatureEnabledImpl(Features, "xop", true);
2702 setFeatureEnabledImpl(Features, "lzcnt", true);
2703 setFeatureEnabledImpl(Features, "aes", true);
2704 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002705 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002706 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002707 break;
Eli Friedman33465822011-07-08 23:31:17 +00002708 }
Eric Christopher007b0a02015-08-28 22:32:01 +00002709 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002710}
2711
Rafael Espindolae62e2792013-08-20 13:44:29 +00002712void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002713 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002714 if (Enabled) {
2715 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002716 case AVX512F:
2717 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002718 case AVX2:
2719 Features["avx2"] = true;
2720 case AVX:
2721 Features["avx"] = true;
2722 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002723 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002724 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002725 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002726 case SSSE3:
2727 Features["ssse3"] = true;
2728 case SSE3:
2729 Features["sse3"] = true;
2730 case SSE2:
2731 Features["sse2"] = true;
2732 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002733 Features["sse"] = true;
2734 case NoSSE:
2735 break;
2736 }
2737 return;
2738 }
2739
2740 switch (Level) {
2741 case NoSSE:
2742 case SSE1:
2743 Features["sse"] = false;
2744 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002745 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2746 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002747 case SSE3:
2748 Features["sse3"] = false;
2749 setXOPLevel(Features, NoXOP, false);
2750 case SSSE3:
2751 Features["ssse3"] = false;
2752 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002753 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002754 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002755 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002756 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002757 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002758 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002759 case AVX2:
2760 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002761 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002762 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002763 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2764 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002765 }
2766}
2767
2768void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002769 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002770 if (Enabled) {
2771 switch (Level) {
2772 case AMD3DNowAthlon:
2773 Features["3dnowa"] = true;
2774 case AMD3DNow:
2775 Features["3dnow"] = true;
2776 case MMX:
2777 Features["mmx"] = true;
2778 case NoMMX3DNow:
2779 break;
2780 }
2781 return;
2782 }
2783
2784 switch (Level) {
2785 case NoMMX3DNow:
2786 case MMX:
2787 Features["mmx"] = false;
2788 case AMD3DNow:
2789 Features["3dnow"] = false;
2790 case AMD3DNowAthlon:
2791 Features["3dnowa"] = false;
2792 }
2793}
2794
2795void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002796 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002797 if (Enabled) {
2798 switch (Level) {
2799 case XOP:
2800 Features["xop"] = true;
2801 case FMA4:
2802 Features["fma4"] = true;
2803 setSSELevel(Features, AVX, true);
2804 case SSE4A:
2805 Features["sse4a"] = true;
2806 setSSELevel(Features, SSE3, true);
2807 case NoXOP:
2808 break;
2809 }
2810 return;
2811 }
2812
2813 switch (Level) {
2814 case NoXOP:
2815 case SSE4A:
2816 Features["sse4a"] = false;
2817 case FMA4:
2818 Features["fma4"] = false;
2819 case XOP:
2820 Features["xop"] = false;
2821 }
2822}
2823
Craig Topper86d79ef2013-09-17 04:51:29 +00002824void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2825 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002826 // This is a bit of a hack to deal with the sse4 target feature when used
2827 // as part of the target attribute. We handle sse4 correctly everywhere
2828 // else. See below for more information on how we handle the sse4 options.
2829 if (Name != "sse4")
2830 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002831
Craig Topper29561122013-09-19 01:13:07 +00002832 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002833 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002834 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002835 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002836 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002837 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002838 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002839 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002840 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002841 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002842 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002843 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002844 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002845 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002846 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002847 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002848 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002849 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002850 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002851 if (Enabled)
2852 setSSELevel(Features, SSE2, Enabled);
2853 } else if (Name == "pclmul") {
2854 if (Enabled)
2855 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002856 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002857 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002858 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002859 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002860 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002861 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002862 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2863 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002864 if (Enabled)
2865 setSSELevel(Features, AVX512F, Enabled);
2866 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002867 if (Enabled)
2868 setSSELevel(Features, AVX, Enabled);
2869 } else if (Name == "fma4") {
2870 setXOPLevel(Features, FMA4, Enabled);
2871 } else if (Name == "xop") {
2872 setXOPLevel(Features, XOP, Enabled);
2873 } else if (Name == "sse4a") {
2874 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002875 } else if (Name == "f16c") {
2876 if (Enabled)
2877 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002878 } else if (Name == "sha") {
2879 if (Enabled)
2880 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002881 } else if (Name == "sse4") {
2882 // We can get here via the __target__ attribute since that's not controlled
2883 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2884 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2885 // disabled.
2886 if (Enabled)
2887 setSSELevel(Features, SSE42, Enabled);
2888 else
2889 setSSELevel(Features, SSE41, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002890 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002891}
2892
Eric Christopher3ff21b32013-10-16 21:26:26 +00002893/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002894/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002895bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002896 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00002897 for (const auto &Feature : Features) {
2898 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00002899 continue;
2900
Eric Christopher610fe112015-08-26 08:21:55 +00002901 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002902 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002903 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00002904 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002905 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002906 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002907 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002908 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002909 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00002910 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002911 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002912 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002913 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002914 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002915 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002916 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002917 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00002918 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002919 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00002920 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002921 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00002922 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002923 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00002924 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002925 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002926 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002927 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00002928 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002929 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00002930 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002931 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00002932 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002933 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00002934 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002935 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002936 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002937 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002938 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002939 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002940 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002941 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002942 HasAVX512VL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002943 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00002944 HasSHA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002945 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00002946 HasCX16 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002947 }
2948
Benjamin Kramer27402c62012-03-05 15:10:44 +00002949 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002950 .Case("+avx512f", AVX512F)
2951 .Case("+avx2", AVX2)
2952 .Case("+avx", AVX)
2953 .Case("+sse4.2", SSE42)
2954 .Case("+sse4.1", SSE41)
2955 .Case("+ssse3", SSSE3)
2956 .Case("+sse3", SSE3)
2957 .Case("+sse2", SSE2)
2958 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002959 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002960 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002961
Eli Friedman33465822011-07-08 23:31:17 +00002962 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002963 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002964 .Case("+3dnowa", AMD3DNowAthlon)
2965 .Case("+3dnow", AMD3DNow)
2966 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00002967 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002968 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002969
2970 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002971 .Case("+xop", XOP)
2972 .Case("+fma4", FMA4)
2973 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002974 .Default(NoXOP);
2975 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002976 }
Eli Friedman33465822011-07-08 23:31:17 +00002977
Craig Topper7481d8a2013-09-10 06:55:47 +00002978 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2979 // Can't do this earlier because we need to be able to explicitly enable
2980 // popcnt and still disable sse4.2.
2981 if (!HasPOPCNT && SSELevel >= SSE42 &&
2982 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2983 HasPOPCNT = true;
2984 Features.push_back("+popcnt");
2985 }
2986
Yunzhong Gao61089362013-10-16 19:07:02 +00002987 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2988 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2989 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2990 HasPRFCHW = true;
2991 Features.push_back("+prfchw");
2992 }
2993
Rafael Espindolaeb265472013-08-21 21:59:03 +00002994 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2995 // matches the selected sse level.
2996 if (FPMath == FP_SSE && SSELevel < SSE1) {
2997 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2998 return false;
2999 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
3000 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
3001 return false;
3002 }
3003
Eli Friedman33465822011-07-08 23:31:17 +00003004 // Don't tell the backend if we're turning off mmx; it will end up disabling
3005 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00003006 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3007 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00003008 std::vector<std::string>::iterator it;
3009 it = std::find(Features.begin(), Features.end(), "-mmx");
3010 if (it != Features.end())
3011 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00003012 else if (SSELevel > NoSSE)
3013 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Alexey Bataev00396512015-07-02 03:40:19 +00003014
3015 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003016 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003017 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003018}
Chris Lattnerecd49032009-03-02 22:27:17 +00003019
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003020/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3021/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003022void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003023 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003024 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003025 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003026 Builder.defineMacro("__amd64__");
3027 Builder.defineMacro("__amd64");
3028 Builder.defineMacro("__x86_64");
3029 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003030 if (getTriple().getArchName() == "x86_64h") {
3031 Builder.defineMacro("__x86_64h");
3032 Builder.defineMacro("__x86_64h__");
3033 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003034 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003035 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003036 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003037
Chris Lattnerecd49032009-03-02 22:27:17 +00003038 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003039 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3040 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003041 switch (CPU) {
3042 case CK_Generic:
3043 break;
3044 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003045 // The rest are coming from the i386 define above.
3046 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003047 break;
3048 case CK_i486:
3049 case CK_WinChipC6:
3050 case CK_WinChip2:
3051 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003052 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003053 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003054 case CK_PentiumMMX:
3055 Builder.defineMacro("__pentium_mmx__");
3056 Builder.defineMacro("__tune_pentium_mmx__");
3057 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003058 case CK_i586:
3059 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003060 defineCPUMacros(Builder, "i586");
3061 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003062 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003063 case CK_Pentium3:
3064 case CK_Pentium3M:
3065 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003066 Builder.defineMacro("__tune_pentium3__");
3067 // Fallthrough
3068 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003069 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003070 Builder.defineMacro("__tune_pentium2__");
3071 // Fallthrough
3072 case CK_PentiumPro:
3073 Builder.defineMacro("__tune_i686__");
3074 Builder.defineMacro("__tune_pentiumpro__");
3075 // Fallthrough
3076 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003077 Builder.defineMacro("__i686");
3078 Builder.defineMacro("__i686__");
3079 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3080 Builder.defineMacro("__pentiumpro");
3081 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003082 break;
3083 case CK_Pentium4:
3084 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003085 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003086 break;
3087 case CK_Yonah:
3088 case CK_Prescott:
3089 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003090 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003091 break;
3092 case CK_Core2:
3093 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003094 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003095 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003096 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003097 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003098 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003099 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003100 defineCPUMacros(Builder, "slm");
3101 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003102 case CK_Nehalem:
3103 case CK_Westmere:
3104 case CK_SandyBridge:
3105 case CK_IvyBridge:
3106 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003107 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003108 // FIXME: Historically, we defined this legacy name, it would be nice to
3109 // remove it at some point. We've never exposed fine-grained names for
3110 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003111 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003112 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003113 case CK_Skylake:
3114 // FIXME: Historically, we defined this legacy name, it would be nice to
3115 // remove it at some point. This is the only fine-grained CPU macro in the
3116 // main intel CPU line, and it would be better to not have these and force
3117 // people to use ISA macros.
3118 defineCPUMacros(Builder, "skx");
3119 break;
Craig Topper449314e2013-08-20 07:09:39 +00003120 case CK_KNL:
3121 defineCPUMacros(Builder, "knl");
3122 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003123 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003124 Builder.defineMacro("__k6_2__");
3125 Builder.defineMacro("__tune_k6_2__");
3126 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003127 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003128 if (CPU != CK_K6_2) { // In case of fallthrough
3129 // FIXME: GCC may be enabling these in cases where some other k6
3130 // architecture is specified but -m3dnow is explicitly provided. The
3131 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003132 Builder.defineMacro("__k6_3__");
3133 Builder.defineMacro("__tune_k6_3__");
3134 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003135 // Fallthrough
3136 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003137 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003138 break;
3139 case CK_Athlon:
3140 case CK_AthlonThunderbird:
3141 case CK_Athlon4:
3142 case CK_AthlonXP:
3143 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003144 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003145 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003146 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003147 Builder.defineMacro("__tune_athlon_sse__");
3148 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003149 break;
3150 case CK_K8:
3151 case CK_K8SSE3:
3152 case CK_x86_64:
3153 case CK_Opteron:
3154 case CK_OpteronSSE3:
3155 case CK_Athlon64:
3156 case CK_Athlon64SSE3:
3157 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003158 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003159 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003160 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003161 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003162 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003163 case CK_BTVER1:
3164 defineCPUMacros(Builder, "btver1");
3165 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003166 case CK_BTVER2:
3167 defineCPUMacros(Builder, "btver2");
3168 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003169 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003170 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003171 break;
3172 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003173 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003174 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003175 case CK_BDVER3:
3176 defineCPUMacros(Builder, "bdver3");
3177 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003178 case CK_BDVER4:
3179 defineCPUMacros(Builder, "bdver4");
3180 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003181 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003182 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003183 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003184 }
Chris Lattner96e43572009-03-02 22:40:39 +00003185
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003186 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003187 Builder.defineMacro("__REGISTER_PREFIX__", "");
3188
Chris Lattner6df41af2009-04-19 17:32:33 +00003189 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3190 // functions in glibc header files that use FP Stack inline asm which the
3191 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003192 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003193
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003194 if (HasAES)
3195 Builder.defineMacro("__AES__");
3196
Craig Topper3f122a72012-05-31 05:18:48 +00003197 if (HasPCLMUL)
3198 Builder.defineMacro("__PCLMUL__");
3199
Craig Topper22967d42011-12-25 05:06:45 +00003200 if (HasLZCNT)
3201 Builder.defineMacro("__LZCNT__");
3202
Benjamin Kramer1e250392012-07-07 09:39:18 +00003203 if (HasRDRND)
3204 Builder.defineMacro("__RDRND__");
3205
Craig Topper8c7f2512014-11-03 06:51:41 +00003206 if (HasFSGSBASE)
3207 Builder.defineMacro("__FSGSBASE__");
3208
Craig Topper22967d42011-12-25 05:06:45 +00003209 if (HasBMI)
3210 Builder.defineMacro("__BMI__");
3211
3212 if (HasBMI2)
3213 Builder.defineMacro("__BMI2__");
3214
Craig Topper1de83482011-12-29 16:10:46 +00003215 if (HasPOPCNT)
3216 Builder.defineMacro("__POPCNT__");
3217
Michael Liao625a8752012-11-10 05:17:46 +00003218 if (HasRTM)
3219 Builder.defineMacro("__RTM__");
3220
Michael Liao74f4eaf2013-03-26 17:52:08 +00003221 if (HasPRFCHW)
3222 Builder.defineMacro("__PRFCHW__");
3223
Michael Liaoffaae352013-03-29 05:17:55 +00003224 if (HasRDSEED)
3225 Builder.defineMacro("__RDSEED__");
3226
Robert Khasanov50e6f582014-09-19 09:53:48 +00003227 if (HasADX)
3228 Builder.defineMacro("__ADX__");
3229
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003230 if (HasTBM)
3231 Builder.defineMacro("__TBM__");
3232
Rafael Espindolae62e2792013-08-20 13:44:29 +00003233 switch (XOPLevel) {
3234 case XOP:
3235 Builder.defineMacro("__XOP__");
3236 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003237 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003238 case SSE4A:
3239 Builder.defineMacro("__SSE4A__");
3240 case NoXOP:
3241 break;
3242 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003243
Craig Topperbba778b2012-06-03 21:46:30 +00003244 if (HasFMA)
3245 Builder.defineMacro("__FMA__");
3246
Manman Rena45358c2012-10-11 00:59:55 +00003247 if (HasF16C)
3248 Builder.defineMacro("__F16C__");
3249
Craig Topper679b53a2013-08-21 05:29:10 +00003250 if (HasAVX512CD)
3251 Builder.defineMacro("__AVX512CD__");
3252 if (HasAVX512ER)
3253 Builder.defineMacro("__AVX512ER__");
3254 if (HasAVX512PF)
3255 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003256 if (HasAVX512DQ)
3257 Builder.defineMacro("__AVX512DQ__");
3258 if (HasAVX512BW)
3259 Builder.defineMacro("__AVX512BW__");
3260 if (HasAVX512VL)
3261 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003262
Ben Langmuir58078d02013-09-19 13:22:04 +00003263 if (HasSHA)
3264 Builder.defineMacro("__SHA__");
3265
Nick Lewycky50e8f482013-10-05 20:14:27 +00003266 if (HasCX16)
3267 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3268
Chris Lattner96e43572009-03-02 22:40:39 +00003269 // Each case falls through to the previous one here.
3270 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003271 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003272 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003273 case AVX2:
3274 Builder.defineMacro("__AVX2__");
3275 case AVX:
3276 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003277 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003278 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003279 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003280 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003281 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003282 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003283 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003284 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003285 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003286 Builder.defineMacro("__SSE2__");
3287 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003288 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003289 Builder.defineMacro("__SSE__");
3290 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003291 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003292 break;
3293 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003294
Derek Schuffc7dd7222012-10-11 15:52:22 +00003295 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003296 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003297 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003298 case AVX2:
3299 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003300 case SSE42:
3301 case SSE41:
3302 case SSSE3:
3303 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003304 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003305 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003306 break;
3307 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003308 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003309 break;
3310 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003311 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003312 }
3313 }
3314
Anders Carlssone437c682010-01-27 03:47:49 +00003315 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003316 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003317 case AMD3DNowAthlon:
3318 Builder.defineMacro("__3dNOW_A__");
3319 case AMD3DNow:
3320 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003321 case MMX:
3322 Builder.defineMacro("__MMX__");
3323 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003324 break;
3325 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003326
3327 if (CPU >= CK_i486) {
3328 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3329 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3330 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3331 }
3332 if (CPU >= CK_i586)
3333 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003334}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003335
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003336bool X86TargetInfo::hasFeature(StringRef Feature) const {
3337 return llvm::StringSwitch<bool>(Feature)
3338 .Case("aes", HasAES)
3339 .Case("avx", SSELevel >= AVX)
3340 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003341 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003342 .Case("avx512cd", HasAVX512CD)
3343 .Case("avx512er", HasAVX512ER)
3344 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003345 .Case("avx512dq", HasAVX512DQ)
3346 .Case("avx512bw", HasAVX512BW)
3347 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003348 .Case("bmi", HasBMI)
3349 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003350 .Case("cx16", HasCX16)
3351 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003352 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003353 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003354 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003355 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003356 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3357 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3358 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003359 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003360 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003361 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003362 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003363 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003364 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003365 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003366 .Case("sse", SSELevel >= SSE1)
3367 .Case("sse2", SSELevel >= SSE2)
3368 .Case("sse3", SSELevel >= SSE3)
3369 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003370 .Case("sse4.1", SSELevel >= SSE41)
3371 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003372 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003373 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003374 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003375 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3376 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003377 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003378 .Default(false);
3379}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003380
Eric Christopherd9832702015-06-29 21:00:05 +00003381// We can't use a generic validation scheme for the features accepted here
3382// versus subtarget features accepted in the target attribute because the
3383// bitfield structure that's initialized in the runtime only supports the
3384// below currently rather than the full range of subtarget features. (See
3385// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3386bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3387 return llvm::StringSwitch<bool>(FeatureStr)
3388 .Case("cmov", true)
3389 .Case("mmx", true)
3390 .Case("popcnt", true)
3391 .Case("sse", true)
3392 .Case("sse2", true)
3393 .Case("sse3", true)
3394 .Case("sse4.1", true)
3395 .Case("sse4.2", true)
3396 .Case("avx", true)
3397 .Case("avx2", true)
3398 .Case("sse4a", true)
3399 .Case("fma4", true)
3400 .Case("xop", true)
3401 .Case("fma", true)
3402 .Case("avx512f", true)
3403 .Case("bmi", true)
3404 .Case("bmi2", true)
3405 .Default(false);
3406}
3407
Eli Friedman3fd920a2008-08-20 02:34:37 +00003408bool
Anders Carlsson58436352009-02-28 17:11:49 +00003409X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003410 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003411 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003412 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003413 // Constant constraints.
3414 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3415 // instructions.
3416 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3417 // x86_64 instructions.
3418 case 's':
3419 Info.setRequiresImmediate();
3420 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003421 case 'I':
3422 Info.setRequiresImmediate(0, 31);
3423 return true;
3424 case 'J':
3425 Info.setRequiresImmediate(0, 63);
3426 return true;
3427 case 'K':
3428 Info.setRequiresImmediate(-128, 127);
3429 return true;
3430 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003431 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003432 return true;
3433 case 'M':
3434 Info.setRequiresImmediate(0, 3);
3435 return true;
3436 case 'N':
3437 Info.setRequiresImmediate(0, 255);
3438 return true;
3439 case 'O':
3440 Info.setRequiresImmediate(0, 127);
3441 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003442 // Register constraints.
3443 case 'Y': // 'Y' is the first character for several 2-character constraints.
3444 // Shift the pointer to the second character of the constraint.
3445 Name++;
3446 switch (*Name) {
3447 default:
3448 return false;
3449 case '0': // First SSE register.
3450 case 't': // Any SSE register, when SSE2 is enabled.
3451 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3452 case 'm': // Any MMX register, when inter-unit moves enabled.
3453 Info.setAllowsRegister();
3454 return true;
3455 }
3456 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003457 // Constraint 'f' cannot be used for output operands.
3458 if (Info.ConstraintStr[0] == '=')
3459 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003460 Info.setAllowsRegister();
3461 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003462 case 'a': // eax.
3463 case 'b': // ebx.
3464 case 'c': // ecx.
3465 case 'd': // edx.
3466 case 'S': // esi.
3467 case 'D': // edi.
3468 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003469 case 't': // Top of floating point stack.
3470 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003471 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003472 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003473 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003474 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003475 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3476 case 'l': // "Index" registers: any general register that can be used as an
3477 // index in a base+index memory access.
3478 Info.setAllowsRegister();
3479 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003480 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003481 case 'C': // SSE floating point constant.
3482 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003483 return true;
3484 }
3485}
3486
Akira Hatanaka974131e2014-09-18 18:17:18 +00003487bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3488 unsigned Size) const {
3489 // Strip off constraint modifiers.
3490 while (Constraint[0] == '=' ||
3491 Constraint[0] == '+' ||
3492 Constraint[0] == '&')
3493 Constraint = Constraint.substr(1);
3494
3495 return validateOperandSize(Constraint, Size);
3496}
3497
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003498bool X86TargetInfo::validateInputSize(StringRef Constraint,
3499 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003500 return validateOperandSize(Constraint, Size);
3501}
3502
3503bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3504 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003505 switch (Constraint[0]) {
3506 default: break;
3507 case 'y':
3508 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003509 case 'f':
3510 case 't':
3511 case 'u':
3512 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003513 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003514 if (SSELevel >= AVX512F)
3515 // 512-bit zmm registers can be used if target supports AVX512F.
3516 return Size <= 512U;
3517 else if (SSELevel >= AVX)
3518 // 256-bit ymm registers can be used if target supports AVX.
3519 return Size <= 256U;
3520 return Size <= 128U;
3521 case 'Y':
3522 // 'Y' is the first character for several 2-character constraints.
3523 switch (Constraint[1]) {
3524 default: break;
3525 case 'm':
3526 // 'Ym' is synonymous with 'y'.
3527 return Size <= 64;
3528 case 'i':
3529 case 't':
3530 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3531 if (SSELevel >= AVX512F)
3532 return Size <= 512U;
3533 else if (SSELevel >= AVX)
3534 return Size <= 256U;
3535 return SSELevel >= SSE2 && Size <= 128U;
3536 }
3537
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003538 }
3539
3540 return true;
3541}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003542
Eli Friedman3fd920a2008-08-20 02:34:37 +00003543std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003544X86TargetInfo::convertConstraint(const char *&Constraint) const {
3545 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003546 case 'a': return std::string("{ax}");
3547 case 'b': return std::string("{bx}");
3548 case 'c': return std::string("{cx}");
3549 case 'd': return std::string("{dx}");
3550 case 'S': return std::string("{si}");
3551 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003552 case 'p': // address
3553 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003554 case 't': // top of floating point stack.
3555 return std::string("{st}");
3556 case 'u': // second from top of floating point stack.
3557 return std::string("{st(1)}"); // second from top of floating point stack.
3558 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003559 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003560 }
3561}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003562
Eli Friedman3fd920a2008-08-20 02:34:37 +00003563// X86-32 generic target
3564class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003565public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003566 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003567 DoubleAlign = LongLongAlign = 32;
3568 LongDoubleWidth = 96;
3569 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003570 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003571 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003572 SizeType = UnsignedInt;
3573 PtrDiffType = SignedInt;
3574 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003575 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003576
3577 // Use fpret for all types.
3578 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3579 (1 << TargetInfo::Double) |
3580 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003581
3582 // x86-32 has atomics up to 8 bytes
3583 // FIXME: Check that we actually have cmpxchg8b before setting
3584 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3585 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003586 }
Craig Topper3164f332014-03-11 03:39:26 +00003587 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003588 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003589 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003590
Craig Topper3164f332014-03-11 03:39:26 +00003591 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003592 if (RegNo == 0) return 0;
3593 if (RegNo == 1) return 2;
3594 return -1;
3595 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003596 bool validateOperandSize(StringRef Constraint,
3597 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003598 switch (Constraint[0]) {
3599 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003600 case 'R':
3601 case 'q':
3602 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003603 case 'a':
3604 case 'b':
3605 case 'c':
3606 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003607 case 'S':
3608 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003609 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003610 case 'A':
3611 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003612 }
3613
Akira Hatanaka974131e2014-09-18 18:17:18 +00003614 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003615 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003616};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003617
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003618class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3619public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003620 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3621 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003622
Craig Topper3164f332014-03-11 03:39:26 +00003623 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003624 unsigned Major, Minor, Micro;
3625 getTriple().getOSVersion(Major, Minor, Micro);
3626 // New NetBSD uses the default rounding mode.
3627 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3628 return X86_32TargetInfo::getFloatEvalMethod();
3629 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003630 return 1;
3631 }
3632};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003633
Eli Friedmane3aa4542009-07-05 18:47:56 +00003634class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3635public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003636 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3637 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003638 SizeType = UnsignedLong;
3639 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003640 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003641 }
3642};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003643
Eli Friedman9fa28852012-08-08 23:57:20 +00003644class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3645public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003646 BitrigI386TargetInfo(const llvm::Triple &Triple)
3647 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003648 SizeType = UnsignedLong;
3649 IntPtrType = SignedLong;
3650 PtrDiffType = SignedLong;
3651 }
3652};
Eli Friedman9fa28852012-08-08 23:57:20 +00003653
Torok Edwinb2b37c62009-06-30 17:10:35 +00003654class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003655public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003656 DarwinI386TargetInfo(const llvm::Triple &Triple)
3657 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003658 LongDoubleWidth = 128;
3659 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003660 SuitableAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003661 SizeType = UnsignedLong;
3662 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003663 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003664 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003665 }
3666
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003667 bool handleTargetFeatures(std::vector<std::string> &Features,
3668 DiagnosticsEngine &Diags) override {
3669 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3670 Diags))
3671 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003672 // We now know the features we have: we can decide how to align vectors.
3673 MaxVectorAlign =
3674 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003675 return true;
3676 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003677};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003678
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003679// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003680class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003681public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003682 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3683 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003684 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003685 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003686 bool IsWinCOFF =
3687 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003688 DataLayoutString = IsWinCOFF
3689 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3690 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003691 }
Craig Topper3164f332014-03-11 03:39:26 +00003692 void getTargetDefines(const LangOptions &Opts,
3693 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003694 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3695 }
3696};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003697
3698// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003699class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003700public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003701 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003702 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003703 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003704 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3705 }
Craig Topper3164f332014-03-11 03:39:26 +00003706 void getTargetDefines(const LangOptions &Opts,
3707 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003708 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3709 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3710 // The value of the following reflects processor type.
3711 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3712 // We lost the original triple, so we use the default.
3713 Builder.defineMacro("_M_IX86", "600");
3714 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003715};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003716
David Majnemerae1ed0e2015-05-28 04:36:18 +00003717static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3718 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang supports
Reid Kleckner47606832014-04-21 20:58:00 +00003719 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3720 // macro anyway for pre-processor compatibility.
3721 if (Opts.MicrosoftExt)
3722 Builder.defineMacro("__declspec", "__declspec");
3723 else
3724 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3725
3726 if (!Opts.MicrosoftExt) {
3727 // Provide macros for all the calling convention keywords. Provide both
3728 // single and double underscore prefixed variants. These are available on
3729 // x64 as well as x86, even though they have no effect.
3730 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3731 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003732 std::string GCCSpelling = "__attribute__((__";
3733 GCCSpelling += CC;
3734 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003735 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3736 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3737 }
3738 }
3739}
3740
David Majnemerae1ed0e2015-05-28 04:36:18 +00003741static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3742 Builder.defineMacro("__MSVCRT__");
3743 Builder.defineMacro("__MINGW32__");
3744 addCygMingDefines(Opts, Builder);
3745}
3746
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003747// x86-32 MinGW target
3748class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3749public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003750 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003751 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003752 void getTargetDefines(const LangOptions &Opts,
3753 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003754 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003755 DefineStd(Builder, "WIN32", Opts);
3756 DefineStd(Builder, "WINNT", Opts);
3757 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003758 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003759 }
3760};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003761
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003762// x86-32 Cygwin target
3763class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3764public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003765 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3766 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003767 TLSSupported = false;
3768 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003769 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003770 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 +00003771 }
Craig Topper3164f332014-03-11 03:39:26 +00003772 void getTargetDefines(const LangOptions &Opts,
3773 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003774 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003775 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003776 Builder.defineMacro("__CYGWIN__");
3777 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003778 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003779 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003780 if (Opts.CPlusPlus)
3781 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003782 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003783};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003784
Chris Lattnerb986aba2010-04-11 19:29:39 +00003785// x86-32 Haiku target
3786class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3787public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003788 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003789 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003790 IntPtrType = SignedLong;
3791 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003792 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003793 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003794 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003795 }
Craig Topper3164f332014-03-11 03:39:26 +00003796 void getTargetDefines(const LangOptions &Opts,
3797 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003798 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3799 Builder.defineMacro("__INTEL__");
3800 Builder.defineMacro("__HAIKU__");
3801 }
3802};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003803
Douglas Gregor9fabd852011-07-01 22:41:14 +00003804// RTEMS Target
3805template<typename Target>
3806class RTEMSTargetInfo : public OSTargetInfo<Target> {
3807protected:
Craig Topper3164f332014-03-11 03:39:26 +00003808 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3809 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003810 // RTEMS defines; list based off of gcc output
3811
Douglas Gregor9fabd852011-07-01 22:41:14 +00003812 Builder.defineMacro("__rtems__");
3813 Builder.defineMacro("__ELF__");
3814 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003815
Douglas Gregor9fabd852011-07-01 22:41:14 +00003816public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003817 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3818 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003819
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003820 switch (Triple.getArch()) {
3821 default:
3822 case llvm::Triple::x86:
3823 // this->MCountName = ".mcount";
3824 break;
3825 case llvm::Triple::mips:
3826 case llvm::Triple::mipsel:
3827 case llvm::Triple::ppc:
3828 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003829 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003830 // this->MCountName = "_mcount";
3831 break;
3832 case llvm::Triple::arm:
3833 // this->MCountName = "__mcount";
3834 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003835 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003836 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003837};
3838
Douglas Gregor9fabd852011-07-01 22:41:14 +00003839// x86-32 RTEMS target
3840class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3841public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003842 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003843 SizeType = UnsignedLong;
3844 IntPtrType = SignedLong;
3845 PtrDiffType = SignedLong;
3846 this->UserLabelPrefix = "";
3847 }
Craig Topper3164f332014-03-11 03:39:26 +00003848 void getTargetDefines(const LangOptions &Opts,
3849 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003850 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3851 Builder.defineMacro("__INTEL__");
3852 Builder.defineMacro("__rtems__");
3853 }
3854};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003855
Eli Friedman3fd920a2008-08-20 02:34:37 +00003856// x86-64 generic target
3857class X86_64TargetInfo : public X86TargetInfo {
3858public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003859 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003860 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003861 bool IsWinCOFF =
3862 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003863 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003864 LongDoubleWidth = 128;
3865 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003866 LargeArrayMinWidth = 128;
3867 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003868 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003869 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3870 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3871 IntPtrType = IsX32 ? SignedInt : SignedLong;
3872 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003873 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003874 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003875
Eric Christopher917e9522014-11-18 22:36:15 +00003876 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003877 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3878 : IsWinCOFF
3879 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3880 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003881
3882 // Use fpret only for long double.
3883 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003884
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003885 // Use fp2ret for _Complex long double.
3886 ComplexLongDoubleUsesFP2Ret = true;
3887
Charles Davisc7d5c942015-09-17 20:55:33 +00003888 // Make __builtin_ms_va_list available.
3889 HasBuiltinMSVaList = true;
3890
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003891 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003892 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003893 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003894 }
Craig Topper3164f332014-03-11 03:39:26 +00003895 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003896 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003897 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003898
Craig Topper3164f332014-03-11 03:39:26 +00003899 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003900 if (RegNo == 0) return 0;
3901 if (RegNo == 1) return 1;
3902 return -1;
3903 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003904
Craig Topper3164f332014-03-11 03:39:26 +00003905 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003906 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003907 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003908 CC == CC_IntelOclBicc ||
3909 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003910 }
3911
Craig Topper3164f332014-03-11 03:39:26 +00003912 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003913 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003914 }
3915
Pavel Chupinfd223e12014-08-04 12:39:43 +00003916 // for x32 we need it here explicitly
3917 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003918};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003919
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003920// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003921class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003922public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003923 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3924 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003925 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003926 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003927 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003928 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003929 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003930 SizeType = UnsignedLongLong;
3931 PtrDiffType = SignedLongLong;
3932 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003933 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003934 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003935
Craig Topper3164f332014-03-11 03:39:26 +00003936 void getTargetDefines(const LangOptions &Opts,
3937 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003938 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003939 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003940 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003941
Craig Topper3164f332014-03-11 03:39:26 +00003942 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003943 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003944 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003945
Craig Topper3164f332014-03-11 03:39:26 +00003946 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003947 switch (CC) {
3948 case CC_X86StdCall:
3949 case CC_X86ThisCall:
3950 case CC_X86FastCall:
3951 return CCCR_Ignore;
3952 case CC_C:
3953 case CC_X86VectorCall:
3954 case CC_IntelOclBicc:
3955 case CC_X86_64SysV:
3956 return CCCR_OK;
3957 default:
3958 return CCCR_Warning;
3959 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003960 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003961};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003962
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003963// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003964class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003965public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003966 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003967 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003968 LongDoubleWidth = LongDoubleAlign = 64;
3969 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003970 }
Craig Topper3164f332014-03-11 03:39:26 +00003971 void getTargetDefines(const LangOptions &Opts,
3972 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003973 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3974 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00003975 Builder.defineMacro("_M_X64", "100");
3976 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003977 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003978};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003979
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003980// x86-64 MinGW target
3981class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3982public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003983 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Yaron Keren480bc9f2015-08-20 21:51:46 +00003984 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003985 void getTargetDefines(const LangOptions &Opts,
3986 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003987 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003988 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003989 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003990 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003991
3992 // GCC defines this macro when it is using __gxx_personality_seh0.
3993 if (!Opts.SjLjExceptions)
3994 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003995 }
3996};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003997
Yaron Kerend030d112015-07-22 17:38:19 +00003998// x86-64 Cygwin target
3999class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4000public:
4001 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4002 : X86_64TargetInfo(Triple) {
4003 TLSSupported = false;
4004 WCharType = UnsignedShort;
4005 }
4006 void getTargetDefines(const LangOptions &Opts,
4007 MacroBuilder &Builder) const override {
4008 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4009 Builder.defineMacro("__x86_64__");
4010 Builder.defineMacro("__CYGWIN__");
4011 Builder.defineMacro("__CYGWIN64__");
4012 addCygMingDefines(Opts, Builder);
4013 DefineStd(Builder, "unix", Opts);
4014 if (Opts.CPlusPlus)
4015 Builder.defineMacro("_GNU_SOURCE");
4016
4017 // GCC defines this macro when it is using __gxx_personality_seh0.
4018 if (!Opts.SjLjExceptions)
4019 Builder.defineMacro("__SEH__");
4020 }
4021};
4022
Eli Friedman2857ccb2009-07-01 03:36:11 +00004023class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4024public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004025 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4026 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004027 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004028 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4029 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004030 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004031 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004032 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004033 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004034
4035 bool handleTargetFeatures(std::vector<std::string> &Features,
4036 DiagnosticsEngine &Diags) override {
4037 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4038 Diags))
4039 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004040 // We now know the features we have: we can decide how to align vectors.
4041 MaxVectorAlign =
4042 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004043 return true;
4044 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004045};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004046
Eli Friedman245f2292009-07-05 22:31:18 +00004047class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4048public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004049 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4050 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004051 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004052 Int64Type = SignedLongLong;
4053 }
4054};
Eli Friedman245f2292009-07-05 22:31:18 +00004055
Eli Friedman9fa28852012-08-08 23:57:20 +00004056class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4057public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004058 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4059 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4060 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004061 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004062 }
4063};
Tim Northover9bb857a2013-01-31 12:13:10 +00004064
Eli Friedmanf05b7722008-08-20 07:44:10 +00004065class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004066 // Possible FPU choices.
4067 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004068 VFP2FPU = (1 << 0),
4069 VFP3FPU = (1 << 1),
4070 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004071 NeonFPU = (1 << 3),
4072 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004073 };
4074
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004075 // Possible HWDiv features.
4076 enum HWDivMode {
4077 HWDivThumb = (1 << 0),
4078 HWDivARM = (1 << 1)
4079 };
4080
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004081 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004082 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004083 }
4084
4085 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4086 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004087
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004088 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004089
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004090 StringRef DefaultCPU;
4091 StringRef CPUProfile;
4092 StringRef CPUAttr;
4093
Rafael Espindolaeb265472013-08-21 21:59:03 +00004094 enum {
4095 FP_Default,
4096 FP_VFP,
4097 FP_Neon
4098 } FPMath;
4099
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004100 unsigned ArchISA;
4101 unsigned ArchKind;
4102 unsigned ArchProfile;
4103 unsigned ArchVersion;
4104
Bernard Ogdenda13af32013-10-24 18:32:51 +00004105 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004106
Logan Chien57086ce2012-10-10 06:56:20 +00004107 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004108 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004109
4110 // Initialized via features.
4111 unsigned SoftFloat : 1;
4112 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004113
Bernard Ogden18b57012013-10-29 09:47:51 +00004114 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004115 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004116 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004117 unsigned Unaligned : 1;
4118
4119 enum {
4120 LDREX_B = (1 << 0), /// byte (8-bit)
4121 LDREX_H = (1 << 1), /// half (16-bit)
4122 LDREX_W = (1 << 2), /// word (32-bit)
4123 LDREX_D = (1 << 3), /// double (64-bit)
4124 };
4125
4126 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004127
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004128 // ACLE 6.5.1 Hardware floating point
4129 enum {
4130 HW_FP_HP = (1 << 1), /// half (16-bit)
4131 HW_FP_SP = (1 << 2), /// single (32-bit)
4132 HW_FP_DP = (1 << 3), /// double (64-bit)
4133 };
4134 uint32_t HW_FP;
4135
Chris Lattner5cc15e02010-03-03 19:03:45 +00004136 static const Builtin::Info BuiltinInfo[];
4137
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004138 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004139 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004140
4141 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004142 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004143
Renato Golin9ba39232015-02-27 16:35:48 +00004144 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4145 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4146 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004147 SizeType = UnsignedLong;
4148 else
4149 SizeType = UnsignedInt;
4150
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004151 switch (T.getOS()) {
4152 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004153 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004154 break;
4155 case llvm::Triple::Win32:
4156 WCharType = UnsignedShort;
4157 break;
4158 case llvm::Triple::Linux:
4159 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004160 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4161 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004162 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004163 }
4164
4165 UseBitFieldTypeAlignment = true;
4166
4167 ZeroLengthBitfieldBoundary = 0;
4168
Tim Northover147cd2f2014-10-14 22:12:21 +00004169 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4170 // so set preferred for small types to 32.
4171 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004172 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004173 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4174 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4175 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004176 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004177 DataLayoutString = "e"
4178 "-m:w"
4179 "-p:32:32"
4180 "-i64:64"
4181 "-v128:64:128"
4182 "-a:0:32"
4183 "-n32"
4184 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004185 } else if (T.isOSNaCl()) {
4186 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004187 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004188 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004189 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004190 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4191 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004192 }
4193
4194 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004195 }
4196
4197 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004198 const llvm::Triple &T = getTriple();
4199
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004200 IsAAPCS = false;
4201
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004202 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004203
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004204 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004205 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004206 SizeType = UnsignedInt;
4207 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004208 SizeType = UnsignedLong;
4209
4210 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4211 WCharType = SignedInt;
4212
4213 // Do not respect the alignment of bit-field types when laying out
4214 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4215 UseBitFieldTypeAlignment = false;
4216
4217 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4218 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4219 /// gcc.
4220 ZeroLengthBitfieldBoundary = 32;
4221
Tim Northover147cd2f2014-10-14 22:12:21 +00004222 if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004223 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004224 BigEndian
4225 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4226 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4227 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004228 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004229 BigEndian
4230 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4231 : "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 +00004232
4233 // FIXME: Override "preferred align" for double and long long.
4234 }
4235
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004236 void setArchInfo() {
4237 StringRef ArchName = getTriple().getArchName();
4238
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004239 ArchISA = llvm::ARM::parseArchISA(ArchName);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004240 DefaultCPU = getDefaultCPU(ArchName);
4241
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004242 unsigned ArchKind = llvm::ARM::parseArch(ArchName);
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004243 if (ArchKind == llvm::ARM::AK_INVALID)
4244 // set arch of the CPU, either provided explicitly or hardcoded default
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004245 ArchKind = llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004246 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004247 }
4248
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004249 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004250 StringRef SubArch;
4251
4252 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004253 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004254 SubArch = llvm::ARM::getSubArch(ArchKind);
4255 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4256 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004257
4258 // cache CPU related strings
4259 CPUAttr = getCPUAttr();
4260 CPUProfile = getCPUProfile();
4261 }
4262
4263 void setAtomic() {
4264 // when triple does not specify a sub arch,
4265 // then we are not using inline atomics
4266 bool ShouldUseInlineAtomic = DefaultCPU.empty() ?
4267 false :
4268 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4269 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
4270 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4271 if (ArchProfile == llvm::ARM::PK_M) {
4272 MaxAtomicPromoteWidth = 32;
4273 if (ShouldUseInlineAtomic)
4274 MaxAtomicInlineWidth = 32;
4275 }
4276 else {
4277 MaxAtomicPromoteWidth = 64;
4278 if (ShouldUseInlineAtomic)
4279 MaxAtomicInlineWidth = 64;
4280 }
4281 }
4282
4283 bool isThumb() const {
4284 return (ArchISA == llvm::ARM::IK_THUMB);
4285 }
4286
4287 bool supportsThumb() const {
4288 return CPUAttr.count('T') || ArchVersion >= 6;
4289 }
4290
4291 bool supportsThumb2() const {
4292 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4293 }
4294
4295 StringRef getDefaultCPU(StringRef ArchName) const {
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004296 return llvm::ARM::getDefaultCPU(ArchName);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004297 }
4298
4299 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004300 // For most sub-arches, the build attribute CPU name is enough.
4301 // For Cortex variants, it's slightly different.
4302 switch(ArchKind) {
4303 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004304 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004305 case llvm::ARM::AK_ARMV6M:
4306 case llvm::ARM::AK_ARMV6SM:
4307 case llvm::ARM::AK_ARMV6HL:
4308 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004309 case llvm::ARM::AK_ARMV7S:
4310 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004311 case llvm::ARM::AK_ARMV7:
4312 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004313 case llvm::ARM::AK_ARMV7L:
4314 case llvm::ARM::AK_ARMV7HL:
4315 return "7A";
4316 case llvm::ARM::AK_ARMV7R:
4317 return "7R";
4318 case llvm::ARM::AK_ARMV7M:
4319 return "7M";
4320 case llvm::ARM::AK_ARMV7EM:
4321 return "7EM";
4322 case llvm::ARM::AK_ARMV8A:
4323 return "8A";
4324 case llvm::ARM::AK_ARMV8_1A:
4325 return "8_1A";
4326 }
4327 }
4328
4329 StringRef getCPUProfile() const {
4330 switch(ArchProfile) {
4331 case llvm::ARM::PK_A:
4332 return "A";
4333 case llvm::ARM::PK_R:
4334 return "R";
4335 case llvm::ARM::PK_M:
4336 return "M";
4337 default:
4338 return "";
4339 }
4340 }
4341
Chris Lattner17df24e2008-04-21 18:56:49 +00004342public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004343 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004344 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004345 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004346 BigEndian = IsBigEndian;
4347
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004348 switch (getTriple().getOS()) {
4349 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004350 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004351 break;
4352 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004353 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004354 break;
4355 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004356
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004357 // cache arch related info
4358 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004359
Chris Lattner1a8f3942010-04-23 16:29:58 +00004360 // {} in inline assembly are neon specifiers, not assembly variant
4361 // specifiers.
4362 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004363
Eric Christopher0e261882014-12-05 01:06:59 +00004364 // FIXME: This duplicates code from the driver that sets the -target-abi
4365 // option - this code is used if -target-abi isn't passed and should
4366 // be unified in some way.
4367 if (Triple.isOSBinFormatMachO()) {
4368 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4369 // the frontend matches that.
4370 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4371 Triple.getOS() == llvm::Triple::UnknownOS ||
4372 StringRef(CPU).startswith("cortex-m")) {
4373 setABI("aapcs");
4374 } else {
4375 setABI("apcs-gnu");
4376 }
4377 } else if (Triple.isOSWindows()) {
4378 // FIXME: this is invalid for WindowsCE
4379 setABI("aapcs");
4380 } else {
4381 // Select the default based on the platform.
4382 switch (Triple.getEnvironment()) {
4383 case llvm::Triple::Android:
4384 case llvm::Triple::GNUEABI:
4385 case llvm::Triple::GNUEABIHF:
4386 setABI("aapcs-linux");
4387 break;
4388 case llvm::Triple::EABIHF:
4389 case llvm::Triple::EABI:
4390 setABI("aapcs");
4391 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004392 case llvm::Triple::GNU:
4393 setABI("apcs-gnu");
4394 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004395 default:
4396 if (Triple.getOS() == llvm::Triple::NetBSD)
4397 setABI("apcs-gnu");
4398 else
4399 setABI("aapcs");
4400 break;
4401 }
4402 }
John McCall86353412010-08-21 22:46:04 +00004403
4404 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004405 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004406
Renato Golin15b86152015-07-03 16:41:13 +00004407 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004408 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004409
James Molloya7139222012-03-12 09:14:10 +00004410 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004411 // the alignment of the zero-length bitfield is greater than the member
4412 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004413 // zero length bitfield.
4414 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004415 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004416
Alp Toker4925ba72014-06-07 23:30:42 +00004417 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004418
Craig Topper3164f332014-03-11 03:39:26 +00004419 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004420 ABI = Name;
4421
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004422 // The defaults (above) are for AAPCS, check if we need to change them.
4423 //
4424 // FIXME: We need support for -meabi... we could just mangle it into the
4425 // name.
4426 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004427 setABIAPCS();
4428 return true;
4429 }
4430 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4431 setABIAAPCS();
4432 return true;
4433 }
4434 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004435 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004436
Renato Golinf5c4dec2015-05-27 13:33:00 +00004437 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopheref1e2952015-08-28 02:13:58 +00004438 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4439 StringRef CPU,
Eric Christopher007b0a02015-08-28 22:32:01 +00004440 std::vector<std::string> &FeaturesVec) const override {
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004441
4442 std::vector<const char*> TargetFeatures;
4443
4444 // get default FPU features
4445 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU);
4446 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4447
4448 // get default Extension features
4449 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU);
4450 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4451
4452 for (const char *Feature : TargetFeatures)
4453 if (Feature[0] == '+')
4454 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004455
4456 if (ArchVersion < 6 ||
4457 (ArchVersion == 6 && ArchProfile == llvm::ARM::PK_M))
4458 Features["strict-align"] = true;
4459
Eric Christopher007b0a02015-08-28 22:32:01 +00004460 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004461 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004462
Craig Topper3164f332014-03-11 03:39:26 +00004463 bool handleTargetFeatures(std::vector<std::string> &Features,
4464 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004465 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004466 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004467 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004468 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004469 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004470 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004471 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004472
Ranjeet Singhac08e532015-06-24 23:39:25 +00004473 // This does not diagnose illegal cases like having both
4474 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4475 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004476 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004477 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004478 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004479 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004480 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004481 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004482 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004483 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004484 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004485 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004486 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004487 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004488 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004489 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004490 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004491 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004492 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004493 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004494 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004495 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004496 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004497 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004498 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004499 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004500 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004501 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004502 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004503 Crypto = 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004504 } else if (Feature == "+t2dsp") {
4505 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004506 } else if (Feature == "+fp-only-sp") {
Ranjeet Singhac08e532015-06-24 23:39:25 +00004507 HW_FP_remove |= HW_FP_DP | HW_FP_HP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004508 } else if (Feature == "+strict-align") {
4509 Unaligned = 0;
4510 } else if (Feature == "+fp16") {
4511 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004512 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004513 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004514 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004515
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004516 switch (ArchVersion) {
4517 case 6:
4518 if (ArchProfile == llvm::ARM::PK_M)
4519 LDREX = 0;
4520 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4521 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4522 else
4523 LDREX = LDREX_W;
4524 break;
4525 case 7:
4526 if (ArchProfile == llvm::ARM::PK_M)
4527 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4528 else
4529 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4530 break;
4531 case 8:
4532 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4533 }
4534
Rafael Espindolaeb265472013-08-21 21:59:03 +00004535 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4536 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4537 return false;
4538 }
4539
4540 if (FPMath == FP_Neon)
4541 Features.push_back("+neonfp");
4542 else if (FPMath == FP_VFP)
4543 Features.push_back("-neonfp");
4544
Daniel Dunbar893d4752009-12-19 04:15:38 +00004545 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004546 auto Feature =
4547 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4548 if (Feature != Features.end())
4549 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004550
Rafael Espindolaeb265472013-08-21 21:59:03 +00004551 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004552 }
4553
Craig Topper3164f332014-03-11 03:39:26 +00004554 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004555 return llvm::StringSwitch<bool>(Feature)
4556 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004557 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004558 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004559 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004560 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004561 .Case("hwdiv", HWDiv & HWDivThumb)
4562 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004563 .Default(false);
4564 }
Renato Golin15b86152015-07-03 16:41:13 +00004565
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004566 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004567 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004568 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004569
Renato Golin15b86152015-07-03 16:41:13 +00004570 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004571 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004572 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004573 CPU = Name;
4574 return true;
4575 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004576
Craig Topper3164f332014-03-11 03:39:26 +00004577 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004578
Craig Topper3164f332014-03-11 03:39:26 +00004579 void getTargetDefines(const LangOptions &Opts,
4580 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004581 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004582 Builder.defineMacro("__arm");
4583 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004584
Chris Lattnerecd49032009-03-02 22:27:17 +00004585 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004586 Builder.defineMacro("__REGISTER_PREFIX__", "");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004587 if (!CPUAttr.empty())
4588 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004589
4590 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004591 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004592 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004593
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004594 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004595 // ACLE 6.5.7 Crypto Extension
4596 if (Crypto)
4597 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4598 // ACLE 6.5.8 CRC32 Extension
4599 if (CRC)
4600 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4601 // ACLE 6.5.10 Numeric Maximum and Minimum
4602 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4603 // ACLE 6.5.9 Directed Rounding
4604 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004605 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004606
4607 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4608 // is not defined for the M-profile.
4609 // NOTE that the deffault profile is assumed to be 'A'
4610 if (CPUProfile.empty() || CPUProfile != "M")
4611 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4612
4613 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4614 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4615 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004616 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004617 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004618 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004619 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4620
4621 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4622 // instruction set such as ARM or Thumb.
4623 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4624
4625 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4626
4627 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004628 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004629 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004630
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004631 // ACLE 6.4.3 Unaligned access supported in hardware
4632 if (Unaligned)
4633 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
4634
4635 // ACLE 6.4.4 LDREX/STREX
4636 if (LDREX)
4637 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4638
4639 // ACLE 6.4.5 CLZ
4640 if (ArchVersion == 5 ||
4641 (ArchVersion == 6 && CPUProfile != "M") ||
4642 ArchVersion > 6)
4643 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4644
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004645 // ACLE 6.5.1 Hardware Floating Point
4646 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004647 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004648
Yi Konga44c4d72014-06-27 21:25:42 +00004649 // ACLE predefines.
4650 Builder.defineMacro("__ARM_ACLE", "200");
4651
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004652 // FP16 support (we currently only support IEEE format).
4653 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4654 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4655
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004656 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4657 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4658 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4659
Mike Stump9d54bd72009-04-08 02:07:04 +00004660 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004661
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004662 // FIXME: It's more complicated than this and we don't really support
4663 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004664 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004665 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004666 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004667
David Tweed8f676532012-10-25 13:33:01 +00004668 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004669 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004670 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4671 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004672 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004673 Builder.defineMacro("__ARM_PCS", "1");
4674
David Tweed8f676532012-10-25 13:33:01 +00004675 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004676 Builder.defineMacro("__ARM_PCS_VFP", "1");
4677 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004678
Daniel Dunbar893d4752009-12-19 04:15:38 +00004679 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004680 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004681
4682 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004683 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004684
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004685 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004686 Builder.defineMacro("__THUMBEL__");
4687 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004688 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004689 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004690 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004691
4692 // ACLE 6.4.9 32-bit SIMD instructions
4693 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4694 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4695
4696 // ACLE 6.4.10 Hardware Integer Divide
4697 if (((HWDiv & HWDivThumb) && isThumb()) || ((HWDiv & HWDivARM) && !isThumb())) {
4698 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004699 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004700 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004701
4702 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004703 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004704
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004705 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004706 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004707 if (FPU & VFP2FPU)
4708 Builder.defineMacro("__ARM_VFPV2__");
4709 if (FPU & VFP3FPU)
4710 Builder.defineMacro("__ARM_VFPV3__");
4711 if (FPU & VFP4FPU)
4712 Builder.defineMacro("__ARM_VFPV4__");
4713 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004714
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004715 // This only gets set when Neon instructions are actually available, unlike
4716 // the VFP define, hence the soft float and arch check. This is subtly
4717 // different from gcc, we follow the intent which was that it should be set
4718 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004719 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004720 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004721 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004722 // current AArch32 NEON implementations do not support double-precision
4723 // floating-point even when it is present in VFP.
4724 Builder.defineMacro("__ARM_NEON_FP", "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004725 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004726
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004727 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4728 Opts.ShortWChar ? "2" : "4");
4729
4730 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4731 Opts.ShortEnums ? "1" : "4");
4732
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004733 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004734 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4735 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4736 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4737 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4738 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004739
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004740 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004741 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004742 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004743 }
4744
4745 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004746 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004747 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4748 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004749 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004750 }
4751
4752 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004753 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004754 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004755 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004756
Craig Topper3164f332014-03-11 03:39:26 +00004757 void getTargetBuiltins(const Builtin::Info *&Records,
4758 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004759 Records = BuiltinInfo;
4760 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004761 }
Craig Topper3164f332014-03-11 03:39:26 +00004762 bool isCLZForZeroUndef() const override { return false; }
4763 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004764 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004765 }
Craig Topper3164f332014-03-11 03:39:26 +00004766 void getGCCRegNames(const char * const *&Names,
4767 unsigned &NumNames) const override;
4768 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4769 unsigned &NumAliases) const override;
4770 bool validateAsmConstraint(const char *&Name,
4771 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004772 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004773 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004774 case 'l': // r0-r7
4775 case 'h': // r8-r15
4776 case 'w': // VFP Floating point register single precision
4777 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004778 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004779 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004780 case 'I':
4781 case 'J':
4782 case 'K':
4783 case 'L':
4784 case 'M':
4785 // FIXME
4786 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004787 case 'Q': // A memory address that is a single base register.
4788 Info.setAllowsMemory();
4789 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004790 case 'U': // a memory reference...
4791 switch (Name[1]) {
4792 case 'q': // ...ARMV4 ldrsb
4793 case 'v': // ...VFP load/store (reg+constant offset)
4794 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004795 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004796 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004797 case 'n': // valid address for Neon doubleword vector load/store
4798 case 'm': // valid address for Neon element and structure load/store
4799 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004800 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004801 Info.setAllowsMemory();
4802 Name++;
4803 return true;
4804 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004805 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004806 return false;
4807 }
Craig Topper3164f332014-03-11 03:39:26 +00004808 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004809 std::string R;
4810 switch (*Constraint) {
4811 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004812 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004813 Constraint++;
4814 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004815 case 'p': // 'p' should be translated to 'r' by default.
4816 R = std::string("r");
4817 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004818 default:
4819 return std::string(1, *Constraint);
4820 }
4821 return R;
4822 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004823 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004824 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004825 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004826 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004827 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004828
Bill Wendling9d1ee112012-10-25 23:28:48 +00004829 // Strip off constraint modifiers.
4830 while (Constraint[0] == '=' ||
4831 Constraint[0] == '+' ||
4832 Constraint[0] == '&')
4833 Constraint = Constraint.substr(1);
4834
4835 switch (Constraint[0]) {
4836 default: break;
4837 case 'r': {
4838 switch (Modifier) {
4839 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004840 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004841 case 'q':
4842 // A register of size 32 cannot fit a vector type.
4843 return false;
4844 }
4845 }
4846 }
4847
4848 return true;
4849 }
Craig Topper3164f332014-03-11 03:39:26 +00004850 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004851 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004852 return "";
4853 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004854
Craig Topper3164f332014-03-11 03:39:26 +00004855 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004856 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4857 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004858
Craig Topper3164f332014-03-11 03:39:26 +00004859 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004860 if (RegNo == 0) return 0;
4861 if (RegNo == 1) return 1;
4862 return -1;
4863 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004864
4865 bool hasSjLjLowering() const override {
4866 return true;
4867 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004868};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004869
Rafael Espindolaeb265472013-08-21 21:59:03 +00004870bool ARMTargetInfo::setFPMath(StringRef Name) {
4871 if (Name == "neon") {
4872 FPMath = FP_Neon;
4873 return true;
4874 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4875 Name == "vfp4") {
4876 FPMath = FP_VFP;
4877 return true;
4878 }
4879 return false;
4880}
4881
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004882const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004883 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004884 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004885 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4886
4887 // Float registers
4888 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4889 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4890 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004891 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004892
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004893 // Double registers
4894 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4895 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004896 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4897 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004898
4899 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004900 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4901 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004902};
4903
4904void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004905 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004906 Names = GCCRegNames;
4907 NumNames = llvm::array_lengthof(GCCRegNames);
4908}
4909
4910const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004911 { { "a1" }, "r0" },
4912 { { "a2" }, "r1" },
4913 { { "a3" }, "r2" },
4914 { { "a4" }, "r3" },
4915 { { "v1" }, "r4" },
4916 { { "v2" }, "r5" },
4917 { { "v3" }, "r6" },
4918 { { "v4" }, "r7" },
4919 { { "v5" }, "r8" },
4920 { { "v6", "rfp" }, "r9" },
4921 { { "sl" }, "r10" },
4922 { { "fp" }, "r11" },
4923 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004924 { { "r13" }, "sp" },
4925 { { "r14" }, "lr" },
4926 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004927 // The S, D and Q registers overlap, but aren't really aliases; we
4928 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004929};
4930
4931void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4932 unsigned &NumAliases) const {
4933 Aliases = GCCRegAliases;
4934 NumAliases = llvm::array_lengthof(GCCRegAliases);
4935}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004936
4937const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00004938#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004939 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004940#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4941 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00004942#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004943
Craig Topper07d3b622015-08-07 05:14:44 +00004944#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004945 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004946#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004947 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004948#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4949 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004950#include "clang/Basic/BuiltinsARM.def"
4951};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004952
4953class ARMleTargetInfo : public ARMTargetInfo {
4954public:
4955 ARMleTargetInfo(const llvm::Triple &Triple)
4956 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004957 void getTargetDefines(const LangOptions &Opts,
4958 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004959 Builder.defineMacro("__ARMEL__");
4960 ARMTargetInfo::getTargetDefines(Opts, Builder);
4961 }
4962};
4963
4964class ARMbeTargetInfo : public ARMTargetInfo {
4965public:
4966 ARMbeTargetInfo(const llvm::Triple &Triple)
4967 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004968 void getTargetDefines(const LangOptions &Opts,
4969 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004970 Builder.defineMacro("__ARMEB__");
4971 Builder.defineMacro("__ARM_BIG_ENDIAN");
4972 ARMTargetInfo::getTargetDefines(Opts, Builder);
4973 }
4974};
Chris Lattner17df24e2008-04-21 18:56:49 +00004975
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004976class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4977 const llvm::Triple Triple;
4978public:
4979 WindowsARMTargetInfo(const llvm::Triple &Triple)
4980 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4981 TLSSupported = false;
4982 WCharType = UnsignedShort;
4983 SizeType = UnsignedInt;
4984 UserLabelPrefix = "";
4985 }
4986 void getVisualStudioDefines(const LangOptions &Opts,
4987 MacroBuilder &Builder) const {
4988 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4989
4990 // FIXME: this is invalid for WindowsCE
4991 Builder.defineMacro("_M_ARM_NT", "1");
4992 Builder.defineMacro("_M_ARMT", "_M_ARM");
4993 Builder.defineMacro("_M_THUMB", "_M_ARM");
4994
4995 assert((Triple.getArch() == llvm::Triple::arm ||
4996 Triple.getArch() == llvm::Triple::thumb) &&
4997 "invalid architecture for Windows ARM target info");
4998 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4999 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5000
5001 // TODO map the complete set of values
5002 // 31: VFPv3 40: VFPv4
5003 Builder.defineMacro("_M_ARM_FP", "31");
5004 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005005 BuiltinVaListKind getBuiltinVaListKind() const override {
5006 return TargetInfo::CharPtrBuiltinVaList;
5007 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005008 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5009 switch (CC) {
5010 case CC_X86StdCall:
5011 case CC_X86ThisCall:
5012 case CC_X86FastCall:
5013 case CC_X86VectorCall:
5014 return CCCR_Ignore;
5015 case CC_C:
5016 return CCCR_OK;
5017 default:
5018 return CCCR_Warning;
5019 }
5020 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005021};
5022
5023// Windows ARM + Itanium C++ ABI Target
5024class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5025public:
5026 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5027 : WindowsARMTargetInfo(Triple) {
5028 TheCXXABI.set(TargetCXXABI::GenericARM);
5029 }
5030
5031 void getTargetDefines(const LangOptions &Opts,
5032 MacroBuilder &Builder) const override {
5033 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5034
5035 if (Opts.MSVCCompat)
5036 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5037 }
5038};
5039
5040// Windows ARM, MS (C++) ABI
5041class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5042public:
5043 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5044 : WindowsARMTargetInfo(Triple) {
5045 TheCXXABI.set(TargetCXXABI::Microsoft);
5046 }
5047
5048 void getTargetDefines(const LangOptions &Opts,
5049 MacroBuilder &Builder) const override {
5050 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5051 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5052 }
5053};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005054
Yaron Keren321249c2015-07-15 13:32:23 +00005055// ARM MinGW target
5056class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5057public:
5058 MinGWARMTargetInfo(const llvm::Triple &Triple)
5059 : WindowsARMTargetInfo(Triple) {
5060 TheCXXABI.set(TargetCXXABI::GenericARM);
5061 }
5062
5063 void getTargetDefines(const LangOptions &Opts,
5064 MacroBuilder &Builder) const override {
5065 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5066 DefineStd(Builder, "WIN32", Opts);
5067 DefineStd(Builder, "WINNT", Opts);
5068 Builder.defineMacro("_ARM_");
5069 addMinGWDefines(Opts, Builder);
5070 }
5071};
5072
5073// ARM Cygwin target
5074class CygwinARMTargetInfo : public ARMleTargetInfo {
5075public:
5076 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5077 TLSSupported = false;
5078 WCharType = UnsignedShort;
5079 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005080 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005081 }
5082 void getTargetDefines(const LangOptions &Opts,
5083 MacroBuilder &Builder) const override {
5084 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5085 Builder.defineMacro("_ARM_");
5086 Builder.defineMacro("__CYGWIN__");
5087 Builder.defineMacro("__CYGWIN32__");
5088 DefineStd(Builder, "unix", Opts);
5089 if (Opts.CPlusPlus)
5090 Builder.defineMacro("_GNU_SOURCE");
5091 }
5092};
5093
Mike Stump11289f42009-09-09 15:08:12 +00005094class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005095 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005096protected:
Craig Topper3164f332014-03-11 03:39:26 +00005097 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5098 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005099 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005100 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005101
Torok Edwinb2b37c62009-06-30 17:10:35 +00005102public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005103 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005104 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005105 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005106 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005107 // FIXME: This should be based off of the target features in
5108 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005109 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005110
5111 // Darwin on iOS uses a variant of the ARM C++ ABI.
5112 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005113 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005114};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005115
Tim Northover573cbee2014-05-24 12:52:07 +00005116class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005117 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005118 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5119 static const char *const GCCRegNames[];
5120
James Molloy75f5f9e2014-04-16 15:33:48 +00005121 enum FPUModeEnum {
5122 FPUMode,
5123 NeonMode
5124 };
5125
5126 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005127 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005128 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005129 unsigned Unaligned;
James Molloy75f5f9e2014-04-16 15:33:48 +00005130
Tim Northovera2ee4332014-03-29 15:09:45 +00005131 static const Builtin::Info BuiltinInfo[];
5132
5133 std::string ABI;
5134
5135public:
Tim Northover573cbee2014-05-24 12:52:07 +00005136 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005137 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005138
5139 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5140 WCharType = SignedInt;
5141
5142 // NetBSD apparently prefers consistency across ARM targets to consistency
5143 // across 64-bit targets.
5144 Int64Type = SignedLongLong;
5145 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005146 } else {
5147 WCharType = UnsignedInt;
5148 Int64Type = SignedLong;
5149 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005150 }
5151
Tim Northovera2ee4332014-03-29 15:09:45 +00005152 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005153 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005154 MaxAtomicInlineWidth = 128;
5155 MaxAtomicPromoteWidth = 128;
5156
Tim Northovera6a19f12015-02-06 01:25:07 +00005157 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005158 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5159
Tim Northovera2ee4332014-03-29 15:09:45 +00005160 // {} in inline assembly are neon specifiers, not assembly variant
5161 // specifiers.
5162 NoAsmVariants = true;
5163
Tim Northover7ad87af2015-01-16 18:44:04 +00005164 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5165 // contributes to the alignment of the containing aggregate in the same way
5166 // a plain (non bit-field) member of that type would, without exception for
5167 // zero-sized or anonymous bit-fields."
5168 UseBitFieldTypeAlignment = true;
5169 UseZeroLengthBitfieldAlignment = true;
5170
Tim Northover573cbee2014-05-24 12:52:07 +00005171 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005172 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5173 }
5174
Alp Toker4925ba72014-06-07 23:30:42 +00005175 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005176 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005177 if (Name != "aapcs" && Name != "darwinpcs")
5178 return false;
5179
5180 ABI = Name;
5181 return true;
5182 }
5183
David Blaikie1cbb9712014-11-14 19:09:44 +00005184 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005185 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005186 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005187 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005188 .Case("cyclone", true)
5189 .Default(false);
5190 return CPUKnown;
5191 }
5192
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005193 void getTargetDefines(const LangOptions &Opts,
5194 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005195 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005196 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005197
5198 // Target properties.
5199 Builder.defineMacro("_LP64");
5200 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005201
5202 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5203 Builder.defineMacro("__ARM_ACLE", "200");
5204 Builder.defineMacro("__ARM_ARCH", "8");
5205 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5206
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005207 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005208 Builder.defineMacro("__ARM_PCS_AAPCS64");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005209 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005210
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005211 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5212 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5213 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5214 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005215 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005216 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5217 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005218
5219 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5220
5221 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005222 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005223
5224 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5225 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005226 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5227 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005228
5229 if (Opts.FastMath || Opts.FiniteMathOnly)
5230 Builder.defineMacro("__ARM_FP_FAST");
5231
Richard Smithab506ad2014-10-20 23:26:58 +00005232 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00005233 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
5234
5235 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5236
5237 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5238 Opts.ShortEnums ? "1" : "4");
5239
James Molloy75f5f9e2014-04-16 15:33:48 +00005240 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005241 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005242 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005243 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005244 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005245
Bradley Smith418c5932014-05-02 15:17:51 +00005246 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005247 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005248
James Molloy75f5f9e2014-04-16 15:33:48 +00005249 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005250 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5251
5252 if (Unaligned)
5253 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005254
5255 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5256 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5257 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5258 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5259 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005260 }
5261
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005262 void getTargetBuiltins(const Builtin::Info *&Records,
5263 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005264 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00005265 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00005266 }
5267
David Blaikie1cbb9712014-11-14 19:09:44 +00005268 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005269 return Feature == "aarch64" ||
5270 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005271 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005272 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005273 }
5274
James Molloy5e73df52014-04-16 15:06:20 +00005275 bool handleTargetFeatures(std::vector<std::string> &Features,
5276 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005277 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005278 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005279 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005280 Unaligned = 1;
5281
Eric Christopher610fe112015-08-26 08:21:55 +00005282 for (const auto &Feature : Features) {
5283 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005284 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005285 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005286 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005287 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005288 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005289 if (Feature == "+strict-align")
5290 Unaligned = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005291 }
5292
Eric Christopher964a5f32015-08-05 23:48:05 +00005293 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005294
5295 return true;
5296 }
5297
David Blaikie1cbb9712014-11-14 19:09:44 +00005298 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005299
David Blaikie1cbb9712014-11-14 19:09:44 +00005300 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005301 return TargetInfo::AArch64ABIBuiltinVaList;
5302 }
5303
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005304 void getGCCRegNames(const char *const *&Names,
5305 unsigned &NumNames) const override;
5306 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5307 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005308
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005309 bool validateAsmConstraint(const char *&Name,
5310 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005311 switch (*Name) {
5312 default:
5313 return false;
5314 case 'w': // Floating point and SIMD registers (V0-V31)
5315 Info.setAllowsRegister();
5316 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005317 case 'I': // Constant that can be used with an ADD instruction
5318 case 'J': // Constant that can be used with a SUB instruction
5319 case 'K': // Constant that can be used with a 32-bit logical instruction
5320 case 'L': // Constant that can be used with a 64-bit logical instruction
5321 case 'M': // Constant that can be used as a 32-bit MOV immediate
5322 case 'N': // Constant that can be used as a 64-bit MOV immediate
5323 case 'Y': // Floating point constant zero
5324 case 'Z': // Integer constant zero
5325 return true;
5326 case 'Q': // A memory reference with base register and no offset
5327 Info.setAllowsMemory();
5328 return true;
5329 case 'S': // A symbolic address
5330 Info.setAllowsRegister();
5331 return true;
5332 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005333 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5334 // Utf: A memory address suitable for ldp/stp in TF mode.
5335 // Usa: An absolute symbolic address.
5336 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5337 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005338 case 'z': // Zero register, wzr or xzr
5339 Info.setAllowsRegister();
5340 return true;
5341 case 'x': // Floating point and SIMD registers (V0-V15)
5342 Info.setAllowsRegister();
5343 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005344 }
5345 return false;
5346 }
5347
Akira Hatanaka987f1862014-08-22 06:05:21 +00005348 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005349 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005350 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005351 // Strip off constraint modifiers.
5352 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5353 Constraint = Constraint.substr(1);
5354
5355 switch (Constraint[0]) {
5356 default:
5357 return true;
5358 case 'z':
5359 case 'r': {
5360 switch (Modifier) {
5361 case 'x':
5362 case 'w':
5363 // For now assume that the person knows what they're
5364 // doing with the modifier.
5365 return true;
5366 default:
5367 // By default an 'r' constraint will be in the 'x'
5368 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005369 if (Size == 64)
5370 return true;
5371
5372 SuggestedModifier = "w";
5373 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005374 }
5375 }
5376 }
5377 }
5378
David Blaikie1cbb9712014-11-14 19:09:44 +00005379 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005380
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005381 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005382 if (RegNo == 0)
5383 return 0;
5384 if (RegNo == 1)
5385 return 1;
5386 return -1;
5387 }
5388};
5389
Tim Northover573cbee2014-05-24 12:52:07 +00005390const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005391 // 32-bit Integer registers
5392 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5393 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5394 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5395
5396 // 64-bit Integer registers
5397 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5398 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5399 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5400
5401 // 32-bit floating point regsisters
5402 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5403 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5404 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5405
5406 // 64-bit floating point regsisters
5407 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5408 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5409 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5410
5411 // Vector registers
5412 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5413 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5414 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5415};
5416
Tim Northover573cbee2014-05-24 12:52:07 +00005417void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005418 unsigned &NumNames) const {
5419 Names = GCCRegNames;
5420 NumNames = llvm::array_lengthof(GCCRegNames);
5421}
5422
Tim Northover573cbee2014-05-24 12:52:07 +00005423const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005424 { { "w31" }, "wsp" },
5425 { { "x29" }, "fp" },
5426 { { "x30" }, "lr" },
5427 { { "x31" }, "sp" },
5428 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5429 // don't want to substitute one of these for a different-sized one.
5430};
5431
Tim Northover573cbee2014-05-24 12:52:07 +00005432void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005433 unsigned &NumAliases) const {
5434 Aliases = GCCRegAliases;
5435 NumAliases = llvm::array_lengthof(GCCRegAliases);
5436}
5437
Tim Northover573cbee2014-05-24 12:52:07 +00005438const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005439#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005440 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005441#include "clang/Basic/BuiltinsNEON.def"
5442
5443#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005444 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005445#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005446};
James Molloy5e73df52014-04-16 15:06:20 +00005447
Tim Northover573cbee2014-05-24 12:52:07 +00005448class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005449 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005450 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005451 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005452 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005453 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005454 }
5455
5456public:
Tim Northover573cbee2014-05-24 12:52:07 +00005457 AArch64leTargetInfo(const llvm::Triple &Triple)
5458 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005459 BigEndian = false;
5460 }
5461 void getTargetDefines(const LangOptions &Opts,
5462 MacroBuilder &Builder) const override {
5463 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005464 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005465 }
5466};
5467
Tim Northover573cbee2014-05-24 12:52:07 +00005468class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005469 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005470 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005471 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005472 }
5473
5474public:
Tim Northover573cbee2014-05-24 12:52:07 +00005475 AArch64beTargetInfo(const llvm::Triple &Triple)
5476 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005477 void getTargetDefines(const LangOptions &Opts,
5478 MacroBuilder &Builder) const override {
5479 Builder.defineMacro("__AARCH64EB__");
5480 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5481 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005482 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005483 }
5484};
Tim Northovera2ee4332014-03-29 15:09:45 +00005485
Tim Northover573cbee2014-05-24 12:52:07 +00005486class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005487protected:
5488 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5489 MacroBuilder &Builder) const override {
5490 Builder.defineMacro("__AARCH64_SIMD__");
5491 Builder.defineMacro("__ARM64_ARCH_8__");
5492 Builder.defineMacro("__ARM_NEON__");
5493 Builder.defineMacro("__LITTLE_ENDIAN__");
5494 Builder.defineMacro("__REGISTER_PREFIX__", "");
5495 Builder.defineMacro("__arm64", "1");
5496 Builder.defineMacro("__arm64__", "1");
5497
5498 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5499 }
5500
Tim Northovera2ee4332014-03-29 15:09:45 +00005501public:
Tim Northover573cbee2014-05-24 12:52:07 +00005502 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5503 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005504 Int64Type = SignedLongLong;
5505 WCharType = SignedInt;
5506 UseSignedCharForObjCBool = false;
5507
Tim Northovera6a19f12015-02-06 01:25:07 +00005508 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005509 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5510
5511 TheCXXABI.set(TargetCXXABI::iOS64);
5512 }
5513
David Blaikie1cbb9712014-11-14 19:09:44 +00005514 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005515 return TargetInfo::CharPtrBuiltinVaList;
5516 }
5517};
Tim Northovera2ee4332014-03-29 15:09:45 +00005518
Tony Linthicum76329bf2011-12-12 21:14:55 +00005519// Hexagon abstract base class
5520class HexagonTargetInfo : public TargetInfo {
5521 static const Builtin::Info BuiltinInfo[];
5522 static const char * const GCCRegNames[];
5523 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5524 std::string CPU;
5525public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005526 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005527 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00005528 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005529
5530 // {} in inline assembly are packet specifiers, not assembly variant
5531 // specifiers.
5532 NoAsmVariants = true;
5533 }
5534
Craig Topper3164f332014-03-11 03:39:26 +00005535 void getTargetBuiltins(const Builtin::Info *&Records,
5536 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005537 Records = BuiltinInfo;
5538 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5539 }
5540
Craig Topper3164f332014-03-11 03:39:26 +00005541 bool validateAsmConstraint(const char *&Name,
5542 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005543 return true;
5544 }
5545
Craig Topper3164f332014-03-11 03:39:26 +00005546 void getTargetDefines(const LangOptions &Opts,
5547 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005548
Craig Topper3164f332014-03-11 03:39:26 +00005549 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005550 return Feature == "hexagon";
5551 }
Craig Topper3164f332014-03-11 03:39:26 +00005552
5553 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005554 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005555 }
Craig Topper3164f332014-03-11 03:39:26 +00005556 void getGCCRegNames(const char * const *&Names,
5557 unsigned &NumNames) const override;
5558 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5559 unsigned &NumAliases) const override;
5560 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005561 return "";
5562 }
Sebastian Pop86500282012-01-13 20:37:10 +00005563
5564 static const char *getHexagonCPUSuffix(StringRef Name) {
5565 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005566 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005567 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005568 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005569 }
5570
Craig Topper3164f332014-03-11 03:39:26 +00005571 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005572 if (!getHexagonCPUSuffix(Name))
5573 return false;
5574
Tony Linthicum76329bf2011-12-12 21:14:55 +00005575 CPU = Name;
5576 return true;
5577 }
5578};
5579
5580void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5581 MacroBuilder &Builder) const {
5582 Builder.defineMacro("qdsp6");
5583 Builder.defineMacro("__qdsp6", "1");
5584 Builder.defineMacro("__qdsp6__", "1");
5585
5586 Builder.defineMacro("hexagon");
5587 Builder.defineMacro("__hexagon", "1");
5588 Builder.defineMacro("__hexagon__", "1");
5589
5590 if(CPU == "hexagonv1") {
5591 Builder.defineMacro("__HEXAGON_V1__");
5592 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5593 if(Opts.HexagonQdsp6Compat) {
5594 Builder.defineMacro("__QDSP6_V1__");
5595 Builder.defineMacro("__QDSP6_ARCH__", "1");
5596 }
5597 }
5598 else if(CPU == "hexagonv2") {
5599 Builder.defineMacro("__HEXAGON_V2__");
5600 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5601 if(Opts.HexagonQdsp6Compat) {
5602 Builder.defineMacro("__QDSP6_V2__");
5603 Builder.defineMacro("__QDSP6_ARCH__", "2");
5604 }
5605 }
5606 else if(CPU == "hexagonv3") {
5607 Builder.defineMacro("__HEXAGON_V3__");
5608 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5609 if(Opts.HexagonQdsp6Compat) {
5610 Builder.defineMacro("__QDSP6_V3__");
5611 Builder.defineMacro("__QDSP6_ARCH__", "3");
5612 }
5613 }
5614 else if(CPU == "hexagonv4") {
5615 Builder.defineMacro("__HEXAGON_V4__");
5616 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5617 if(Opts.HexagonQdsp6Compat) {
5618 Builder.defineMacro("__QDSP6_V4__");
5619 Builder.defineMacro("__QDSP6_ARCH__", "4");
5620 }
5621 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005622 else if(CPU == "hexagonv5") {
5623 Builder.defineMacro("__HEXAGON_V5__");
5624 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5625 if(Opts.HexagonQdsp6Compat) {
5626 Builder.defineMacro("__QDSP6_V5__");
5627 Builder.defineMacro("__QDSP6_ARCH__", "5");
5628 }
5629 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005630}
5631
5632const char * const HexagonTargetInfo::GCCRegNames[] = {
5633 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5634 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5635 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5636 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5637 "p0", "p1", "p2", "p3",
5638 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5639};
5640
5641void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5642 unsigned &NumNames) const {
5643 Names = GCCRegNames;
5644 NumNames = llvm::array_lengthof(GCCRegNames);
5645}
5646
5647
5648const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5649 { { "sp" }, "r29" },
5650 { { "fp" }, "r30" },
5651 { { "lr" }, "r31" },
5652 };
5653
5654void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5655 unsigned &NumAliases) const {
5656 Aliases = GCCRegAliases;
5657 NumAliases = llvm::array_lengthof(GCCRegAliases);
5658}
5659
5660
5661const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005662#define BUILTIN(ID, TYPE, ATTRS) \
5663 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5664#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5665 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005666#include "clang/Basic/BuiltinsHexagon.def"
5667};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005668
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005669// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5670class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005671 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5672 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005673 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005674public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005675 SparcTargetInfo(const llvm::Triple &Triple)
5676 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005677
Craig Topper3164f332014-03-11 03:39:26 +00005678 bool handleTargetFeatures(std::vector<std::string> &Features,
5679 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005680 // The backend doesn't actually handle soft float yet, but in case someone
5681 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005682 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5683 if (Feature != Features.end()) {
5684 SoftFloat = true;
5685 Features.erase(Feature);
5686 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005687 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005688 }
Craig Topper3164f332014-03-11 03:39:26 +00005689 void getTargetDefines(const LangOptions &Opts,
5690 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005691 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005692 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005693
5694 if (SoftFloat)
5695 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005696 }
Craig Topper3164f332014-03-11 03:39:26 +00005697
5698 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005699 return llvm::StringSwitch<bool>(Feature)
5700 .Case("softfloat", SoftFloat)
5701 .Case("sparc", true)
5702 .Default(false);
5703 }
Craig Topper3164f332014-03-11 03:39:26 +00005704
5705 void getTargetBuiltins(const Builtin::Info *&Records,
5706 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005707 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005708 }
Craig Topper3164f332014-03-11 03:39:26 +00005709 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005710 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005711 }
Craig Topper3164f332014-03-11 03:39:26 +00005712 void getGCCRegNames(const char * const *&Names,
5713 unsigned &NumNames) const override;
5714 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5715 unsigned &NumAliases) const override;
5716 bool validateAsmConstraint(const char *&Name,
5717 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005718 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005719 switch (*Name) {
5720 case 'I': // Signed 13-bit constant
5721 case 'J': // Zero
5722 case 'K': // 32-bit constant with the low 12 bits clear
5723 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5724 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5725 case 'N': // Same as 'K' but zext (required for SIMode)
5726 case 'O': // The constant 4096
5727 return true;
5728 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005729 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005730 }
Craig Topper3164f332014-03-11 03:39:26 +00005731 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005732 // FIXME: Implement!
5733 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005734 }
5735};
5736
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005737const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005738 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5739 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5740 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5741 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5742};
5743
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005744void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5745 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005746 Names = GCCRegNames;
5747 NumNames = llvm::array_lengthof(GCCRegNames);
5748}
5749
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005750const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005751 { { "g0" }, "r0" },
5752 { { "g1" }, "r1" },
5753 { { "g2" }, "r2" },
5754 { { "g3" }, "r3" },
5755 { { "g4" }, "r4" },
5756 { { "g5" }, "r5" },
5757 { { "g6" }, "r6" },
5758 { { "g7" }, "r7" },
5759 { { "o0" }, "r8" },
5760 { { "o1" }, "r9" },
5761 { { "o2" }, "r10" },
5762 { { "o3" }, "r11" },
5763 { { "o4" }, "r12" },
5764 { { "o5" }, "r13" },
5765 { { "o6", "sp" }, "r14" },
5766 { { "o7" }, "r15" },
5767 { { "l0" }, "r16" },
5768 { { "l1" }, "r17" },
5769 { { "l2" }, "r18" },
5770 { { "l3" }, "r19" },
5771 { { "l4" }, "r20" },
5772 { { "l5" }, "r21" },
5773 { { "l6" }, "r22" },
5774 { { "l7" }, "r23" },
5775 { { "i0" }, "r24" },
5776 { { "i1" }, "r25" },
5777 { { "i2" }, "r26" },
5778 { { "i3" }, "r27" },
5779 { { "i4" }, "r28" },
5780 { { "i5" }, "r29" },
5781 { { "i6", "fp" }, "r30" },
5782 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005783};
5784
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005785void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5786 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005787 Aliases = GCCRegAliases;
5788 NumAliases = llvm::array_lengthof(GCCRegAliases);
5789}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005790
5791// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5792class SparcV8TargetInfo : public SparcTargetInfo {
5793public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005794 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005795 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00005796 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
5797 switch (getTriple().getOS()) {
5798 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00005799 SizeType = UnsignedInt;
5800 IntPtrType = SignedInt;
5801 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00005802 break;
5803 case llvm::Triple::NetBSD:
5804 case llvm::Triple::OpenBSD:
5805 SizeType = UnsignedLong;
5806 IntPtrType = SignedLong;
5807 PtrDiffType = SignedLong;
5808 break;
Brad Smith56495d52015-08-13 22:00:53 +00005809 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005810 }
5811
Craig Topper3164f332014-03-11 03:39:26 +00005812 void getTargetDefines(const LangOptions &Opts,
5813 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005814 SparcTargetInfo::getTargetDefines(Opts, Builder);
5815 Builder.defineMacro("__sparcv8");
5816 }
5817};
5818
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005819// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5820class SparcV8elTargetInfo : public SparcV8TargetInfo {
5821 public:
5822 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005823 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005824 BigEndian = false;
5825 }
5826};
5827
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005828// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5829class SparcV9TargetInfo : public SparcTargetInfo {
5830public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005831 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005832 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00005833 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005834 // This is an LP64 platform.
5835 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005836
5837 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005838 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005839 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005840 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005841 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005842 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005843
5844 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5845 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5846 LongDoubleWidth = 128;
5847 LongDoubleAlign = 128;
5848 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005849 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005850 }
5851
Craig Topper3164f332014-03-11 03:39:26 +00005852 void getTargetDefines(const LangOptions &Opts,
5853 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005854 SparcTargetInfo::getTargetDefines(Opts, Builder);
5855 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005856 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005857 // Solaris doesn't need these variants, but the BSDs do.
5858 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005859 Builder.defineMacro("__sparc64__");
5860 Builder.defineMacro("__sparc_v9__");
5861 Builder.defineMacro("__sparcv9__");
5862 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005863 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005864
Craig Topper3164f332014-03-11 03:39:26 +00005865 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005866 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5867 .Case("v9", true)
5868 .Case("ultrasparc", true)
5869 .Case("ultrasparc3", true)
5870 .Case("niagara", true)
5871 .Case("niagara2", true)
5872 .Case("niagara3", true)
5873 .Case("niagara4", true)
5874 .Default(false);
5875
5876 // No need to store the CPU yet. There aren't any CPU-specific
5877 // macros to define.
5878 return CPUKnown;
5879 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005880};
5881
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005882class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005883 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005884 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005885 std::string CPU;
5886 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005887 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005888
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005889public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005890 SystemZTargetInfo(const llvm::Triple &Triple)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005891 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005892 IntMaxType = SignedLong;
5893 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005894 TLSSupported = true;
5895 IntWidth = IntAlign = 32;
5896 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5897 PointerWidth = PointerAlign = 64;
5898 LongDoubleWidth = 128;
5899 LongDoubleAlign = 64;
5900 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005901 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005902 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00005903 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 +00005904 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5905 }
5906 void getTargetDefines(const LangOptions &Opts,
5907 MacroBuilder &Builder) const override {
5908 Builder.defineMacro("__s390__");
5909 Builder.defineMacro("__s390x__");
5910 Builder.defineMacro("__zarch__");
5911 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005912 if (HasTransactionalExecution)
5913 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005914 if (Opts.ZVector)
5915 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005916 }
5917 void getTargetBuiltins(const Builtin::Info *&Records,
5918 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005919 Records = BuiltinInfo;
5920 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005921 }
5922
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005923 void getGCCRegNames(const char *const *&Names,
5924 unsigned &NumNames) const override;
5925 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5926 unsigned &NumAliases) const override {
5927 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005928 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005929 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005930 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005931 bool validateAsmConstraint(const char *&Name,
5932 TargetInfo::ConstraintInfo &info) const override;
5933 const char *getClobbers() const override {
5934 // FIXME: Is this really right?
5935 return "";
5936 }
5937 BuiltinVaListKind getBuiltinVaListKind() const override {
5938 return TargetInfo::SystemZBuiltinVaList;
5939 }
5940 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005941 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005942 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5943 .Case("z10", true)
5944 .Case("z196", true)
5945 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005946 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005947 .Default(false);
5948
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005949 return CPUKnown;
5950 }
Eric Christopheref1e2952015-08-28 02:13:58 +00005951 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
Eric Christophera8a14c32015-08-31 18:39:16 +00005952 StringRef CPU,
5953 std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005954 if (CPU == "zEC12")
5955 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005956 if (CPU == "z13") {
5957 Features["transactional-execution"] = true;
5958 Features["vector"] = true;
5959 }
Eric Christopher007b0a02015-08-28 22:32:01 +00005960 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005961 }
5962
5963 bool handleTargetFeatures(std::vector<std::string> &Features,
5964 DiagnosticsEngine &Diags) override {
5965 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00005966 for (const auto &Feature : Features) {
5967 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005968 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00005969 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005970 HasVector = true;
5971 }
5972 // If we use the vector ABI, vector types are 64-bit aligned.
5973 if (HasVector) {
5974 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005975 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5976 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005977 }
5978 return true;
5979 }
5980
5981 bool hasFeature(StringRef Feature) const override {
5982 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005983 .Case("systemz", true)
5984 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005985 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005986 .Default(false);
5987 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005988
5989 StringRef getABI() const override {
5990 if (HasVector)
5991 return "vector";
5992 return "";
5993 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00005994
5995 bool useFloat128ManglingForLongDouble() const override {
5996 return true;
5997 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005998};
5999
6000const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6001#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006002 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006003#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006004};
6005
6006const char *const SystemZTargetInfo::GCCRegNames[] = {
6007 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6008 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6009 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6010 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6011};
6012
6013void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
6014 unsigned &NumNames) const {
6015 Names = GCCRegNames;
6016 NumNames = llvm::array_lengthof(GCCRegNames);
6017}
6018
6019bool SystemZTargetInfo::
6020validateAsmConstraint(const char *&Name,
6021 TargetInfo::ConstraintInfo &Info) const {
6022 switch (*Name) {
6023 default:
6024 return false;
6025
6026 case 'a': // Address register
6027 case 'd': // Data register (equivalent to 'r')
6028 case 'f': // Floating-point register
6029 Info.setAllowsRegister();
6030 return true;
6031
6032 case 'I': // Unsigned 8-bit constant
6033 case 'J': // Unsigned 12-bit constant
6034 case 'K': // Signed 16-bit constant
6035 case 'L': // Signed 20-bit displacement (on all targets we support)
6036 case 'M': // 0x7fffffff
6037 return true;
6038
6039 case 'Q': // Memory with base and unsigned 12-bit displacement
6040 case 'R': // Likewise, plus an index
6041 case 'S': // Memory with base and signed 20-bit displacement
6042 case 'T': // Likewise, plus an index
6043 Info.setAllowsMemory();
6044 return true;
6045 }
6046}
Ulrich Weigand47445072013-05-06 16:26:41 +00006047
Eric Christopherc48497a2015-09-18 21:26:24 +00006048class MSP430TargetInfo : public TargetInfo {
6049 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006050
Eric Christopherc48497a2015-09-18 21:26:24 +00006051public:
6052 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6053 BigEndian = false;
6054 TLSSupported = false;
6055 IntWidth = 16;
6056 IntAlign = 16;
6057 LongWidth = 32;
6058 LongLongWidth = 64;
6059 LongAlign = LongLongAlign = 16;
6060 PointerWidth = 16;
6061 PointerAlign = 16;
6062 SuitableAlign = 16;
6063 SizeType = UnsignedInt;
6064 IntMaxType = SignedLongLong;
6065 IntPtrType = SignedInt;
6066 PtrDiffType = SignedInt;
6067 SigAtomicType = SignedLong;
6068 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006069 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006070 void getTargetDefines(const LangOptions &Opts,
6071 MacroBuilder &Builder) const override {
6072 Builder.defineMacro("MSP430");
6073 Builder.defineMacro("__MSP430__");
6074 // FIXME: defines for different 'flavours' of MCU
6075 }
6076 void getTargetBuiltins(const Builtin::Info *&Records,
6077 unsigned &NumRecords) const override {
6078 // FIXME: Implement.
6079 Records = nullptr;
6080 NumRecords = 0;
6081 }
6082 bool hasFeature(StringRef Feature) const override {
6083 return Feature == "msp430";
6084 }
6085 void getGCCRegNames(const char *const *&Names,
6086 unsigned &NumNames) const override;
6087 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6088 unsigned &NumAliases) const override {
6089 // No aliases.
6090 Aliases = nullptr;
6091 NumAliases = 0;
6092 }
6093 bool validateAsmConstraint(const char *&Name,
6094 TargetInfo::ConstraintInfo &info) const override {
6095 // FIXME: implement
6096 switch (*Name) {
6097 case 'K': // the constant 1
6098 case 'L': // constant -1^20 .. 1^19
6099 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006100 return true;
6101 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006102 // No target constraints for now.
6103 return false;
6104 }
6105 const char *getClobbers() const override {
6106 // FIXME: Is this really right?
6107 return "";
6108 }
6109 BuiltinVaListKind getBuiltinVaListKind() const override {
6110 // FIXME: implement
6111 return TargetInfo::CharPtrBuiltinVaList;
6112 }
6113};
6114
6115const char *const MSP430TargetInfo::GCCRegNames[] = {
6116 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6117 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6118
6119void MSP430TargetInfo::getGCCRegNames(const char *const *&Names,
6120 unsigned &NumNames) const {
6121 Names = GCCRegNames;
6122 NumNames = llvm::array_lengthof(GCCRegNames);
6123}
6124
6125// LLVM and Clang cannot be used directly to output native binaries for
6126// target, but is used to compile C code to llvm bitcode with correct
6127// type and alignment information.
6128//
6129// TCE uses the llvm bitcode as input and uses it for generating customized
6130// target processor and program binary. TCE co-design environment is
6131// publicly available in http://tce.cs.tut.fi
6132
6133static const unsigned TCEOpenCLAddrSpaceMap[] = {
6134 3, // opencl_global
6135 4, // opencl_local
6136 5, // opencl_constant
6137 // FIXME: generic has to be added to the target
6138 0, // opencl_generic
6139 0, // cuda_device
6140 0, // cuda_constant
6141 0 // cuda_shared
6142};
6143
6144class TCETargetInfo : public TargetInfo {
6145public:
6146 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6147 TLSSupported = false;
6148 IntWidth = 32;
6149 LongWidth = LongLongWidth = 32;
6150 PointerWidth = 32;
6151 IntAlign = 32;
6152 LongAlign = LongLongAlign = 32;
6153 PointerAlign = 32;
6154 SuitableAlign = 32;
6155 SizeType = UnsignedInt;
6156 IntMaxType = SignedLong;
6157 IntPtrType = SignedInt;
6158 PtrDiffType = SignedInt;
6159 FloatWidth = 32;
6160 FloatAlign = 32;
6161 DoubleWidth = 32;
6162 DoubleAlign = 32;
6163 LongDoubleWidth = 32;
6164 LongDoubleAlign = 32;
6165 FloatFormat = &llvm::APFloat::IEEEsingle;
6166 DoubleFormat = &llvm::APFloat::IEEEsingle;
6167 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6168 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6169 "-f64:32-v64:32-v128:32-a:0:32-n32";
6170 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6171 UseAddrSpaceMapMangling = true;
6172 }
6173
6174 void getTargetDefines(const LangOptions &Opts,
6175 MacroBuilder &Builder) const override {
6176 DefineStd(Builder, "tce", Opts);
6177 Builder.defineMacro("__TCE__");
6178 Builder.defineMacro("__TCE_V1__");
6179 }
6180 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6181
6182 void getTargetBuiltins(const Builtin::Info *&Records,
6183 unsigned &NumRecords) const override {}
6184 const char *getClobbers() const override { return ""; }
6185 BuiltinVaListKind getBuiltinVaListKind() const override {
6186 return TargetInfo::VoidPtrBuiltinVaList;
6187 }
6188 void getGCCRegNames(const char *const *&Names,
6189 unsigned &NumNames) const override {}
6190 bool validateAsmConstraint(const char *&Name,
6191 TargetInfo::ConstraintInfo &info) const override {
6192 return true;
6193 }
6194 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6195 unsigned &NumAliases) const override {}
6196};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006197
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006198class BPFTargetInfo : public TargetInfo {
6199public:
6200 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6201 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6202 SizeType = UnsignedLong;
6203 PtrDiffType = SignedLong;
6204 IntPtrType = SignedLong;
6205 IntMaxType = SignedLong;
6206 Int64Type = SignedLong;
6207 RegParmMax = 5;
6208 if (Triple.getArch() == llvm::Triple::bpfeb) {
6209 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006210 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006211 } else {
6212 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006213 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006214 }
6215 MaxAtomicPromoteWidth = 64;
6216 MaxAtomicInlineWidth = 64;
6217 TLSSupported = false;
6218 }
6219 void getTargetDefines(const LangOptions &Opts,
6220 MacroBuilder &Builder) const override {
6221 DefineStd(Builder, "bpf", Opts);
6222 Builder.defineMacro("__BPF__");
6223 }
6224 bool hasFeature(StringRef Feature) const override {
6225 return Feature == "bpf";
6226 }
6227
6228 void getTargetBuiltins(const Builtin::Info *&Records,
6229 unsigned &NumRecords) const override {}
6230 const char *getClobbers() const override {
6231 return "";
6232 }
6233 BuiltinVaListKind getBuiltinVaListKind() const override {
6234 return TargetInfo::VoidPtrBuiltinVaList;
6235 }
6236 void getGCCRegNames(const char * const *&Names,
6237 unsigned &NumNames) const override {
6238 Names = nullptr;
6239 NumNames = 0;
6240 }
6241 bool validateAsmConstraint(const char *&Name,
6242 TargetInfo::ConstraintInfo &info) const override {
6243 return true;
6244 }
6245 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6246 unsigned &NumAliases) const override {
6247 Aliases = nullptr;
6248 NumAliases = 0;
6249 }
6250};
6251
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006252class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006253 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006254
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006255 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006256 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006257 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006258 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006259 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006260 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006261 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006262 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006263 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006264 enum DspRevEnum {
6265 NoDSP, DSP1, DSP2
6266 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006267 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006268
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006269protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006270 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006271 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006272
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006273public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006274 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6275 const std::string &CPUStr)
6276 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006277 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006278 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6279 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6280 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006281
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006282 bool isNaN2008Default() const {
6283 return CPU == "mips32r6" || CPU == "mips64r6";
6284 }
6285
6286 bool isFP64Default() const {
6287 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6288 }
6289
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006290 bool isNan2008() const override {
6291 return IsNan2008;
6292 }
6293
Alp Toker4925ba72014-06-07 23:30:42 +00006294 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006295 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006296 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6297 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006298 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006299 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006300 .Case("mips1", IsMips32)
6301 .Case("mips2", IsMips32)
6302 .Case("mips3", true)
6303 .Case("mips4", true)
6304 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006305 .Case("mips32", IsMips32)
6306 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006307 .Case("mips32r3", IsMips32)
6308 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006309 .Case("mips32r6", IsMips32)
6310 .Case("mips64", true)
6311 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006312 .Case("mips64r3", true)
6313 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006314 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006315 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006316 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006317 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006318 const std::string& getCPU() const { return CPU; }
Eric Christopheref1e2952015-08-28 02:13:58 +00006319 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
Eric Christophera8a14c32015-08-31 18:39:16 +00006320 StringRef CPU,
6321 std::vector<std::string> &FeaturesVec) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006322 if (CPU == "octeon")
6323 Features["mips64r2"] = Features["cnmips"] = true;
6324 else
6325 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006326 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006327 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006328
Craig Topper3164f332014-03-11 03:39:26 +00006329 void getTargetDefines(const LangOptions &Opts,
6330 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006331 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006332 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006333 if (Opts.GNUMode)
6334 Builder.defineMacro("mips");
6335
Simon Atanasyan683535b2012-08-29 19:14:58 +00006336 Builder.defineMacro("__REGISTER_PREFIX__", "");
6337
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006338 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006339 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006340 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006341 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006342 case SoftFloat:
6343 Builder.defineMacro("__mips_soft_float", Twine(1));
6344 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006345 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006346
Simon Atanasyan16071912013-04-14 14:07:30 +00006347 if (IsSingleFloat)
6348 Builder.defineMacro("__mips_single_float", Twine(1));
6349
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006350 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6351 Builder.defineMacro("_MIPS_FPSET",
6352 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6353
Simon Atanasyan72244b62012-07-05 16:06:06 +00006354 if (IsMips16)
6355 Builder.defineMacro("__mips16", Twine(1));
6356
Simon Atanasyan60777612013-04-14 14:07:51 +00006357 if (IsMicromips)
6358 Builder.defineMacro("__mips_micromips", Twine(1));
6359
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006360 if (IsNan2008)
6361 Builder.defineMacro("__mips_nan2008", Twine(1));
6362
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006363 switch (DspRev) {
6364 default:
6365 break;
6366 case DSP1:
6367 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6368 Builder.defineMacro("__mips_dsp", Twine(1));
6369 break;
6370 case DSP2:
6371 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6372 Builder.defineMacro("__mips_dspr2", Twine(1));
6373 Builder.defineMacro("__mips_dsp", Twine(1));
6374 break;
6375 }
6376
Jack Carter44ff1e52013-08-12 17:20:29 +00006377 if (HasMSA)
6378 Builder.defineMacro("__mips_msa", Twine(1));
6379
Simon Atanasyan26f19672012-04-05 19:28:31 +00006380 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6381 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6382 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006383
6384 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6385 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006386 }
6387
Craig Topper3164f332014-03-11 03:39:26 +00006388 void getTargetBuiltins(const Builtin::Info *&Records,
6389 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006390 Records = BuiltinInfo;
6391 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006392 }
Craig Topper3164f332014-03-11 03:39:26 +00006393 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006394 return llvm::StringSwitch<bool>(Feature)
6395 .Case("mips", true)
6396 .Case("fp64", HasFP64)
6397 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006398 }
Craig Topper3164f332014-03-11 03:39:26 +00006399 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006400 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006401 }
Craig Topper3164f332014-03-11 03:39:26 +00006402 void getGCCRegNames(const char * const *&Names,
6403 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006404 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006405 // CPU register names
6406 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006407 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6408 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6409 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006410 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6411 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006412 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6413 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6414 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6415 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006416 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006417 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006418 "$fcc5","$fcc6","$fcc7",
6419 // MSA register names
6420 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6421 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6422 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6423 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6424 // MSA control register names
6425 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6426 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006427 };
6428 Names = GCCRegNames;
6429 NumNames = llvm::array_lengthof(GCCRegNames);
6430 }
Craig Topper3164f332014-03-11 03:39:26 +00006431 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6432 unsigned &NumAliases) const override = 0;
6433 bool validateAsmConstraint(const char *&Name,
6434 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006435 switch (*Name) {
6436 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006437 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006438 case 'r': // CPU registers.
6439 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006440 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006441 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006442 case 'c': // $25 for indirect jumps
6443 case 'l': // lo register
6444 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006445 Info.setAllowsRegister();
6446 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006447 case 'I': // Signed 16-bit constant
6448 case 'J': // Integer 0
6449 case 'K': // Unsigned 16-bit constant
6450 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6451 case 'M': // Constants not loadable via lui, addiu, or ori
6452 case 'N': // Constant -1 to -65535
6453 case 'O': // A signed 15-bit constant
6454 case 'P': // A constant between 1 go 65535
6455 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006456 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006457 Info.setAllowsMemory();
6458 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006459 case 'Z':
6460 if (Name[1] == 'C') { // An address usable by ll, and sc.
6461 Info.setAllowsMemory();
6462 Name++; // Skip over 'Z'.
6463 return true;
6464 }
6465 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006466 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006467 }
6468
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006469 std::string convertConstraint(const char *&Constraint) const override {
6470 std::string R;
6471 switch (*Constraint) {
6472 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6473 if (Constraint[1] == 'C') {
6474 R = std::string("^") + std::string(Constraint, 2);
6475 Constraint++;
6476 return R;
6477 }
6478 break;
6479 }
6480 return TargetInfo::convertConstraint(Constraint);
6481 }
6482
Craig Topper3164f332014-03-11 03:39:26 +00006483 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006484 // In GCC, $1 is not widely used in generated code (it's used only in a few
6485 // specific situations), so there is no real need for users to add it to
6486 // the clobbers list if they want to use it in their inline assembly code.
6487 //
6488 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6489 // code generation, so using it in inline assembly without adding it to the
6490 // clobbers list can cause conflicts between the inline assembly code and
6491 // the surrounding generated code.
6492 //
6493 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6494 // operands, which will conflict with the ".set at" assembler option (which
6495 // we use only for inline assembly, in order to maintain compatibility with
6496 // GCC) and will also conflict with the user's usage of $1.
6497 //
6498 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6499 // register for generated code is to automatically clobber $1 for all inline
6500 // assembly code.
6501 //
6502 // FIXME: We should automatically clobber $1 only for inline assembly code
6503 // which actually uses it. This would allow LLVM to use $1 for inline
6504 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006505 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006506 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006507
Craig Topper3164f332014-03-11 03:39:26 +00006508 bool handleTargetFeatures(std::vector<std::string> &Features,
6509 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006510 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006511 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006512 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006513 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006514 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006515 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006516 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006517
Eric Christopher610fe112015-08-26 08:21:55 +00006518 for (const auto &Feature : Features) {
6519 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006520 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006521 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006522 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006523 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006524 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006525 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006526 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006527 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006528 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006529 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006530 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006531 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006532 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006533 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006534 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006535 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006536 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006537 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006538 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006539 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006540 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006541 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006542
Eric Christopher964a5f32015-08-05 23:48:05 +00006543 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006544
Rafael Espindolaeb265472013-08-21 21:59:03 +00006545 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006546 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006547
Craig Topper3164f332014-03-11 03:39:26 +00006548 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006549 if (RegNo == 0) return 4;
6550 if (RegNo == 1) return 5;
6551 return -1;
6552 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006553
6554 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006555};
6556
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006557const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006558#define BUILTIN(ID, TYPE, ATTRS) \
6559 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6560#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6561 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006562#include "clang/Basic/BuiltinsMips.def"
6563};
6564
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006565class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006566public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006567 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006568 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006569 SizeType = UnsignedInt;
6570 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006571 Int64Type = SignedLongLong;
6572 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006573 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006574 }
Craig Topper3164f332014-03-11 03:39:26 +00006575 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006576 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006577 ABI = Name;
6578 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006579 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006580 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006581 }
Craig Topper3164f332014-03-11 03:39:26 +00006582 void getTargetDefines(const LangOptions &Opts,
6583 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006584 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006585
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006586 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006587 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6588
6589 const std::string& CPUStr = getCPU();
6590 if (CPUStr == "mips32")
6591 Builder.defineMacro("__mips_isa_rev", "1");
6592 else if (CPUStr == "mips32r2")
6593 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006594 else if (CPUStr == "mips32r3")
6595 Builder.defineMacro("__mips_isa_rev", "3");
6596 else if (CPUStr == "mips32r5")
6597 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006598 else if (CPUStr == "mips32r6")
6599 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006600
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006601 if (ABI == "o32") {
6602 Builder.defineMacro("__mips_o32");
6603 Builder.defineMacro("_ABIO32", "1");
6604 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6605 }
6606 else if (ABI == "eabi")
6607 Builder.defineMacro("__mips_eabi");
6608 else
David Blaikie83d382b2011-09-23 05:06:16 +00006609 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006610 }
Craig Topper3164f332014-03-11 03:39:26 +00006611 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6612 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006613 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6614 { { "at" }, "$1" },
6615 { { "v0" }, "$2" },
6616 { { "v1" }, "$3" },
6617 { { "a0" }, "$4" },
6618 { { "a1" }, "$5" },
6619 { { "a2" }, "$6" },
6620 { { "a3" }, "$7" },
6621 { { "t0" }, "$8" },
6622 { { "t1" }, "$9" },
6623 { { "t2" }, "$10" },
6624 { { "t3" }, "$11" },
6625 { { "t4" }, "$12" },
6626 { { "t5" }, "$13" },
6627 { { "t6" }, "$14" },
6628 { { "t7" }, "$15" },
6629 { { "s0" }, "$16" },
6630 { { "s1" }, "$17" },
6631 { { "s2" }, "$18" },
6632 { { "s3" }, "$19" },
6633 { { "s4" }, "$20" },
6634 { { "s5" }, "$21" },
6635 { { "s6" }, "$22" },
6636 { { "s7" }, "$23" },
6637 { { "t8" }, "$24" },
6638 { { "t9" }, "$25" },
6639 { { "k0" }, "$26" },
6640 { { "k1" }, "$27" },
6641 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006642 { { "sp","$sp" }, "$29" },
6643 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006644 { { "ra" }, "$31" }
6645 };
6646 Aliases = GCCRegAliases;
6647 NumAliases = llvm::array_lengthof(GCCRegAliases);
6648 }
6649};
6650
6651class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006652 void setDataLayoutString() override {
6653 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006654 }
6655
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006656public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006657 Mips32EBTargetInfo(const llvm::Triple &Triple)
6658 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006659 }
Craig Topper3164f332014-03-11 03:39:26 +00006660 void getTargetDefines(const LangOptions &Opts,
6661 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006662 DefineStd(Builder, "MIPSEB", Opts);
6663 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006664 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006665 }
6666};
6667
6668class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006669 void setDataLayoutString() override {
6670 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006671 }
6672
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006673public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006674 Mips32ELTargetInfo(const llvm::Triple &Triple)
6675 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006676 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006677 }
Craig Topper3164f332014-03-11 03:39:26 +00006678 void getTargetDefines(const LangOptions &Opts,
6679 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006680 DefineStd(Builder, "MIPSEL", Opts);
6681 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006682 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006683 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006684};
Akira Hatanakabef17452011-09-20 19:21:49 +00006685
6686class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006687public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006688 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006689 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006690 LongDoubleWidth = LongDoubleAlign = 128;
6691 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006692 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6693 LongDoubleWidth = LongDoubleAlign = 64;
6694 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6695 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006696 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006697 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006698 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006699 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006700
6701 void setN64ABITypes() {
6702 LongWidth = LongAlign = 64;
6703 PointerWidth = PointerAlign = 64;
6704 SizeType = UnsignedLong;
6705 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006706 Int64Type = SignedLong;
6707 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006708 }
6709
6710 void setN32ABITypes() {
6711 LongWidth = LongAlign = 32;
6712 PointerWidth = PointerAlign = 32;
6713 SizeType = UnsignedInt;
6714 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006715 Int64Type = SignedLongLong;
6716 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006717 }
6718
Craig Topper3164f332014-03-11 03:39:26 +00006719 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006720 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006721 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006722 ABI = Name;
6723 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006724 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006725 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006726 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006727 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006728 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006729 }
6730 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006731 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006732
Craig Topper3164f332014-03-11 03:39:26 +00006733 void getTargetDefines(const LangOptions &Opts,
6734 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006735 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006736
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006737 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006738 Builder.defineMacro("__mips64");
6739 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006740 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6741
6742 const std::string& CPUStr = getCPU();
6743 if (CPUStr == "mips64")
6744 Builder.defineMacro("__mips_isa_rev", "1");
6745 else if (CPUStr == "mips64r2")
6746 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006747 else if (CPUStr == "mips64r3")
6748 Builder.defineMacro("__mips_isa_rev", "3");
6749 else if (CPUStr == "mips64r5")
6750 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006751 else if (CPUStr == "mips64r6")
6752 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006753
Akira Hatanakabef17452011-09-20 19:21:49 +00006754 if (ABI == "n32") {
6755 Builder.defineMacro("__mips_n32");
6756 Builder.defineMacro("_ABIN32", "2");
6757 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6758 }
6759 else if (ABI == "n64") {
6760 Builder.defineMacro("__mips_n64");
6761 Builder.defineMacro("_ABI64", "3");
6762 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6763 }
6764 else
David Blaikie83d382b2011-09-23 05:06:16 +00006765 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006766 }
Craig Topper3164f332014-03-11 03:39:26 +00006767 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6768 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006769 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6770 { { "at" }, "$1" },
6771 { { "v0" }, "$2" },
6772 { { "v1" }, "$3" },
6773 { { "a0" }, "$4" },
6774 { { "a1" }, "$5" },
6775 { { "a2" }, "$6" },
6776 { { "a3" }, "$7" },
6777 { { "a4" }, "$8" },
6778 { { "a5" }, "$9" },
6779 { { "a6" }, "$10" },
6780 { { "a7" }, "$11" },
6781 { { "t0" }, "$12" },
6782 { { "t1" }, "$13" },
6783 { { "t2" }, "$14" },
6784 { { "t3" }, "$15" },
6785 { { "s0" }, "$16" },
6786 { { "s1" }, "$17" },
6787 { { "s2" }, "$18" },
6788 { { "s3" }, "$19" },
6789 { { "s4" }, "$20" },
6790 { { "s5" }, "$21" },
6791 { { "s6" }, "$22" },
6792 { { "s7" }, "$23" },
6793 { { "t8" }, "$24" },
6794 { { "t9" }, "$25" },
6795 { { "k0" }, "$26" },
6796 { { "k1" }, "$27" },
6797 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006798 { { "sp","$sp" }, "$29" },
6799 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006800 { { "ra" }, "$31" }
6801 };
6802 Aliases = GCCRegAliases;
6803 NumAliases = llvm::array_lengthof(GCCRegAliases);
6804 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006805
6806 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006807};
6808
6809class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006810 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006811 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006812 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 +00006813 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006814 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006815
Akira Hatanakabef17452011-09-20 19:21:49 +00006816 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006817
Akira Hatanakabef17452011-09-20 19:21:49 +00006818public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006819 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006820 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006821 void getTargetDefines(const LangOptions &Opts,
6822 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006823 DefineStd(Builder, "MIPSEB", Opts);
6824 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006825 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006826 }
6827};
6828
6829class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006830 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006831 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006832 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 +00006833 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006834 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006835 }
6836public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006837 Mips64ELTargetInfo(const llvm::Triple &Triple)
6838 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006839 // Default ABI is n64.
6840 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006841 }
Craig Topper3164f332014-03-11 03:39:26 +00006842 void getTargetDefines(const LangOptions &Opts,
6843 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006844 DefineStd(Builder, "MIPSEL", Opts);
6845 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006846 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006847 }
6848};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006849
Ivan Krasindd7403e2011-08-24 20:22:22 +00006850class PNaClTargetInfo : public TargetInfo {
6851public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006852 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006853 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006854 this->UserLabelPrefix = "";
6855 this->LongAlign = 32;
6856 this->LongWidth = 32;
6857 this->PointerAlign = 32;
6858 this->PointerWidth = 32;
6859 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006860 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006861 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006862 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006863 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006864 this->SizeType = TargetInfo::UnsignedInt;
6865 this->PtrDiffType = TargetInfo::SignedInt;
6866 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006867 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006868 }
6869
Craig Toppere6f17d02014-03-11 04:07:52 +00006870 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006871 Builder.defineMacro("__le32__");
6872 Builder.defineMacro("__pnacl__");
6873 }
Craig Topper3164f332014-03-11 03:39:26 +00006874 void getTargetDefines(const LangOptions &Opts,
6875 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006876 getArchDefines(Opts, Builder);
6877 }
Craig Topper3164f332014-03-11 03:39:26 +00006878 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006879 return Feature == "pnacl";
6880 }
Craig Topper3164f332014-03-11 03:39:26 +00006881 void getTargetBuiltins(const Builtin::Info *&Records,
6882 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006883 }
Craig Topper3164f332014-03-11 03:39:26 +00006884 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006885 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006886 }
Craig Topper3164f332014-03-11 03:39:26 +00006887 void getGCCRegNames(const char * const *&Names,
6888 unsigned &NumNames) const override;
6889 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6890 unsigned &NumAliases) const override;
6891 bool validateAsmConstraint(const char *&Name,
6892 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006893 return false;
6894 }
6895
Craig Topper3164f332014-03-11 03:39:26 +00006896 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006897 return "";
6898 }
6899};
6900
6901void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6902 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006903 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006904 NumNames = 0;
6905}
6906
6907void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6908 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006909 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006910 NumAliases = 0;
6911}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006912
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006913// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6914class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6915public:
6916 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00006917 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006918 }
6919
6920 BuiltinVaListKind getBuiltinVaListKind() const override {
6921 return TargetInfo::PNaClABIBuiltinVaList;
6922 }
6923};
6924
JF Bastien643817d2014-09-12 17:52:47 +00006925class Le64TargetInfo : public TargetInfo {
6926 static const Builtin::Info BuiltinInfo[];
6927
6928public:
6929 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6930 BigEndian = false;
6931 NoAsmVariants = true;
6932 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6933 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006934 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006935 }
6936
6937 void getTargetDefines(const LangOptions &Opts,
6938 MacroBuilder &Builder) const override {
6939 DefineStd(Builder, "unix", Opts);
6940 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6941 Builder.defineMacro("__ELF__");
6942 }
6943 void getTargetBuiltins(const Builtin::Info *&Records,
6944 unsigned &NumRecords) const override {
6945 Records = BuiltinInfo;
6946 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6947 }
6948 BuiltinVaListKind getBuiltinVaListKind() const override {
6949 return TargetInfo::PNaClABIBuiltinVaList;
6950 }
6951 const char *getClobbers() const override { return ""; }
6952 void getGCCRegNames(const char *const *&Names,
6953 unsigned &NumNames) const override {
6954 Names = nullptr;
6955 NumNames = 0;
6956 }
6957 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6958 unsigned &NumAliases) const override {
6959 Aliases = nullptr;
6960 NumAliases = 0;
6961 }
6962 bool validateAsmConstraint(const char *&Name,
6963 TargetInfo::ConstraintInfo &Info) const override {
6964 return false;
6965 }
6966
6967 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006968};
Dan Gohmanc2853072015-09-03 22:51:53 +00006969
6970class WebAssemblyTargetInfo : public TargetInfo {
6971 static const Builtin::Info BuiltinInfo[];
6972
6973 enum SIMDEnum {
6974 NoSIMD,
6975 SIMD128,
6976 } SIMDLevel;
6977
6978public:
6979 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
6980 : TargetInfo(T), SIMDLevel(NoSIMD) {
6981 BigEndian = false;
6982 NoAsmVariants = true;
6983 SuitableAlign = 128;
6984 LargeArrayMinWidth = 128;
6985 LargeArrayAlign = 128;
6986 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00006987 SigAtomicType = SignedLong;
Dan Gohmanc2853072015-09-03 22:51:53 +00006988 }
6989
6990protected:
6991 void getTargetDefines(const LangOptions &Opts,
6992 MacroBuilder &Builder) const override {
6993 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
6994 if (SIMDLevel >= SIMD128)
6995 Builder.defineMacro("__wasm_simd128__");
6996 }
6997
6998private:
6999 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7000 StringRef CPU,
7001 std::vector<std::string> &FeaturesVec) const override {
7002 if (CPU == "bleeding-edge")
7003 Features["simd128"] = true;
7004 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7005 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007006 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007007 return llvm::StringSwitch<bool>(Feature)
7008 .Case("simd128", SIMDLevel >= SIMD128)
7009 .Default(false);
7010 }
7011 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007012 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007013 for (const auto &Feature : Features) {
7014 if (Feature == "+simd128") {
7015 SIMDLevel = std::max(SIMDLevel, SIMD128);
7016 continue;
7017 }
7018 if (Feature == "-simd128") {
7019 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7020 continue;
7021 }
7022
7023 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7024 << "-target-feature";
7025 return false;
7026 }
7027 return true;
7028 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007029 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007030 return llvm::StringSwitch<bool>(Name)
7031 .Case("mvp", true)
7032 .Case("bleeding-edge", true)
7033 .Case("generic", true)
7034 .Default(false);
7035 }
7036 void getTargetBuiltins(const Builtin::Info *&Records,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007037 unsigned &NumRecords) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007038 Records = BuiltinInfo;
7039 NumRecords = clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin;
7040 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007041 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007042 // TODO: Implement va_list properly.
7043 return VoidPtrBuiltinVaList;
7044 }
7045 void getGCCRegNames(const char *const *&Names,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007046 unsigned &NumNames) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007047 Names = nullptr;
7048 NumNames = 0;
7049 }
7050 void getGCCRegAliases(const GCCRegAlias *&Aliases,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007051 unsigned &NumAliases) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007052 Aliases = nullptr;
7053 NumAliases = 0;
7054 }
7055 bool
7056 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007057 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007058 return false;
7059 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007060 const char *getClobbers() const final { return ""; }
7061 bool isCLZForZeroUndef() const final { return false; }
7062 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007063 IntType getIntTypeByWidth(unsigned BitWidth,
7064 bool IsSigned) const final {
7065 // WebAssembly prefers long long for explicitly 64-bit integers.
7066 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7067 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7068 }
7069 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7070 bool IsSigned) const final {
7071 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7072 return BitWidth == 64
7073 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7074 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7075 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007076};
7077
7078const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7079#define BUILTIN(ID, TYPE, ATTRS) \
7080 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7081#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7082 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7083#include "clang/Basic/BuiltinsWebAssembly.def"
7084};
7085
7086class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7087public:
7088 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7089 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007090 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohmanc2853072015-09-03 22:51:53 +00007091 DataLayoutString = "e-p:32:32-i64:64-n32:64-S128";
7092 }
7093
7094protected:
7095 void getTargetDefines(const LangOptions &Opts,
7096 MacroBuilder &Builder) const override {
7097 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7098 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7099 }
7100};
7101
7102class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7103public:
7104 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7105 : WebAssemblyTargetInfo(T) {
7106 LongAlign = LongWidth = 64;
7107 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007108 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohmanc2853072015-09-03 22:51:53 +00007109 DataLayoutString = "e-p:64:64-i64:64-n32:64-S128";
7110 }
7111
7112protected:
7113 void getTargetDefines(const LangOptions &Opts,
7114 MacroBuilder &Builder) const override {
7115 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7116 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7117 }
7118};
7119
JF Bastien643817d2014-09-12 17:52:47 +00007120const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7121#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007122 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007123#include "clang/Basic/BuiltinsLe64.def"
7124};
7125
Eric Christopherc48497a2015-09-18 21:26:24 +00007126static const unsigned SPIRAddrSpaceMap[] = {
7127 1, // opencl_global
7128 3, // opencl_local
7129 2, // opencl_constant
7130 4, // opencl_generic
7131 0, // cuda_device
7132 0, // cuda_constant
7133 0 // cuda_shared
7134};
7135class SPIRTargetInfo : public TargetInfo {
7136public:
7137 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7138 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7139 "SPIR target must use unknown OS");
7140 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7141 "SPIR target must use unknown environment type");
7142 BigEndian = false;
7143 TLSSupported = false;
7144 LongWidth = LongAlign = 64;
7145 AddrSpaceMap = &SPIRAddrSpaceMap;
7146 UseAddrSpaceMapMangling = true;
7147 // Define available target features
7148 // These must be defined in sorted order!
7149 NoAsmVariants = true;
7150 }
7151 void getTargetDefines(const LangOptions &Opts,
7152 MacroBuilder &Builder) const override {
7153 DefineStd(Builder, "SPIR", Opts);
7154 }
7155 bool hasFeature(StringRef Feature) const override {
7156 return Feature == "spir";
7157 }
Craig Topper3164f332014-03-11 03:39:26 +00007158
Eric Christopherc48497a2015-09-18 21:26:24 +00007159 void getTargetBuiltins(const Builtin::Info *&Records,
7160 unsigned &NumRecords) const override {}
7161 const char *getClobbers() const override { return ""; }
7162 void getGCCRegNames(const char *const *&Names,
7163 unsigned &NumNames) const override {}
7164 bool validateAsmConstraint(const char *&Name,
7165 TargetInfo::ConstraintInfo &info) const override {
7166 return true;
7167 }
7168 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7169 unsigned &NumAliases) const override {}
7170 BuiltinVaListKind getBuiltinVaListKind() const override {
7171 return TargetInfo::VoidPtrBuiltinVaList;
7172 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007173
Eric Christopherc48497a2015-09-18 21:26:24 +00007174 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7175 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7176 : CCCR_Warning;
7177 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007178
Eric Christopherc48497a2015-09-18 21:26:24 +00007179 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7180 return CC_SpirFunction;
7181 }
7182};
Guy Benyeib798fc92012-12-11 21:38:14 +00007183
Eric Christopherc48497a2015-09-18 21:26:24 +00007184class SPIR32TargetInfo : public SPIRTargetInfo {
7185public:
7186 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7187 PointerWidth = PointerAlign = 32;
7188 SizeType = TargetInfo::UnsignedInt;
7189 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7190 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7191 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7192 }
7193 void getTargetDefines(const LangOptions &Opts,
7194 MacroBuilder &Builder) const override {
7195 DefineStd(Builder, "SPIR32", Opts);
7196 }
7197};
Guy Benyeib798fc92012-12-11 21:38:14 +00007198
Eric Christopherc48497a2015-09-18 21:26:24 +00007199class SPIR64TargetInfo : public SPIRTargetInfo {
7200public:
7201 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7202 PointerWidth = PointerAlign = 64;
7203 SizeType = TargetInfo::UnsignedLong;
7204 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7205 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7206 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7207 }
7208 void getTargetDefines(const LangOptions &Opts,
7209 MacroBuilder &Builder) const override {
7210 DefineStd(Builder, "SPIR64", Opts);
7211 }
7212};
Guy Benyeib798fc92012-12-11 21:38:14 +00007213
Robert Lytton0e076492013-08-13 09:43:10 +00007214class XCoreTargetInfo : public TargetInfo {
7215 static const Builtin::Info BuiltinInfo[];
7216public:
7217 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7218 BigEndian = false;
7219 NoAsmVariants = true;
7220 LongLongAlign = 32;
7221 SuitableAlign = 32;
7222 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007223 SizeType = UnsignedInt;
7224 PtrDiffType = SignedInt;
7225 IntPtrType = SignedInt;
7226 WCharType = UnsignedChar;
7227 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007228 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007229 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7230 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007231 }
Craig Topper3164f332014-03-11 03:39:26 +00007232 void getTargetDefines(const LangOptions &Opts,
7233 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007234 Builder.defineMacro("__XS1B__");
7235 }
Craig Topper3164f332014-03-11 03:39:26 +00007236 void getTargetBuiltins(const Builtin::Info *&Records,
7237 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007238 Records = BuiltinInfo;
7239 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
7240 }
Craig Topper3164f332014-03-11 03:39:26 +00007241 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007242 return TargetInfo::VoidPtrBuiltinVaList;
7243 }
Craig Topper3164f332014-03-11 03:39:26 +00007244 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007245 return "";
7246 }
Craig Topper3164f332014-03-11 03:39:26 +00007247 void getGCCRegNames(const char * const *&Names,
7248 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007249 static const char * const GCCRegNames[] = {
7250 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7251 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7252 };
7253 Names = GCCRegNames;
7254 NumNames = llvm::array_lengthof(GCCRegNames);
7255 }
Craig Topper3164f332014-03-11 03:39:26 +00007256 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7257 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00007258 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00007259 NumAliases = 0;
7260 }
Craig Topper3164f332014-03-11 03:39:26 +00007261 bool validateAsmConstraint(const char *&Name,
7262 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007263 return false;
7264 }
Craig Topper3164f332014-03-11 03:39:26 +00007265 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007266 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7267 return (RegNo < 2)? RegNo : -1;
7268 }
Robert Lytton0e076492013-08-13 09:43:10 +00007269};
7270
7271const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007272#define BUILTIN(ID, TYPE, ATTRS) \
7273 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7274#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7275 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007276#include "clang/Basic/BuiltinsXCore.def"
7277};
Robert Lytton0e076492013-08-13 09:43:10 +00007278
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007279// x86_32 Android target
7280class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7281public:
7282 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7283 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7284 SuitableAlign = 32;
7285 LongDoubleWidth = 64;
7286 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7287 }
7288};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007289
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007290// x86_64 Android target
7291class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7292public:
7293 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7294 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7295 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7296 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007297
7298 bool useFloat128ManglingForLongDouble() const override {
7299 return true;
7300 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007301};
7302} // end anonymous namespace
7303
Chris Lattner5ba61f02006-10-14 07:39:34 +00007304//===----------------------------------------------------------------------===//
7305// Driver code
7306//===----------------------------------------------------------------------===//
7307
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007308static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007309 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007310
Daniel Dunbar52322032009-08-18 05:47:58 +00007311 switch (Triple.getArch()) {
7312 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007313 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007314
Tim Northover2a0783d2014-05-30 14:14:07 +00007315 case llvm::Triple::xcore:
7316 return new XCoreTargetInfo(Triple);
7317
7318 case llvm::Triple::hexagon:
7319 return new HexagonTargetInfo(Triple);
7320
7321 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007322 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007323 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007324
7325 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007326 case llvm::Triple::FreeBSD:
7327 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007328 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007329 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007330 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007331 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007332 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007333 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007334 }
7335
Christian Pirker9b019ae2014-02-25 13:51:00 +00007336 case llvm::Triple::aarch64_be:
7337 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007338 case llvm::Triple::FreeBSD:
7339 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007340 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007341 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007342 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007343 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007344 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007345 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007346 }
7347
Daniel Dunbar52322032009-08-18 05:47:58 +00007348 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007349 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007350 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007351 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007352
Daniel Dunbar52322032009-08-18 05:47:58 +00007353 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007354 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007355 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007356 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007357 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007358 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007359 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007360 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007361 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007362 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007363 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007364 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007365 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007366 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007367 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007368 case llvm::Triple::Win32:
7369 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007370 case llvm::Triple::Cygnus:
7371 return new CygwinARMTargetInfo(Triple);
7372 case llvm::Triple::GNU:
7373 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007374 case llvm::Triple::Itanium:
7375 return new ItaniumWindowsARMleTargetInfo(Triple);
7376 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007377 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007378 return new MicrosoftARMleTargetInfo(Triple);
7379 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007380 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007381 return new ARMleTargetInfo(Triple);
7382 }
7383
7384 case llvm::Triple::armeb:
7385 case llvm::Triple::thumbeb:
7386 if (Triple.isOSDarwin())
7387 return new DarwinARMTargetInfo(Triple);
7388
7389 switch (os) {
7390 case llvm::Triple::Linux:
7391 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7392 case llvm::Triple::FreeBSD:
7393 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7394 case llvm::Triple::NetBSD:
7395 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7396 case llvm::Triple::OpenBSD:
7397 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7398 case llvm::Triple::Bitrig:
7399 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7400 case llvm::Triple::RTEMS:
7401 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7402 case llvm::Triple::NaCl:
7403 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7404 default:
7405 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007406 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007407
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007408 case llvm::Triple::bpfeb:
7409 case llvm::Triple::bpfel:
7410 return new BPFTargetInfo(Triple);
7411
Daniel Dunbar52322032009-08-18 05:47:58 +00007412 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007413 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007414
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007415 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007416 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007417 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007418 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007419 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007420 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007421 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007422 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007423 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007424 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007425 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007426 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007427 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007428
7429 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007430 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007431 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007432 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007433 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007434 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007435 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007436 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007437 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007438 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007439 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007440 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007441 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007442 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007443 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007444
Akira Hatanakabef17452011-09-20 19:21:49 +00007445 case llvm::Triple::mips64:
7446 switch (os) {
7447 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007448 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007449 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007450 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007451 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007452 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007453 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007454 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007455 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007456 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007457 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007458 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007459 }
7460
7461 case llvm::Triple::mips64el:
7462 switch (os) {
7463 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007464 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007465 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007466 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007467 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007468 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007469 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007470 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007471 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007472 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007473 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007474 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007475 }
7476
Ivan Krasindd7403e2011-08-24 20:22:22 +00007477 case llvm::Triple::le32:
7478 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007479 case llvm::Triple::NaCl:
7480 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7481 default:
7482 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007483 }
7484
JF Bastien643817d2014-09-12 17:52:47 +00007485 case llvm::Triple::le64:
7486 return new Le64TargetInfo(Triple);
7487
Daniel Dunbar52322032009-08-18 05:47:58 +00007488 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007489 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007490 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007491 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007492 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007493 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007494 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007495 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007496 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007497 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007498 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007499 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007500 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007501 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007502 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007503 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007504 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007505
7506 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007507 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007508 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007509 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007510 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007511 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007512 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007513 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007514 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007515 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007516 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007517 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007518 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007519 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007520 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007521
Bill Schmidt778d3872013-07-26 01:36:11 +00007522 case llvm::Triple::ppc64le:
7523 switch (os) {
7524 case llvm::Triple::Linux:
7525 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007526 case llvm::Triple::NetBSD:
7527 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007528 default:
7529 return new PPC64TargetInfo(Triple);
7530 }
7531
Peter Collingbournec947aae2012-05-20 23:28:41 +00007532 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007533 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007534 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007535 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007536
Tom Stellardd8e38a32015-01-06 20:34:47 +00007537 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007538 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007539 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007540
Daniel Dunbar52322032009-08-18 05:47:58 +00007541 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007542 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007543 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007544 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007545 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007546 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007547 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007548 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007549 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007550 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007551 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007552 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007553 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007554 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007555 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007556
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007557 // The 'sparcel' architecture copies all the above cases except for Solaris.
7558 case llvm::Triple::sparcel:
7559 switch (os) {
7560 case llvm::Triple::Linux:
7561 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7562 case llvm::Triple::NetBSD:
7563 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7564 case llvm::Triple::OpenBSD:
7565 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7566 case llvm::Triple::RTEMS:
7567 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7568 default:
7569 return new SparcV8elTargetInfo(Triple);
7570 }
7571
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007572 case llvm::Triple::sparcv9:
7573 switch (os) {
7574 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007575 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007576 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007577 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007578 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007579 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007580 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007581 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007582 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007583 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007584 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007585 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007586 }
7587
Ulrich Weigand47445072013-05-06 16:26:41 +00007588 case llvm::Triple::systemz:
7589 switch (os) {
7590 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007591 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007592 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007593 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007594 }
7595
Eli Friedmana9c3d712009-08-19 20:47:07 +00007596 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007597 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007598
Daniel Dunbar52322032009-08-18 05:47:58 +00007599 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007600 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007601 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007602
Daniel Dunbar52322032009-08-18 05:47:58 +00007603 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007604 case llvm::Triple::CloudABI:
7605 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007606 case llvm::Triple::Linux: {
7607 switch (Triple.getEnvironment()) {
7608 default:
7609 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7610 case llvm::Triple::Android:
7611 return new AndroidX86_32TargetInfo(Triple);
7612 }
7613 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007614 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007615 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007616 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007617 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007618 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007619 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007620 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007621 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007622 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007623 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007624 case llvm::Triple::KFreeBSD:
7625 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007626 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007627 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007628 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007629 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007630 case llvm::Triple::Win32: {
7631 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007632 case llvm::Triple::Cygnus:
7633 return new CygwinX86_32TargetInfo(Triple);
7634 case llvm::Triple::GNU:
7635 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007636 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007637 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007638 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007639 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007640 }
7641 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007642 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007643 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007644 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007645 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007646 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007647 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007648 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007649 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007650 }
7651
7652 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007653 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007654 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007655
Daniel Dunbar52322032009-08-18 05:47:58 +00007656 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007657 case llvm::Triple::CloudABI:
7658 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007659 case llvm::Triple::Linux: {
7660 switch (Triple.getEnvironment()) {
7661 default:
7662 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7663 case llvm::Triple::Android:
7664 return new AndroidX86_64TargetInfo(Triple);
7665 }
7666 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007667 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007668 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007669 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007670 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007671 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007672 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007673 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007674 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007675 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007676 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007677 case llvm::Triple::KFreeBSD:
7678 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007679 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007680 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007681 case llvm::Triple::Win32: {
7682 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007683 case llvm::Triple::Cygnus:
7684 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007685 case llvm::Triple::GNU:
7686 return new MinGWX86_64TargetInfo(Triple);
7687 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007688 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007689 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007690 }
7691 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007692 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007693 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007694 case llvm::Triple::PS4:
7695 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007696 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007697 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007698 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007699
Douglas Katzman78d7c542015-05-12 21:18:10 +00007700 case llvm::Triple::spir: {
7701 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7702 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7703 return nullptr;
7704 return new SPIR32TargetInfo(Triple);
7705 }
7706 case llvm::Triple::spir64: {
7707 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7708 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7709 return nullptr;
7710 return new SPIR64TargetInfo(Triple);
7711 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007712 case llvm::Triple::wasm32:
7713 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7714 return nullptr;
7715 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7716 case llvm::Triple::wasm64:
7717 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7718 return nullptr;
7719 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007720 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007721}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007722
7723/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007724/// options.
Alp Toker80758082014-07-06 05:26:44 +00007725TargetInfo *
7726TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7727 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007728 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007729
7730 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007731 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007732 if (!Target) {
7733 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007734 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007735 }
Alp Toker80758082014-07-06 05:26:44 +00007736 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007737
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007738 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007739 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7740 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007741 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007742 }
7743
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007744 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007745 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7746 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007747 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007748 }
7749
Rafael Espindolaeb265472013-08-21 21:59:03 +00007750 // Set the fp math unit.
7751 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7752 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007753 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007754 }
7755
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007756 // Compute the default target features, we need the target to handle this
7757 // because features may have dependencies on one another.
7758 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00007759 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
7760 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00007761 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007762
7763 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007764 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007765 for (const auto &F : Features)
7766 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7767
Eric Christopher3ff21b32013-10-16 21:26:26 +00007768 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007769 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007770
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007771 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007772}