blob: 8081a69ec25e9f9e66551f8b6c3f450cc4d99bca [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000030#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000032#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000033
Chris Lattner5ba61f02006-10-14 07:39:34 +000034using namespace clang;
35
Chris Lattner5ba61f02006-10-14 07:39:34 +000036//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000037// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000038//===----------------------------------------------------------------------===//
39
Chris Lattner1e1c0b92009-03-20 16:06:38 +000040/// DefineStd - Define a macro name and standard variants. For example if
41/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
42/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000043static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000044 const LangOptions &Opts) {
45 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000046
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
48 // in the user's namespace.
49 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000050 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000051
Chris Lattner1e1c0b92009-03-20 16:06:38 +000052 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000057}
58
Benjamin Kramere3b442d2012-01-10 11:50:09 +000059static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
60 bool Tuning = true) {
61 Builder.defineMacro("__" + CPUName);
62 Builder.defineMacro("__" + CPUName + "__");
63 if (Tuning)
64 Builder.defineMacro("__tune_" + CPUName + "__");
65}
66
Chris Lattner09d98f52008-10-05 21:50:58 +000067//===----------------------------------------------------------------------===//
68// Defines specific to certain operating systems.
69//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000070
Torok Edwinb2b37c62009-06-30 17:10:35 +000071namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000072template<typename TgtInfo>
73class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000074protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000075 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000076 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000077public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000078 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000079 void getTargetDefines(const LangOptions &Opts,
80 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000081 TgtInfo::getTargetDefines(Opts, Builder);
82 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000083 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000084
85};
Chris Lattner30ba6742009-08-10 19:03:04 +000086
Eric Christopher7d0c7252015-09-24 21:17:04 +000087// CloudABI Target
88template <typename Target>
89class CloudABITargetInfo : public OSTargetInfo<Target> {
90protected:
91 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
92 MacroBuilder &Builder) const override {
93 Builder.defineMacro("__CloudABI__");
94 Builder.defineMacro("__ELF__");
95
96 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
97 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
98 Builder.defineMacro("__STDC_UTF_16__");
99 Builder.defineMacro("__STDC_UTF_32__");
100 }
101
102public:
103 CloudABITargetInfo(const llvm::Triple &Triple)
104 : OSTargetInfo<Target>(Triple) {
105 this->UserLabelPrefix = "";
106 }
107};
108
Daniel Dunbard86666f2010-01-26 01:44:04 +0000109static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000110 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000111 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000112 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000113 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000114 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000115 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000116 // AddressSanitizer doesn't play well with source fortification, which is on
117 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000118 if (Opts.Sanitize.has(SanitizerKind::Address))
119 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000120
John McCall5d36a8c2011-06-16 00:03:19 +0000121 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000122 // __weak is always defined, for use in blocks and with objc pointers.
123 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000124
John McCall31168b02011-06-15 23:02:42 +0000125 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000126 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000127 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
128 else
129 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000130
John McCall31168b02011-06-15 23:02:42 +0000131 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
132 // allow this in C, since one might have block pointers in structs that
133 // are used in pure C code and in Objective-C ARC.
134 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000135 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000136
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000137 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000138 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000139 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000141
142 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000143 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000144
Daniel Dunbarecf13562011-04-19 21:40:34 +0000145 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000146 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000147 if (Triple.isMacOSX()) {
148 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000149 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000151 Triple.getOSVersion(Maj, Min, Rev);
152 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000153 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000154
Sebastian Pop422377c2012-01-20 22:01:23 +0000155 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000156 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000157 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
158 if (PlatformName == "win32") {
159 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
160 return;
161 }
162
Evan Cheng31dd9a62014-01-26 23:12:43 +0000163 // Set the appropriate OS version define.
164 if (Triple.isiOS()) {
165 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
166 char Str[6];
167 Str[0] = '0' + Maj;
168 Str[1] = '0' + (Min / 10);
169 Str[2] = '0' + (Min % 10);
170 Str[3] = '0' + (Rev / 10);
171 Str[4] = '0' + (Rev % 10);
172 Str[5] = '\0';
Eric Christopher7d0c7252015-09-24 21:17:04 +0000173 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000174 } else if (Triple.isMacOSX()) {
175 // Note that the Driver allows versions which aren't representable in the
176 // define (because we only get a single digit for the minor and micro
177 // revision numbers). So, we limit them to the maximum representable
178 // version.
179 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000180 char Str[7];
181 if (Maj < 10 || (Maj == 10 && Min < 10)) {
182 Str[0] = '0' + (Maj / 10);
183 Str[1] = '0' + (Maj % 10);
184 Str[2] = '0' + std::min(Min, 9U);
185 Str[3] = '0' + std::min(Rev, 9U);
186 Str[4] = '\0';
187 } else {
188 // Handle versions > 10.9.
189 Str[0] = '0' + (Maj / 10);
190 Str[1] = '0' + (Maj % 10);
191 Str[2] = '0' + (Min / 10);
192 Str[3] = '0' + (Min % 10);
193 Str[4] = '0' + (Rev / 10);
194 Str[5] = '0' + (Rev % 10);
195 Str[6] = '\0';
196 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000198 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000199
Tim Northover157d9112014-01-16 08:48:16 +0000200 // Tell users about the kernel if there is one.
201 if (Triple.isOSDarwin())
202 Builder.defineMacro("__MACH__");
203
Daniel Dunbarecf13562011-04-19 21:40:34 +0000204 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000205}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000206
Torok Edwinb2b37c62009-06-30 17:10:35 +0000207template<typename Target>
208class DarwinTargetInfo : public OSTargetInfo<Target> {
209protected:
Craig Topper3164f332014-03-11 03:39:26 +0000210 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
211 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000212 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000213 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000214 }
Mike Stump11289f42009-09-09 15:08:12 +0000215
Torok Edwinb2b37c62009-06-30 17:10:35 +0000216public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000217 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
218 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
219 this->MCountName = "\01mcount";
220 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000221
Craig Topper3164f332014-03-11 03:39:26 +0000222 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000223 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000224 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000225 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000226 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000227 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000228 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000229 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000230
Craig Topper3164f332014-03-11 03:39:26 +0000231 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000232 // FIXME: We should return 0 when building kexts.
233 return "__TEXT,__StaticInit,regular,pure_instructions";
234 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000235
John McCalleed64c72012-01-29 01:20:30 +0000236 /// Darwin does not support protected visibility. Darwin's "default"
237 /// is very similar to ELF's "protected"; Darwin requires a "weak"
238 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000239 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000240 return false;
241 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000242};
243
Chris Lattner30ba6742009-08-10 19:03:04 +0000244
Torok Edwinb2b37c62009-06-30 17:10:35 +0000245// DragonFlyBSD Target
246template<typename Target>
247class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
248protected:
Craig Topper3164f332014-03-11 03:39:26 +0000249 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
250 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000251 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000252 Builder.defineMacro("__DragonFly__");
253 Builder.defineMacro("__DragonFly_cc_version", "100001");
254 Builder.defineMacro("__ELF__");
255 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
256 Builder.defineMacro("__tune_i386__");
257 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000258 }
259public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000260 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
261 : OSTargetInfo<Target>(Triple) {
262 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 switch (Triple.getArch()) {
265 default:
266 case llvm::Triple::x86:
267 case llvm::Triple::x86_64:
268 this->MCountName = ".mcount";
269 break;
270 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000271 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000272};
273
274// FreeBSD Target
275template<typename Target>
276class FreeBSDTargetInfo : public OSTargetInfo<Target> {
277protected:
Craig Topper3164f332014-03-11 03:39:26 +0000278 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
279 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000280 // FreeBSD defines; list based off of gcc output
281
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000282 unsigned Release = Triple.getOSMajorVersion();
283 if (Release == 0U)
284 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000285
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000286 Builder.defineMacro("__FreeBSD__", Twine(Release));
287 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000288 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
289 DefineStd(Builder, "unix", Opts);
290 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000291
292 // On FreeBSD, wchar_t contains the number of the code point as
293 // used by the character set of the locale. These character sets are
294 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000295 //
296 // FIXME: This is wrong; the macro refers to the numerical values
297 // of wchar_t *literals*, which are not locale-dependent. However,
298 // FreeBSD systems apparently depend on us getting this wrong, and
299 // setting this to 1 is conforming even if all the basic source
300 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000301 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000302 }
303public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000304 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
305 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000306
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000307 switch (Triple.getArch()) {
308 default:
309 case llvm::Triple::x86:
310 case llvm::Triple::x86_64:
311 this->MCountName = ".mcount";
312 break;
313 case llvm::Triple::mips:
314 case llvm::Triple::mipsel:
315 case llvm::Triple::ppc:
316 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000317 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000318 this->MCountName = "_mcount";
319 break;
320 case llvm::Triple::arm:
321 this->MCountName = "__mcount";
322 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000323 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000324 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000325};
326
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000327// GNU/kFreeBSD Target
328template<typename Target>
329class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
330protected:
Craig Topper3164f332014-03-11 03:39:26 +0000331 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
332 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000333 // GNU/kFreeBSD defines; list based off of gcc output
334
335 DefineStd(Builder, "unix", Opts);
336 Builder.defineMacro("__FreeBSD_kernel__");
337 Builder.defineMacro("__GLIBC__");
338 Builder.defineMacro("__ELF__");
339 if (Opts.POSIXThreads)
340 Builder.defineMacro("_REENTRANT");
341 if (Opts.CPlusPlus)
342 Builder.defineMacro("_GNU_SOURCE");
343 }
344public:
Eric Christopher917e9522014-11-18 22:36:15 +0000345 KFreeBSDTargetInfo(const llvm::Triple &Triple)
346 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000347 this->UserLabelPrefix = "";
348 }
349};
350
Chris Lattner3e2ee142010-07-07 16:01:42 +0000351// Minix Target
352template<typename Target>
353class MinixTargetInfo : public OSTargetInfo<Target> {
354protected:
Craig Topper3164f332014-03-11 03:39:26 +0000355 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
356 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000357 // Minix defines
358
359 Builder.defineMacro("__minix", "3");
360 Builder.defineMacro("_EM_WSIZE", "4");
361 Builder.defineMacro("_EM_PSIZE", "4");
362 Builder.defineMacro("_EM_SSIZE", "2");
363 Builder.defineMacro("_EM_LSIZE", "4");
364 Builder.defineMacro("_EM_FSIZE", "4");
365 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000366 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000367 DefineStd(Builder, "unix", Opts);
368 }
369public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000370 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
371 this->UserLabelPrefix = "";
372 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000373};
374
Torok Edwinb2b37c62009-06-30 17:10:35 +0000375// Linux target
376template<typename Target>
377class LinuxTargetInfo : public OSTargetInfo<Target> {
378protected:
Craig Topper3164f332014-03-11 03:39:26 +0000379 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
380 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000382 DefineStd(Builder, "unix", Opts);
383 DefineStd(Builder, "linux", Opts);
384 Builder.defineMacro("__gnu_linux__");
385 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000386 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000387 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000388 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000389 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000390 this->PlatformName = "android";
391 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
392 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000393 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000394 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000395 if (Opts.CPlusPlus)
396 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000397 }
398public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000399 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000400 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000401 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000402
403 switch (Triple.getArch()) {
404 default:
405 break;
406 case llvm::Triple::ppc:
407 case llvm::Triple::ppc64:
408 case llvm::Triple::ppc64le:
409 this->MCountName = "_mcount";
410 break;
411 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000412 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000413
Craig Topper3164f332014-03-11 03:39:26 +0000414 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000415 return ".text.startup";
416 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000417};
418
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000419// NetBSD Target
420template<typename Target>
421class NetBSDTargetInfo : public OSTargetInfo<Target> {
422protected:
Craig Topper3164f332014-03-11 03:39:26 +0000423 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
424 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000425 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000426 Builder.defineMacro("__NetBSD__");
427 Builder.defineMacro("__unix__");
428 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000429 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000430 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000431
432 switch (Triple.getArch()) {
433 default:
434 break;
435 case llvm::Triple::arm:
436 case llvm::Triple::armeb:
437 case llvm::Triple::thumb:
438 case llvm::Triple::thumbeb:
439 Builder.defineMacro("__ARM_DWARF_EH__");
440 break;
441 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000442 }
443public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000444 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
445 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000446 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000447 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000448};
449
Torok Edwinb2b37c62009-06-30 17:10:35 +0000450// OpenBSD Target
451template<typename Target>
452class OpenBSDTargetInfo : public OSTargetInfo<Target> {
453protected:
Craig Topper3164f332014-03-11 03:39:26 +0000454 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
455 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000456 // OpenBSD defines; list based off of gcc output
457
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 Builder.defineMacro("__OpenBSD__");
459 DefineStd(Builder, "unix", Opts);
460 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000461 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000462 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000463 }
464public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000465 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
466 this->UserLabelPrefix = "";
467 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000468
Eli Friedman3715d1f2011-12-15 02:15:56 +0000469 switch (Triple.getArch()) {
470 default:
471 case llvm::Triple::x86:
472 case llvm::Triple::x86_64:
473 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000474 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000475 this->MCountName = "__mcount";
476 break;
477 case llvm::Triple::mips64:
478 case llvm::Triple::mips64el:
479 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000480 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000481 this->MCountName = "_mcount";
482 break;
483 }
484 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000485};
486
Eli Friedman9fa28852012-08-08 23:57:20 +0000487// Bitrig Target
488template<typename Target>
489class BitrigTargetInfo : public OSTargetInfo<Target> {
490protected:
Craig Topper3164f332014-03-11 03:39:26 +0000491 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
492 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000493 // Bitrig defines; list based off of gcc output
494
495 Builder.defineMacro("__Bitrig__");
496 DefineStd(Builder, "unix", Opts);
497 Builder.defineMacro("__ELF__");
498 if (Opts.POSIXThreads)
499 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000500
501 switch (Triple.getArch()) {
502 default:
503 break;
504 case llvm::Triple::arm:
505 case llvm::Triple::armeb:
506 case llvm::Triple::thumb:
507 case llvm::Triple::thumbeb:
508 Builder.defineMacro("__ARM_DWARF_EH__");
509 break;
510 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000511 }
512public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000513 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
514 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000515 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000516 }
517};
518
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000519// PSP Target
520template<typename Target>
521class PSPTargetInfo : public OSTargetInfo<Target> {
522protected:
Craig Topper3164f332014-03-11 03:39:26 +0000523 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
524 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000525 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000526 Builder.defineMacro("PSP");
527 Builder.defineMacro("_PSP");
528 Builder.defineMacro("__psp__");
529 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000530 }
531public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000532 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000533 this->UserLabelPrefix = "";
534 }
535};
536
John Thompsone467e192009-11-19 17:18:50 +0000537// PS3 PPU Target
538template<typename Target>
539class PS3PPUTargetInfo : public OSTargetInfo<Target> {
540protected:
Craig Topper3164f332014-03-11 03:39:26 +0000541 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
542 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000543 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000544 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000545 Builder.defineMacro("__PPU__");
546 Builder.defineMacro("__CELLOS_LV2__");
547 Builder.defineMacro("__ELF__");
548 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000549 Builder.defineMacro("_ARCH_PPC64");
550 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000551 }
552public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000553 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000554 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000555 this->LongWidth = this->LongAlign = 32;
556 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000557 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000558 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000559 this->SizeType = TargetInfo::UnsignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +0000560 this->DataLayoutString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000561 }
562};
563
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000564template <typename Target>
565class PS4OSTargetInfo : public OSTargetInfo<Target> {
566protected:
567 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
568 MacroBuilder &Builder) const override {
569 Builder.defineMacro("__FreeBSD__", "9");
570 Builder.defineMacro("__FreeBSD_cc_version", "900001");
571 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
572 DefineStd(Builder, "unix", Opts);
573 Builder.defineMacro("__ELF__");
574 Builder.defineMacro("__PS4__");
575 }
576public:
577 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
578 this->WCharType = this->UnsignedShort;
579
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000580 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
581 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000582 this->UserLabelPrefix = "";
583
584 switch (Triple.getArch()) {
585 default:
586 case llvm::Triple::x86_64:
587 this->MCountName = ".mcount";
588 break;
589 }
590 }
591};
592
Torok Edwinb2b37c62009-06-30 17:10:35 +0000593// Solaris target
594template<typename Target>
595class SolarisTargetInfo : public OSTargetInfo<Target> {
596protected:
Craig Topper3164f332014-03-11 03:39:26 +0000597 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
598 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000599 DefineStd(Builder, "sun", Opts);
600 DefineStd(Builder, "unix", Opts);
601 Builder.defineMacro("__ELF__");
602 Builder.defineMacro("__svr4__");
603 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000604 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
605 // newer, but to 500 for everything else. feature_test.h has a check to
606 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000607 // with a new version.
608 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000609 Builder.defineMacro("_XOPEN_SOURCE", "600");
610 else
611 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000612 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000613 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000614 Builder.defineMacro("_LARGEFILE_SOURCE");
615 Builder.defineMacro("_LARGEFILE64_SOURCE");
616 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000617 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000618 }
619public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000620 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000621 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000622 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000623 // FIXME: WIntType should be SignedLong
624 }
625};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000626
627// Windows target
628template<typename Target>
629class WindowsTargetInfo : public OSTargetInfo<Target> {
630protected:
Craig Topper3164f332014-03-11 03:39:26 +0000631 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
632 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000633 Builder.defineMacro("_WIN32");
634 }
635 void getVisualStudioDefines(const LangOptions &Opts,
636 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000637 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000638 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000639 Builder.defineMacro("_CPPRTTI");
640
Reid Kleckner16514352015-01-30 21:42:55 +0000641 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000642 Builder.defineMacro("_CPPUNWIND");
643 }
644
David Majnemer6a658902015-07-22 22:36:26 +0000645 if (Opts.Bool)
646 Builder.defineMacro("__BOOL_DEFINED");
647
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000648 if (!Opts.CharIsSigned)
649 Builder.defineMacro("_CHAR_UNSIGNED");
650
651 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
652 // but it works for now.
653 if (Opts.POSIXThreads)
654 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000655
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000656 if (Opts.MSCompatibilityVersion) {
657 Builder.defineMacro("_MSC_VER",
658 Twine(Opts.MSCompatibilityVersion / 100000));
659 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000660 // FIXME We cannot encode the revision information into 32-bits
661 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000662
David Majnemerb710a932015-05-11 03:57:49 +0000663 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000664 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000665 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000666
667 if (Opts.MicrosoftExt) {
668 Builder.defineMacro("_MSC_EXTENSIONS");
669
670 if (Opts.CPlusPlus11) {
671 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
672 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
673 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
674 }
675 }
676
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000677 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000678 }
679
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000680public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000681 WindowsTargetInfo(const llvm::Triple &Triple)
682 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000683};
684
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000685template <typename Target>
686class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000687protected:
Craig Topper3164f332014-03-11 03:39:26 +0000688 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
689 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000690 if (Opts.POSIXThreads)
691 Builder.defineMacro("_REENTRANT");
692 if (Opts.CPlusPlus)
693 Builder.defineMacro("_GNU_SOURCE");
694
695 DefineStd(Builder, "unix", Opts);
696 Builder.defineMacro("__ELF__");
697 Builder.defineMacro("__native_client__");
698 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000699
700public:
701 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000702 this->UserLabelPrefix = "";
703 this->LongAlign = 32;
704 this->LongWidth = 32;
705 this->PointerAlign = 32;
706 this->PointerWidth = 32;
707 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000708 this->Int64Type = TargetInfo::SignedLongLong;
709 this->DoubleAlign = 64;
710 this->LongDoubleWidth = 64;
711 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000712 this->LongLongWidth = 64;
713 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000714 this->SizeType = TargetInfo::UnsignedInt;
715 this->PtrDiffType = TargetInfo::SignedInt;
716 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000717 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000718 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000719 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000720 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000721 } else if (Triple.getArch() == llvm::Triple::x86) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000722 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000723 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000724 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000725 } else if (Triple.getArch() == llvm::Triple::mipsel) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000726 // Handled on mips' setDataLayoutString.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000727 } else {
728 assert(Triple.getArch() == llvm::Triple::le32);
Eric Christopher964a5f32015-08-05 23:48:05 +0000729 this->DataLayoutString = "e-p:32:32-i64:64";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000730 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000731 }
732};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000733
Dan Gohmanc2853072015-09-03 22:51:53 +0000734// WebAssembly target
735template <typename Target>
736class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
737 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000738 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000739 // A common platform macro.
740 if (Opts.POSIXThreads)
741 Builder.defineMacro("_REENTRANT");
742 // Follow g++ convention and predefine _GNU_SOURCE for C++.
743 if (Opts.CPlusPlus)
744 Builder.defineMacro("_GNU_SOURCE");
745 }
746
747 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000748 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000749 return ".text.__startup";
750 }
751
752public:
753 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
754 : OSTargetInfo<Target>(Triple) {
755 this->MCountName = "__mcount";
756 this->UserLabelPrefix = "";
757 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
758 }
759};
Dan Gohmanc2853072015-09-03 22:51:53 +0000760
Chris Lattner09d98f52008-10-05 21:50:58 +0000761//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000762// Specific target implementations.
763//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000764
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000765// PPC abstract base class
766class PPCTargetInfo : public TargetInfo {
767 static const Builtin::Info BuiltinInfo[];
768 static const char * const GCCRegNames[];
769 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000770 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000771
772 // Target cpu features.
773 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000774 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000775 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000776 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000777 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000778 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000779 bool HasBPERMD;
780 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000781
Ulrich Weigand8afad612014-07-28 13:17:52 +0000782protected:
783 std::string ABI;
784
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000785public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000786 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000787 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000788 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000789 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000790 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000791 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000792 LongDoubleWidth = LongDoubleAlign = 128;
793 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
794 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000795
Hal Finkel6b984f02012-07-03 16:51:04 +0000796 /// \brief Flags for architecture specific defines.
797 typedef enum {
798 ArchDefineNone = 0,
799 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
800 ArchDefinePpcgr = 1 << 1,
801 ArchDefinePpcsq = 1 << 2,
802 ArchDefine440 = 1 << 3,
803 ArchDefine603 = 1 << 4,
804 ArchDefine604 = 1 << 5,
805 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000806 ArchDefinePwr5 = 1 << 7,
807 ArchDefinePwr5x = 1 << 8,
808 ArchDefinePwr6 = 1 << 9,
809 ArchDefinePwr6x = 1 << 10,
810 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000811 ArchDefinePwr8 = 1 << 12,
812 ArchDefineA2 = 1 << 13,
813 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000814 } ArchDefineTypes;
815
Bill Schmidt38378a02013-02-01 20:23:10 +0000816 // Note: GCC recognizes the following additional cpus:
817 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
818 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
819 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000820 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000821 bool CPUKnown = llvm::StringSwitch<bool>(Name)
822 .Case("generic", true)
823 .Case("440", true)
824 .Case("450", true)
825 .Case("601", true)
826 .Case("602", true)
827 .Case("603", true)
828 .Case("603e", true)
829 .Case("603ev", true)
830 .Case("604", true)
831 .Case("604e", true)
832 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000833 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000834 .Case("g3", true)
835 .Case("7400", true)
836 .Case("g4", true)
837 .Case("7450", true)
838 .Case("g4+", true)
839 .Case("750", true)
840 .Case("970", true)
841 .Case("g5", true)
842 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000843 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000844 .Case("e500mc", true)
845 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000846 .Case("power3", true)
847 .Case("pwr3", true)
848 .Case("power4", true)
849 .Case("pwr4", true)
850 .Case("power5", true)
851 .Case("pwr5", true)
852 .Case("power5x", true)
853 .Case("pwr5x", true)
854 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000855 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000856 .Case("power6x", true)
857 .Case("pwr6x", true)
858 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000859 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000860 .Case("power8", true)
861 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000862 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000863 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000864 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000865 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000866 .Case("powerpc64le", true)
867 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000868 .Default(false);
869
870 if (CPUKnown)
871 CPU = Name;
872
873 return CPUKnown;
874 }
875
Ulrich Weigand8afad612014-07-28 13:17:52 +0000876
877 StringRef getABI() const override { return ABI; }
878
Craig Topper3164f332014-03-11 03:39:26 +0000879 void getTargetBuiltins(const Builtin::Info *&Records,
880 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000881 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000882 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000883 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000884
Craig Topper3164f332014-03-11 03:39:26 +0000885 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000886
Craig Topper3164f332014-03-11 03:39:26 +0000887 void getTargetDefines(const LangOptions &Opts,
888 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000889
Eric Christopher8c47b422015-10-09 18:39:55 +0000890 bool
891 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
892 StringRef CPU,
893 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000894
Craig Topper3164f332014-03-11 03:39:26 +0000895 bool handleTargetFeatures(std::vector<std::string> &Features,
896 DiagnosticsEngine &Diags) override;
897 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000898 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
899 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000900
901 void getGCCRegNames(const char * const *&Names,
902 unsigned &NumNames) const override;
903 void getGCCRegAliases(const GCCRegAlias *&Aliases,
904 unsigned &NumAliases) const override;
905 bool validateAsmConstraint(const char *&Name,
906 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000907 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000908 default: return false;
909 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000910 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000911 case 'b': // Base register
912 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000913 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000914 break;
915 // FIXME: The following are added to allow parsing.
916 // I just took a guess at what the actions should be.
917 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000918 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000919 case 'v': // Altivec vector register
920 Info.setAllowsRegister();
921 break;
922 case 'w':
923 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000924 case 'd':// VSX vector register to hold vector double data
925 case 'f':// VSX vector register to hold vector float data
926 case 's':// VSX vector register to hold scalar float data
927 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000928 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000929 break;
930 default:
931 return false;
932 }
933 Info.setAllowsRegister();
934 Name++; // Skip over 'w'.
935 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000936 case 'h': // `MQ', `CTR', or `LINK' register
937 case 'q': // `MQ' register
938 case 'c': // `CTR' register
939 case 'l': // `LINK' register
940 case 'x': // `CR' register (condition register) number 0
941 case 'y': // `CR' register (condition register)
942 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000943 Info.setAllowsRegister();
944 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000945 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000946 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000947 // (use `L' instead for SImode constants)
948 case 'K': // Unsigned 16-bit constant
949 case 'L': // Signed 16-bit constant shifted left 16 bits
950 case 'M': // Constant larger than 31
951 case 'N': // Exact power of 2
952 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000953 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000954 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000955 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000956 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000957 break;
958 case 'm': // Memory operand. Note that on PowerPC targets, m can
959 // include addresses that update the base register. It
960 // is therefore only safe to use `m' in an asm statement
961 // if that asm statement accesses the operand exactly once.
962 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000963 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000964 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000965 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000966 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000967 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
968 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000969 // register to be updated.
970 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000971 if (Name[1] != 's')
972 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000973 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000974 // include any automodification of the base register. Unlike
975 // `m', this constraint can be used in asm statements that
976 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000977 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000978 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000979 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000980 break;
981 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000982 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000983 case 'Z': // Memory operand that is an indexed or indirect from a
984 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000985 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000986 Info.setAllowsMemory();
987 Info.setAllowsRegister();
988 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000989 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000990 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000991 // register (`p' is preferable for asm statements)
992 case 'S': // Constant suitable as a 64-bit mask operand
993 case 'T': // Constant suitable as a 32-bit mask operand
994 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000995 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000996 // instructions
997 case 'W': // Vector constant that does not require memory
998 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000999 break;
1000 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001001 }
John Thompson07a61a42010-06-24 22:44:13 +00001002 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001003 }
Craig Topper3164f332014-03-11 03:39:26 +00001004 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001005 std::string R;
1006 switch (*Constraint) {
1007 case 'e':
1008 case 'w':
1009 // Two-character constraint; add "^" hint for later parsing.
1010 R = std::string("^") + std::string(Constraint, 2);
1011 Constraint++;
1012 break;
1013 default:
1014 return TargetInfo::convertConstraint(Constraint);
1015 }
1016 return R;
1017 }
Craig Topper3164f332014-03-11 03:39:26 +00001018 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001019 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001020 }
Craig Topper3164f332014-03-11 03:39:26 +00001021 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001022 if (RegNo == 0) return 3;
1023 if (RegNo == 1) return 4;
1024 return -1;
1025 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001026
1027 bool hasSjLjLowering() const override {
1028 return true;
1029 }
David Majnemer2617ea62015-06-09 18:05:33 +00001030
1031 bool useFloat128ManglingForLongDouble() const override {
1032 return LongDoubleWidth == 128 &&
1033 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1034 getTriple().isOSBinFormatELF();
1035 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001036};
Anders Carlssonf511f642007-11-27 04:11:28 +00001037
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001038const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001039#define BUILTIN(ID, TYPE, ATTRS) \
1040 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1041#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1042 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001043#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001044};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001045
Eric Christopher917e9522014-11-18 22:36:15 +00001046/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001047/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001048bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001049 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001050 for (const auto &Feature : Features) {
1051 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001052 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001053 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001054 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001055 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001056 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001057 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001058 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001059 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001060 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001061 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001062 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001063 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001064 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001065 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001066 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001067 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001068 // TODO: Finish this list and add an assert that we've handled them
1069 // all.
1070 }
Eric Christopher02c33352015-08-25 00:59:11 +00001071
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001072 return true;
1073}
1074
Chris Lattnerecd49032009-03-02 22:27:17 +00001075/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1076/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001077void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001078 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001079 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001080 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001081 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001082 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001083 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001084 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001085 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001086 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001087 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001088 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001089 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001090 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001091
Chris Lattnerecd49032009-03-02 22:27:17 +00001092 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001093 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1094 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001095 } else {
1096 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1097 getTriple().getOS() != llvm::Triple::OpenBSD)
1098 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001099 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001100
Ulrich Weigand8afad612014-07-28 13:17:52 +00001101 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001102 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001103 Builder.defineMacro("_CALL_ELF", "1");
1104 if (ABI == "elfv2")
1105 Builder.defineMacro("_CALL_ELF", "2");
1106
Chris Lattnerecd49032009-03-02 22:27:17 +00001107 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001108 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1109 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001110
Chris Lattnerecd49032009-03-02 22:27:17 +00001111 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001112 if (LongDoubleWidth == 128)
1113 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001114
John Thompsone467e192009-11-19 17:18:50 +00001115 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001116 Builder.defineMacro("__VEC__", "10206");
1117 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001118 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001119
1120 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001121 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1122 .Case("440", ArchDefineName)
1123 .Case("450", ArchDefineName | ArchDefine440)
1124 .Case("601", ArchDefineName)
1125 .Case("602", ArchDefineName | ArchDefinePpcgr)
1126 .Case("603", ArchDefineName | ArchDefinePpcgr)
1127 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1128 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1129 .Case("604", ArchDefineName | ArchDefinePpcgr)
1130 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1131 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001132 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001133 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1134 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1135 .Case("750", ArchDefineName | ArchDefinePpcgr)
1136 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1137 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001138 .Case("a2", ArchDefineA2)
1139 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001140 .Case("pwr3", ArchDefinePpcgr)
1141 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1142 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1143 | ArchDefinePpcsq)
1144 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1145 | ArchDefinePpcgr | ArchDefinePpcsq)
1146 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1147 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1148 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1149 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1150 | ArchDefinePpcsq)
1151 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1152 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001153 | ArchDefinePpcgr | ArchDefinePpcsq)
1154 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1155 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1156 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001157 .Case("power3", ArchDefinePpcgr)
1158 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1159 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1160 | ArchDefinePpcsq)
1161 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1162 | ArchDefinePpcgr | ArchDefinePpcsq)
1163 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1164 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1165 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1166 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1167 | ArchDefinePpcsq)
1168 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1169 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001170 | ArchDefinePpcgr | ArchDefinePpcsq)
1171 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1172 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1173 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001174 .Default(ArchDefineNone);
1175
1176 if (defs & ArchDefineName)
1177 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1178 if (defs & ArchDefinePpcgr)
1179 Builder.defineMacro("_ARCH_PPCGR");
1180 if (defs & ArchDefinePpcsq)
1181 Builder.defineMacro("_ARCH_PPCSQ");
1182 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001183 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001184 if (defs & ArchDefine603)
1185 Builder.defineMacro("_ARCH_603");
1186 if (defs & ArchDefine604)
1187 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001188 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001189 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001190 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001191 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001192 if (defs & ArchDefinePwr5x)
1193 Builder.defineMacro("_ARCH_PWR5X");
1194 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001195 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001196 if (defs & ArchDefinePwr6x)
1197 Builder.defineMacro("_ARCH_PWR6X");
1198 if (defs & ArchDefinePwr7)
1199 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001200 if (defs & ArchDefinePwr8)
1201 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001202 if (defs & ArchDefineA2)
1203 Builder.defineMacro("_ARCH_A2");
1204 if (defs & ArchDefineA2q) {
1205 Builder.defineMacro("_ARCH_A2Q");
1206 Builder.defineMacro("_ARCH_QP");
1207 }
1208
1209 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1210 Builder.defineMacro("__bg__");
1211 Builder.defineMacro("__THW_BLUEGENE__");
1212 Builder.defineMacro("__bgq__");
1213 Builder.defineMacro("__TOS_BGQ__");
1214 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001215
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001216 if (HasVSX)
1217 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001218 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001219 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001220 if (HasP8Crypto)
1221 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001222 if (HasHTM)
1223 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001224
1225 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1226 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1227 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1228 if (PointerWidth == 64)
1229 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001230
Bill Schmidt38378a02013-02-01 20:23:10 +00001231 // FIXME: The following are not yet generated here by Clang, but are
1232 // generated by GCC:
1233 //
1234 // _SOFT_FLOAT_
1235 // __RECIP_PRECISION__
1236 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001237 // __RECIP__
1238 // __RECIPF__
1239 // __RSQRTE__
1240 // __RSQRTEF__
1241 // _SOFT_DOUBLE_
1242 // __NO_LWSYNC__
1243 // __HAVE_BSWAP__
1244 // __LONGDOUBLE128
1245 // __CMODEL_MEDIUM__
1246 // __CMODEL_LARGE__
1247 // _CALL_SYSV
1248 // _CALL_DARWIN
1249 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001250}
1251
Eric Christophera8a14c32015-08-31 18:39:16 +00001252// Handle explicit options being passed to the compiler here: if we've
1253// explicitly turned off vsx and turned on power8-vector or direct-move then
1254// go ahead and error since the customer has expressed a somewhat incompatible
1255// set of options.
1256static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001257 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001258
1259 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1260 FeaturesVec.end()) {
1261 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1262 FeaturesVec.end()) {
1263 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1264 << "-mno-vsx";
1265 return false;
1266 }
1267
1268 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1269 FeaturesVec.end()) {
1270 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1271 << "-mno-vsx";
1272 return false;
1273 }
1274 }
1275
1276 return true;
1277}
1278
Eric Christopher8c47b422015-10-09 18:39:55 +00001279bool PPCTargetInfo::initFeatureMap(
1280 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1281 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001282 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1283 .Case("7400", true)
1284 .Case("g4", true)
1285 .Case("7450", true)
1286 .Case("g4+", true)
1287 .Case("970", true)
1288 .Case("g5", true)
1289 .Case("pwr6", true)
1290 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001291 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001292 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001293 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001294 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001295
1296 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001297 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1298 .Case("ppc64le", true)
1299 .Case("pwr8", true)
1300 .Default(false);
1301 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1302 .Case("ppc64le", true)
1303 .Case("pwr8", true)
1304 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001305 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1306 .Case("ppc64le", true)
1307 .Case("pwr8", true)
1308 .Case("pwr7", true)
1309 .Default(false);
1310 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1311 .Case("ppc64le", true)
1312 .Case("pwr8", true)
1313 .Case("pwr7", true)
1314 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001315 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1316 .Case("ppc64le", true)
1317 .Case("pwr8", true)
1318 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001319 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1320 .Case("ppc64le", true)
1321 .Case("pwr8", true)
1322 .Case("pwr7", true)
1323 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001324
Eric Christophera8a14c32015-08-31 18:39:16 +00001325 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1326 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001327
Eric Christopher007b0a02015-08-28 22:32:01 +00001328 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001329}
1330
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001331bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001332 return llvm::StringSwitch<bool>(Feature)
1333 .Case("powerpc", true)
1334 .Case("vsx", HasVSX)
1335 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001336 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001337 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001338 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001339 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001340 .Case("bpermd", HasBPERMD)
1341 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001342 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001343}
Chris Lattner17df24e2008-04-21 18:56:49 +00001344
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001345void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1346 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001347 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1348 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1349 // incompatible options.
1350 if (Enabled) {
1351 if (Name == "vsx") {
1352 Features[Name] = true;
1353 } else if (Name == "direct-move") {
1354 Features[Name] = Features["vsx"] = true;
1355 } else if (Name == "power8-vector") {
1356 Features[Name] = Features["vsx"] = true;
1357 } else {
1358 Features[Name] = true;
1359 }
1360 } else {
1361 if (Name == "vsx") {
1362 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1363 false;
1364 } else {
1365 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001366 }
1367 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001368}
1369
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001370const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001371 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1372 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1373 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1374 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1375 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1376 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1377 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1378 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001379 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001380 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001381 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001382 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1383 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1384 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1385 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001386 "vrsave", "vscr",
1387 "spe_acc", "spefscr",
1388 "sfp"
1389};
Chris Lattner10a5b382007-01-29 05:24:35 +00001390
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001391void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001392 unsigned &NumNames) const {
1393 Names = GCCRegNames;
1394 NumNames = llvm::array_lengthof(GCCRegNames);
1395}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001396
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001397const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1398 // While some of these aliases do map to different registers
1399 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001400 { { "0" }, "r0" },
1401 { { "1"}, "r1" },
1402 { { "2" }, "r2" },
1403 { { "3" }, "r3" },
1404 { { "4" }, "r4" },
1405 { { "5" }, "r5" },
1406 { { "6" }, "r6" },
1407 { { "7" }, "r7" },
1408 { { "8" }, "r8" },
1409 { { "9" }, "r9" },
1410 { { "10" }, "r10" },
1411 { { "11" }, "r11" },
1412 { { "12" }, "r12" },
1413 { { "13" }, "r13" },
1414 { { "14" }, "r14" },
1415 { { "15" }, "r15" },
1416 { { "16" }, "r16" },
1417 { { "17" }, "r17" },
1418 { { "18" }, "r18" },
1419 { { "19" }, "r19" },
1420 { { "20" }, "r20" },
1421 { { "21" }, "r21" },
1422 { { "22" }, "r22" },
1423 { { "23" }, "r23" },
1424 { { "24" }, "r24" },
1425 { { "25" }, "r25" },
1426 { { "26" }, "r26" },
1427 { { "27" }, "r27" },
1428 { { "28" }, "r28" },
1429 { { "29" }, "r29" },
1430 { { "30" }, "r30" },
1431 { { "31" }, "r31" },
1432 { { "fr0" }, "f0" },
1433 { { "fr1" }, "f1" },
1434 { { "fr2" }, "f2" },
1435 { { "fr3" }, "f3" },
1436 { { "fr4" }, "f4" },
1437 { { "fr5" }, "f5" },
1438 { { "fr6" }, "f6" },
1439 { { "fr7" }, "f7" },
1440 { { "fr8" }, "f8" },
1441 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001442 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001443 { { "fr11" }, "f11" },
1444 { { "fr12" }, "f12" },
1445 { { "fr13" }, "f13" },
1446 { { "fr14" }, "f14" },
1447 { { "fr15" }, "f15" },
1448 { { "fr16" }, "f16" },
1449 { { "fr17" }, "f17" },
1450 { { "fr18" }, "f18" },
1451 { { "fr19" }, "f19" },
1452 { { "fr20" }, "f20" },
1453 { { "fr21" }, "f21" },
1454 { { "fr22" }, "f22" },
1455 { { "fr23" }, "f23" },
1456 { { "fr24" }, "f24" },
1457 { { "fr25" }, "f25" },
1458 { { "fr26" }, "f26" },
1459 { { "fr27" }, "f27" },
1460 { { "fr28" }, "f28" },
1461 { { "fr29" }, "f29" },
1462 { { "fr30" }, "f30" },
1463 { { "fr31" }, "f31" },
1464 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001465};
1466
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001467void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001468 unsigned &NumAliases) const {
1469 Aliases = GCCRegAliases;
1470 NumAliases = llvm::array_lengthof(GCCRegAliases);
1471}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001472
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001473class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001474public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001475 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001476 DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001477
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001478 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001479 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001480 case llvm::Triple::FreeBSD:
1481 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001482 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001483 PtrDiffType = SignedInt;
1484 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001485 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001486 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001487 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001488 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001489
Roman Divacky3ffe7462012-03-13 19:20:17 +00001490 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1491 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001492 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001493 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001494
1495 // PPC32 supports atomics up to 4 bytes.
1496 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001497 }
1498
Craig Topper3164f332014-03-11 03:39:26 +00001499 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001500 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001501 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001502 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001503};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001504
Bill Schmidt778d3872013-07-26 01:36:11 +00001505// Note: ABI differences may eventually require us to have a separate
1506// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001507class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001508public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001509 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001510 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001511 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001512 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001513
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001514 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001515 DataLayoutString = "e-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001516 ABI = "elfv2";
1517 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001518 DataLayoutString = "E-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001519 ABI = "elfv1";
1520 }
1521
1522 switch (getTriple().getOS()) {
1523 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001524 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001525 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001526 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001527 case llvm::Triple::NetBSD:
1528 IntMaxType = SignedLongLong;
1529 Int64Type = SignedLongLong;
1530 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001531 default:
1532 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001533 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001534
1535 // PPC64 supports atomics up to 8 bytes.
1536 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001537 }
Craig Topper3164f332014-03-11 03:39:26 +00001538 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001539 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001540 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001541 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001542 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001543 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001544 ABI = Name;
1545 return true;
1546 }
1547 return false;
1548 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001549};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001550
Roman Divacky965b0b72011-01-06 08:27:10 +00001551class DarwinPPC32TargetInfo :
1552 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001553public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001554 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1555 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001556 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001557 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001558 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001559 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001560 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001561 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001562 }
Craig Topper3164f332014-03-11 03:39:26 +00001563 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001564 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001565 }
1566};
1567
1568class DarwinPPC64TargetInfo :
1569 public DarwinTargetInfo<PPC64TargetInfo> {
1570public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001571 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1572 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001573 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001574 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001575 DataLayoutString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001576 }
1577};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001578
Eric Christopherc48497a2015-09-18 21:26:24 +00001579static const unsigned NVPTXAddrSpaceMap[] = {
1580 1, // opencl_global
1581 3, // opencl_local
1582 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001583 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001584 0, // opencl_generic
1585 1, // cuda_device
1586 4, // cuda_constant
1587 3, // cuda_shared
1588};
1589
1590class NVPTXTargetInfo : public TargetInfo {
1591 static const char *const GCCRegNames[];
1592 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001593
1594 // The GPU profiles supported by the NVPTX backend
1595 enum GPUKind {
1596 GK_NONE,
1597 GK_SM20,
1598 GK_SM21,
1599 GK_SM30,
1600 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001601 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001602 } GPU;
1603
Eric Christopherc48497a2015-09-18 21:26:24 +00001604public:
1605 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1606 BigEndian = false;
1607 TLSSupported = false;
1608 LongWidth = LongAlign = 64;
1609 AddrSpaceMap = &NVPTXAddrSpaceMap;
1610 UseAddrSpaceMapMangling = true;
1611 // Define available target features
1612 // These must be defined in sorted order!
1613 NoAsmVariants = true;
1614 // Set the default GPU to sm20
1615 GPU = GK_SM20;
1616 }
1617 void getTargetDefines(const LangOptions &Opts,
1618 MacroBuilder &Builder) const override {
1619 Builder.defineMacro("__PTX__");
1620 Builder.defineMacro("__NVPTX__");
1621 if (Opts.CUDAIsDevice) {
1622 // Set __CUDA_ARCH__ for the GPU specified.
1623 std::string CUDAArchCode;
1624 switch (GPU) {
1625 case GK_SM20:
1626 CUDAArchCode = "200";
1627 break;
1628 case GK_SM21:
1629 CUDAArchCode = "210";
1630 break;
1631 case GK_SM30:
1632 CUDAArchCode = "300";
1633 break;
1634 case GK_SM35:
1635 CUDAArchCode = "350";
1636 break;
1637 case GK_SM37:
1638 CUDAArchCode = "370";
1639 break;
1640 default:
1641 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001642 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001643 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001644 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001645 }
1646 void getTargetBuiltins(const Builtin::Info *&Records,
1647 unsigned &NumRecords) const override {
1648 Records = BuiltinInfo;
1649 NumRecords = clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin;
1650 }
1651 bool hasFeature(StringRef Feature) const override {
1652 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001653 }
1654
Eric Christopherc48497a2015-09-18 21:26:24 +00001655 void getGCCRegNames(const char *const *&Names,
1656 unsigned &NumNames) const override;
1657 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1658 unsigned &NumAliases) const override {
1659 // No aliases.
1660 Aliases = nullptr;
1661 NumAliases = 0;
1662 }
1663 bool validateAsmConstraint(const char *&Name,
1664 TargetInfo::ConstraintInfo &Info) const override {
1665 switch (*Name) {
1666 default:
1667 return false;
1668 case 'c':
1669 case 'h':
1670 case 'r':
1671 case 'l':
1672 case 'f':
1673 case 'd':
1674 Info.setAllowsRegister();
1675 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001676 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001677 }
1678 const char *getClobbers() const override {
1679 // FIXME: Is this really right?
1680 return "";
1681 }
1682 BuiltinVaListKind getBuiltinVaListKind() const override {
1683 // FIXME: implement
1684 return TargetInfo::CharPtrBuiltinVaList;
1685 }
1686 bool setCPU(const std::string &Name) override {
1687 GPU = llvm::StringSwitch<GPUKind>(Name)
1688 .Case("sm_20", GK_SM20)
1689 .Case("sm_21", GK_SM21)
1690 .Case("sm_30", GK_SM30)
1691 .Case("sm_35", GK_SM35)
1692 .Case("sm_37", GK_SM37)
1693 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001694
Eric Christopherc48497a2015-09-18 21:26:24 +00001695 return GPU != GK_NONE;
1696 }
1697};
1698
1699const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1700#define BUILTIN(ID, TYPE, ATTRS) \
1701 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1702#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1703 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1704#include "clang/Basic/BuiltinsNVPTX.def"
1705};
1706
1707const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1708
1709void NVPTXTargetInfo::getGCCRegNames(const char *const *&Names,
1710 unsigned &NumNames) const {
1711 Names = GCCRegNames;
1712 NumNames = llvm::array_lengthof(GCCRegNames);
1713}
1714
1715class NVPTX32TargetInfo : public NVPTXTargetInfo {
1716public:
1717 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001718 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001719 PointerWidth = PointerAlign = 32;
1720 SizeType = TargetInfo::UnsignedInt;
1721 PtrDiffType = TargetInfo::SignedInt;
1722 IntPtrType = TargetInfo::SignedInt;
1723 DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
1724 }
1725};
1726
1727class NVPTX64TargetInfo : public NVPTXTargetInfo {
1728public:
1729 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1730 PointerWidth = PointerAlign = 64;
1731 SizeType = TargetInfo::UnsignedLong;
1732 PtrDiffType = TargetInfo::SignedLong;
1733 IntPtrType = TargetInfo::SignedLong;
1734 DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64";
1735 }
1736};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001737
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001738static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001739 1, // opencl_global
1740 3, // opencl_local
1741 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001742 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001743 1, // cuda_device
1744 2, // cuda_constant
1745 3 // cuda_shared
1746};
1747
Tom Stellarda96344b2014-08-21 13:58:40 +00001748// If you edit the description strings, make sure you update
1749// getPointerWidthV().
1750
Eric Christopher964a5f32015-08-05 23:48:05 +00001751static const char *DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001752 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1753 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001754
Eric Christopher964a5f32015-08-05 23:48:05 +00001755static const char *DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001756 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1757 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001758
Eric Christopher964a5f32015-08-05 23:48:05 +00001759static const char *DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001760 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001761 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1762 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001763
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001764class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001765 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001766 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001767
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001768 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001769 enum GPUKind {
1770 GK_NONE,
1771 GK_R600,
1772 GK_R600_DOUBLE_OPS,
1773 GK_R700,
1774 GK_R700_DOUBLE_OPS,
1775 GK_EVERGREEN,
1776 GK_EVERGREEN_DOUBLE_OPS,
1777 GK_NORTHERN_ISLANDS,
1778 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001779 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001780 GK_SEA_ISLANDS,
1781 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001782 } GPU;
1783
Jan Veselyeebeaea2015-05-04 19:53:36 +00001784 bool hasFP64:1;
1785 bool hasFMAF:1;
1786 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001787
Eli Friedmand13b41e2012-10-12 23:32:00 +00001788public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001789 AMDGPUTargetInfo(const llvm::Triple &Triple)
1790 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001791
1792 if (Triple.getArch() == llvm::Triple::amdgcn) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001793 DataLayoutString = DataLayoutStringSI;
Tom Stellardd99fb952015-01-28 15:38:44 +00001794 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001795 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001796 hasFMAF = true;
1797 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001798 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001799 DataLayoutString = DataLayoutStringR600;
Tom Stellardd99fb952015-01-28 15:38:44 +00001800 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001801 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001802 hasFMAF = false;
1803 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001804 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001805 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001806 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001807 }
1808
Tom Stellarda96344b2014-08-21 13:58:40 +00001809 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1810 if (GPU <= GK_CAYMAN)
1811 return 32;
1812
1813 switch(AddrSpace) {
1814 default:
1815 return 64;
1816 case 0:
1817 case 3:
1818 case 5:
1819 return 32;
1820 }
1821 }
1822
Craig Topper3164f332014-03-11 03:39:26 +00001823 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001824 return "";
1825 }
1826
Craig Topper3164f332014-03-11 03:39:26 +00001827 void getGCCRegNames(const char * const *&Names,
Tom Stellard7b1059b2015-04-14 14:36:56 +00001828 unsigned &NumNames) const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001829
Craig Topper3164f332014-03-11 03:39:26 +00001830 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1831 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001832 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001833 NumAliases = 0;
1834 }
1835
Craig Topper3164f332014-03-11 03:39:26 +00001836 bool validateAsmConstraint(const char *&Name,
1837 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001838 return true;
1839 }
1840
Craig Topper3164f332014-03-11 03:39:26 +00001841 void getTargetBuiltins(const Builtin::Info *&Records,
1842 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001843 Records = BuiltinInfo;
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001844 NumRecords = clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001845 }
1846
Craig Topper3164f332014-03-11 03:39:26 +00001847 void getTargetDefines(const LangOptions &Opts,
1848 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001849 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001850 if (hasFMAF)
1851 Builder.defineMacro("__HAS_FMAF__");
1852 if (hasLDEXPF)
1853 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001854 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001855 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001856 if (Opts.OpenCL) {
1857 if (GPU >= GK_NORTHERN_ISLANDS) {
1858 Builder.defineMacro("cl_khr_byte_addressable_store");
1859 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1860 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1861 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1862 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1863 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001864 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001865 }
1866
Craig Topper3164f332014-03-11 03:39:26 +00001867 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001868 return TargetInfo::CharPtrBuiltinVaList;
1869 }
1870
Craig Topper3164f332014-03-11 03:39:26 +00001871 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001872 GPU = llvm::StringSwitch<GPUKind>(Name)
1873 .Case("r600" , GK_R600)
1874 .Case("rv610", GK_R600)
1875 .Case("rv620", GK_R600)
1876 .Case("rv630", GK_R600)
1877 .Case("rv635", GK_R600)
1878 .Case("rs780", GK_R600)
1879 .Case("rs880", GK_R600)
1880 .Case("rv670", GK_R600_DOUBLE_OPS)
1881 .Case("rv710", GK_R700)
1882 .Case("rv730", GK_R700)
1883 .Case("rv740", GK_R700_DOUBLE_OPS)
1884 .Case("rv770", GK_R700_DOUBLE_OPS)
1885 .Case("palm", GK_EVERGREEN)
1886 .Case("cedar", GK_EVERGREEN)
1887 .Case("sumo", GK_EVERGREEN)
1888 .Case("sumo2", GK_EVERGREEN)
1889 .Case("redwood", GK_EVERGREEN)
1890 .Case("juniper", GK_EVERGREEN)
1891 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1892 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1893 .Case("barts", GK_NORTHERN_ISLANDS)
1894 .Case("turks", GK_NORTHERN_ISLANDS)
1895 .Case("caicos", GK_NORTHERN_ISLANDS)
1896 .Case("cayman", GK_CAYMAN)
1897 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001898 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001899 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1900 .Case("verde", GK_SOUTHERN_ISLANDS)
1901 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001902 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001903 .Case("bonaire", GK_SEA_ISLANDS)
1904 .Case("kabini", GK_SEA_ISLANDS)
1905 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001906 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001907 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001908 .Case("tonga", GK_VOLCANIC_ISLANDS)
1909 .Case("iceland", GK_VOLCANIC_ISLANDS)
1910 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001911 .Default(GK_NONE);
1912
1913 if (GPU == GK_NONE) {
1914 return false;
1915 }
1916
1917 // Set the correct data layout
1918 switch (GPU) {
1919 case GK_NONE:
1920 case GK_R600:
1921 case GK_R700:
1922 case GK_EVERGREEN:
1923 case GK_NORTHERN_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001924 DataLayoutString = DataLayoutStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001925 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001926 hasFMAF = false;
1927 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001928 break;
1929 case GK_R600_DOUBLE_OPS:
1930 case GK_R700_DOUBLE_OPS:
1931 case GK_EVERGREEN_DOUBLE_OPS:
1932 case GK_CAYMAN:
Eric Christopher964a5f32015-08-05 23:48:05 +00001933 DataLayoutString = DataLayoutStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001934 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001935 hasFMAF = true;
1936 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001937 break;
1938 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001939 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001940 case GK_VOLCANIC_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001941 DataLayoutString = DataLayoutStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001942 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001943 hasFMAF = true;
1944 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001945 break;
1946 }
1947
1948 return true;
1949 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001950};
1951
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001952const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001953#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001954 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001955#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001956};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001957const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001958 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1959 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1960 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1961 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1962 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1963 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1964 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1965 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1966 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1967 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1968 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1969 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1970 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1971 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1972 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1973 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1974 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1975 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1976 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1977 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1978 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1979 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1980 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1981 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1982 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1983 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1984 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1985 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1986 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1987 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1988 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1989 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1990 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1991 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1992 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1993 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1994 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1995 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1996 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1997 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1998 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1999 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2000 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2001 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2002 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2003 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2004 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
2005 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
2006 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
2007 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
2008};
2009
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002010void AMDGPUTargetInfo::getGCCRegNames(const char * const *&Names,
2011 unsigned &NumNames) const {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002012 Names = GCCRegNames;
2013 NumNames = llvm::array_lengthof(GCCRegNames);
2014}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002015
Eli Friedman3fd920a2008-08-20 02:34:37 +00002016// Namespace for x86 abstract base class
2017const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002018#define BUILTIN(ID, TYPE, ATTRS) \
2019 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002020#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002021 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002022#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002023 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002024#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002025};
Eli Friedmanb5366062008-05-20 14:21:01 +00002026
Nuno Lopescfca1f02009-12-23 17:49:57 +00002027static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002028 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2029 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002030 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002031 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2032 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2033 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002034 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002035 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2036 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002037};
2038
Eric Christophercdd36352011-06-21 00:05:20 +00002039const TargetInfo::AddlRegName AddlRegNames[] = {
2040 { { "al", "ah", "eax", "rax" }, 0 },
2041 { { "bl", "bh", "ebx", "rbx" }, 3 },
2042 { { "cl", "ch", "ecx", "rcx" }, 2 },
2043 { { "dl", "dh", "edx", "rdx" }, 1 },
2044 { { "esi", "rsi" }, 4 },
2045 { { "edi", "rdi" }, 5 },
2046 { { "esp", "rsp" }, 7 },
2047 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002048 { { "r8d", "r8w", "r8b" }, 38 },
2049 { { "r9d", "r9w", "r9b" }, 39 },
2050 { { "r10d", "r10w", "r10b" }, 40 },
2051 { { "r11d", "r11w", "r11b" }, 41 },
2052 { { "r12d", "r12w", "r12b" }, 42 },
2053 { { "r13d", "r13w", "r13b" }, 43 },
2054 { { "r14d", "r14w", "r14b" }, 44 },
2055 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002056};
2057
2058// X86 target abstract base class; x86-32 and x86-64 are very close, so
2059// most of the implementation can be shared.
2060class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002061 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002062 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002063 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002064 enum MMX3DNowEnum {
2065 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002066 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002067 enum XOPEnum {
2068 NoXOP,
2069 SSE4A,
2070 FMA4,
2071 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002072 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002073
Craig Topper543f3bd2015-10-14 23:47:57 +00002074 bool HasAES = false;
2075 bool HasPCLMUL = false;
2076 bool HasLZCNT = false;
2077 bool HasRDRND = false;
2078 bool HasFSGSBASE = false;
2079 bool HasBMI = false;
2080 bool HasBMI2 = false;
2081 bool HasPOPCNT = false;
2082 bool HasRTM = false;
2083 bool HasPRFCHW = false;
2084 bool HasRDSEED = false;
2085 bool HasADX = false;
2086 bool HasTBM = false;
2087 bool HasFMA = false;
2088 bool HasF16C = false;
2089 bool HasAVX512CD = false;
2090 bool HasAVX512ER = false;
2091 bool HasAVX512PF = false;
2092 bool HasAVX512DQ = false;
2093 bool HasAVX512BW = false;
2094 bool HasAVX512VL = false;
2095 bool HasSHA = false;
2096 bool HasCX16 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002097
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002098 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2099 ///
2100 /// Each enumeration represents a particular CPU supported by Clang. These
2101 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2102 enum CPUKind {
2103 CK_Generic,
2104
2105 /// \name i386
2106 /// i386-generation processors.
2107 //@{
2108 CK_i386,
2109 //@}
2110
2111 /// \name i486
2112 /// i486-generation processors.
2113 //@{
2114 CK_i486,
2115 CK_WinChipC6,
2116 CK_WinChip2,
2117 CK_C3,
2118 //@}
2119
2120 /// \name i586
2121 /// i586-generation processors, P5 microarchitecture based.
2122 //@{
2123 CK_i586,
2124 CK_Pentium,
2125 CK_PentiumMMX,
2126 //@}
2127
2128 /// \name i686
2129 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2130 //@{
2131 CK_i686,
2132 CK_PentiumPro,
2133 CK_Pentium2,
2134 CK_Pentium3,
2135 CK_Pentium3M,
2136 CK_PentiumM,
2137 CK_C3_2,
2138
2139 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2140 /// Clang however has some logic to suport this.
2141 // FIXME: Warn, deprecate, and potentially remove this.
2142 CK_Yonah,
2143 //@}
2144
2145 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002146 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002147 //@{
2148 CK_Pentium4,
2149 CK_Pentium4M,
2150 CK_Prescott,
2151 CK_Nocona,
2152 //@}
2153
2154 /// \name Core
2155 /// Core microarchitecture based processors.
2156 //@{
2157 CK_Core2,
2158
2159 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2160 /// codename which GCC no longer accepts as an option to -march, but Clang
2161 /// has some logic for recognizing it.
2162 // FIXME: Warn, deprecate, and potentially remove this.
2163 CK_Penryn,
2164 //@}
2165
2166 /// \name Atom
2167 /// Atom processors
2168 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002169 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002170 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002171 //@}
2172
2173 /// \name Nehalem
2174 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002175 CK_Nehalem,
2176
2177 /// \name Westmere
2178 /// Westmere microarchitecture based processors.
2179 CK_Westmere,
2180
2181 /// \name Sandy Bridge
2182 /// Sandy Bridge microarchitecture based processors.
2183 CK_SandyBridge,
2184
2185 /// \name Ivy Bridge
2186 /// Ivy Bridge microarchitecture based processors.
2187 CK_IvyBridge,
2188
2189 /// \name Haswell
2190 /// Haswell microarchitecture based processors.
2191 CK_Haswell,
2192
2193 /// \name Broadwell
2194 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002195 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002196
2197 /// \name Skylake
2198 /// Skylake microarchitecture based processors.
2199 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002200
Craig Topper449314e2013-08-20 07:09:39 +00002201 /// \name Knights Landing
2202 /// Knights Landing processor.
2203 CK_KNL,
2204
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002205 /// \name K6
2206 /// K6 architecture processors.
2207 //@{
2208 CK_K6,
2209 CK_K6_2,
2210 CK_K6_3,
2211 //@}
2212
2213 /// \name K7
2214 /// K7 architecture processors.
2215 //@{
2216 CK_Athlon,
2217 CK_AthlonThunderbird,
2218 CK_Athlon4,
2219 CK_AthlonXP,
2220 CK_AthlonMP,
2221 //@}
2222
2223 /// \name K8
2224 /// K8 architecture processors.
2225 //@{
2226 CK_Athlon64,
2227 CK_Athlon64SSE3,
2228 CK_AthlonFX,
2229 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002230 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002231 CK_Opteron,
2232 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002233 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002234 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002235
Benjamin Kramer569f2152012-01-10 11:50:18 +00002236 /// \name Bobcat
2237 /// Bobcat architecture processors.
2238 //@{
2239 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002240 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002241 //@}
2242
2243 /// \name Bulldozer
2244 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002245 //@{
2246 CK_BDVER1,
2247 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002248 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002249 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002250 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002251
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002252 /// This specification is deprecated and will be removed in the future.
2253 /// Users should prefer \see CK_K8.
2254 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002255 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002256 CK_x86_64,
2257 //@}
2258
2259 /// \name Geode
2260 /// Geode processors.
2261 //@{
2262 CK_Geode
2263 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002264 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002265
Eric Christopherc50738f2015-08-27 00:05:50 +00002266 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002267 return llvm::StringSwitch<CPUKind>(CPU)
2268 .Case("i386", CK_i386)
2269 .Case("i486", CK_i486)
2270 .Case("winchip-c6", CK_WinChipC6)
2271 .Case("winchip2", CK_WinChip2)
2272 .Case("c3", CK_C3)
2273 .Case("i586", CK_i586)
2274 .Case("pentium", CK_Pentium)
2275 .Case("pentium-mmx", CK_PentiumMMX)
2276 .Case("i686", CK_i686)
2277 .Case("pentiumpro", CK_PentiumPro)
2278 .Case("pentium2", CK_Pentium2)
2279 .Case("pentium3", CK_Pentium3)
2280 .Case("pentium3m", CK_Pentium3M)
2281 .Case("pentium-m", CK_PentiumM)
2282 .Case("c3-2", CK_C3_2)
2283 .Case("yonah", CK_Yonah)
2284 .Case("pentium4", CK_Pentium4)
2285 .Case("pentium4m", CK_Pentium4M)
2286 .Case("prescott", CK_Prescott)
2287 .Case("nocona", CK_Nocona)
2288 .Case("core2", CK_Core2)
2289 .Case("penryn", CK_Penryn)
2290 .Case("bonnell", CK_Bonnell)
2291 .Case("atom", CK_Bonnell) // Legacy name.
2292 .Case("silvermont", CK_Silvermont)
2293 .Case("slm", CK_Silvermont) // Legacy name.
2294 .Case("nehalem", CK_Nehalem)
2295 .Case("corei7", CK_Nehalem) // Legacy name.
2296 .Case("westmere", CK_Westmere)
2297 .Case("sandybridge", CK_SandyBridge)
2298 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2299 .Case("ivybridge", CK_IvyBridge)
2300 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2301 .Case("haswell", CK_Haswell)
2302 .Case("core-avx2", CK_Haswell) // Legacy name.
2303 .Case("broadwell", CK_Broadwell)
2304 .Case("skylake", CK_Skylake)
2305 .Case("skx", CK_Skylake) // Legacy name.
2306 .Case("knl", CK_KNL)
2307 .Case("k6", CK_K6)
2308 .Case("k6-2", CK_K6_2)
2309 .Case("k6-3", CK_K6_3)
2310 .Case("athlon", CK_Athlon)
2311 .Case("athlon-tbird", CK_AthlonThunderbird)
2312 .Case("athlon-4", CK_Athlon4)
2313 .Case("athlon-xp", CK_AthlonXP)
2314 .Case("athlon-mp", CK_AthlonMP)
2315 .Case("athlon64", CK_Athlon64)
2316 .Case("athlon64-sse3", CK_Athlon64SSE3)
2317 .Case("athlon-fx", CK_AthlonFX)
2318 .Case("k8", CK_K8)
2319 .Case("k8-sse3", CK_K8SSE3)
2320 .Case("opteron", CK_Opteron)
2321 .Case("opteron-sse3", CK_OpteronSSE3)
2322 .Case("barcelona", CK_AMDFAM10)
2323 .Case("amdfam10", CK_AMDFAM10)
2324 .Case("btver1", CK_BTVER1)
2325 .Case("btver2", CK_BTVER2)
2326 .Case("bdver1", CK_BDVER1)
2327 .Case("bdver2", CK_BDVER2)
2328 .Case("bdver3", CK_BDVER3)
2329 .Case("bdver4", CK_BDVER4)
2330 .Case("x86-64", CK_x86_64)
2331 .Case("geode", CK_Geode)
2332 .Default(CK_Generic);
2333 }
2334
Rafael Espindolaeb265472013-08-21 21:59:03 +00002335 enum FPMathKind {
2336 FP_Default,
2337 FP_SSE,
2338 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002339 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002340
Eli Friedman3fd920a2008-08-20 02:34:37 +00002341public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002342 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002343 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002344 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002345 }
Craig Topper3164f332014-03-11 03:39:26 +00002346 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002347 // X87 evaluates with 80 bits "long double" precision.
2348 return SSELevel == NoSSE ? 2 : 0;
2349 }
Craig Topper3164f332014-03-11 03:39:26 +00002350 void getTargetBuiltins(const Builtin::Info *&Records,
2351 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002352 Records = BuiltinInfo;
2353 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002354 }
Craig Topper3164f332014-03-11 03:39:26 +00002355 void getGCCRegNames(const char * const *&Names,
2356 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002357 Names = GCCRegNames;
2358 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002359 }
Craig Topper3164f332014-03-11 03:39:26 +00002360 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2361 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002362 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002363 NumAliases = 0;
2364 }
Craig Topper3164f332014-03-11 03:39:26 +00002365 void getGCCAddlRegNames(const AddlRegName *&Names,
2366 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002367 Names = AddlRegNames;
2368 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002369 }
Eric Christopherd9832702015-06-29 21:00:05 +00002370 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002371 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002372 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002373
Akira Hatanaka974131e2014-09-18 18:17:18 +00002374 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2375
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002376 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2377
Akira Hatanaka974131e2014-09-18 18:17:18 +00002378 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2379
Craig Topper3164f332014-03-11 03:39:26 +00002380 std::string convertConstraint(const char *&Constraint) const override;
2381 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002382 return "~{dirflag},~{fpsr},~{flags}";
2383 }
Craig Topper3164f332014-03-11 03:39:26 +00002384 void getTargetDefines(const LangOptions &Opts,
2385 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002386 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2387 bool Enabled);
2388 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2389 bool Enabled);
2390 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2391 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002392 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2393 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002394 setFeatureEnabledImpl(Features, Name, Enabled);
2395 }
2396 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002397 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002398 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2399 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002400 bool
2401 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2402 StringRef CPU,
2403 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002404 bool hasFeature(StringRef Feature) const override;
2405 bool handleTargetFeatures(std::vector<std::string> &Features,
2406 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002407 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002408 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2409 return "avx512";
2410 else if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002411 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002412 else if (getTriple().getArch() == llvm::Triple::x86 &&
2413 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002414 return "no-mmx";
2415 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002416 }
Craig Topper3164f332014-03-11 03:39:26 +00002417 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002418 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002419
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002420 // Perform any per-CPU checks necessary to determine if this CPU is
2421 // acceptable.
2422 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2423 // invalid without explaining *why*.
2424 switch (CPU) {
2425 case CK_Generic:
2426 // No processor selected!
2427 return false;
2428
2429 case CK_i386:
2430 case CK_i486:
2431 case CK_WinChipC6:
2432 case CK_WinChip2:
2433 case CK_C3:
2434 case CK_i586:
2435 case CK_Pentium:
2436 case CK_PentiumMMX:
2437 case CK_i686:
2438 case CK_PentiumPro:
2439 case CK_Pentium2:
2440 case CK_Pentium3:
2441 case CK_Pentium3M:
2442 case CK_PentiumM:
2443 case CK_Yonah:
2444 case CK_C3_2:
2445 case CK_Pentium4:
2446 case CK_Pentium4M:
2447 case CK_Prescott:
2448 case CK_K6:
2449 case CK_K6_2:
2450 case CK_K6_3:
2451 case CK_Athlon:
2452 case CK_AthlonThunderbird:
2453 case CK_Athlon4:
2454 case CK_AthlonXP:
2455 case CK_AthlonMP:
2456 case CK_Geode:
2457 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002458 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002459 return false;
2460
2461 // Fallthrough
2462 case CK_Nocona:
2463 case CK_Core2:
2464 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002465 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002466 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002467 case CK_Nehalem:
2468 case CK_Westmere:
2469 case CK_SandyBridge:
2470 case CK_IvyBridge:
2471 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002472 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002473 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002474 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002475 case CK_Athlon64:
2476 case CK_Athlon64SSE3:
2477 case CK_AthlonFX:
2478 case CK_K8:
2479 case CK_K8SSE3:
2480 case CK_Opteron:
2481 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002482 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002483 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002484 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002485 case CK_BDVER1:
2486 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002487 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002488 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002489 case CK_x86_64:
2490 return true;
2491 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002492 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002493 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002494
Craig Topper3164f332014-03-11 03:39:26 +00002495 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002496
Craig Topper3164f332014-03-11 03:39:26 +00002497 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002498 // We accept all non-ARM calling conventions
2499 return (CC == CC_X86ThisCall ||
2500 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002501 CC == CC_X86StdCall ||
2502 CC == CC_X86VectorCall ||
2503 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002504 CC == CC_X86Pascal ||
2505 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002506 }
2507
Craig Topper3164f332014-03-11 03:39:26 +00002508 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002509 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002510 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002511
2512 bool hasSjLjLowering() const override {
2513 return true;
2514 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002515};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002516
Rafael Espindolaeb265472013-08-21 21:59:03 +00002517bool X86TargetInfo::setFPMath(StringRef Name) {
2518 if (Name == "387") {
2519 FPMath = FP_387;
2520 return true;
2521 }
2522 if (Name == "sse") {
2523 FPMath = FP_SSE;
2524 return true;
2525 }
2526 return false;
2527}
2528
Eric Christopher007b0a02015-08-28 22:32:01 +00002529bool X86TargetInfo::initFeatureMap(
2530 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002531 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002532 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002533 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002534 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002535 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002536
Eric Christopher2b4a7252015-08-27 00:05:52 +00002537 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002538 case CK_Generic:
2539 case CK_i386:
2540 case CK_i486:
2541 case CK_i586:
2542 case CK_Pentium:
2543 case CK_i686:
2544 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002545 break;
2546 case CK_PentiumMMX:
2547 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002548 case CK_K6:
2549 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002550 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002551 break;
2552 case CK_Pentium3:
2553 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002554 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002555 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002556 break;
2557 case CK_PentiumM:
2558 case CK_Pentium4:
2559 case CK_Pentium4M:
2560 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002561 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002562 break;
2563 case CK_Yonah:
2564 case CK_Prescott:
2565 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002566 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002567 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002568 break;
2569 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002570 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002571 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002572 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002573 break;
2574 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002575 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002576 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002577 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002578 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002579 setFeatureEnabledImpl(Features, "avx512f", true);
2580 setFeatureEnabledImpl(Features, "avx512cd", true);
2581 setFeatureEnabledImpl(Features, "avx512dq", true);
2582 setFeatureEnabledImpl(Features, "avx512bw", true);
2583 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002584 // FALLTHROUGH
2585 case CK_Broadwell:
2586 setFeatureEnabledImpl(Features, "rdseed", true);
2587 setFeatureEnabledImpl(Features, "adx", true);
2588 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002589 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002590 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002591 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002592 setFeatureEnabledImpl(Features, "bmi", true);
2593 setFeatureEnabledImpl(Features, "bmi2", true);
2594 setFeatureEnabledImpl(Features, "rtm", true);
2595 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002596 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002597 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002598 setFeatureEnabledImpl(Features, "rdrnd", true);
2599 setFeatureEnabledImpl(Features, "f16c", true);
2600 setFeatureEnabledImpl(Features, "fsgsbase", true);
2601 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002602 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002603 setFeatureEnabledImpl(Features, "avx", true);
2604 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002605 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002606 case CK_Silvermont:
2607 setFeatureEnabledImpl(Features, "aes", true);
2608 setFeatureEnabledImpl(Features, "pclmul", true);
2609 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002610 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002611 setFeatureEnabledImpl(Features, "sse4.2", true);
2612 setFeatureEnabledImpl(Features, "cx16", true);
2613 break;
2614 case CK_KNL:
2615 setFeatureEnabledImpl(Features, "avx512f", true);
2616 setFeatureEnabledImpl(Features, "avx512cd", true);
2617 setFeatureEnabledImpl(Features, "avx512er", true);
2618 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002619 setFeatureEnabledImpl(Features, "rdseed", true);
2620 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002621 setFeatureEnabledImpl(Features, "lzcnt", true);
2622 setFeatureEnabledImpl(Features, "bmi", true);
2623 setFeatureEnabledImpl(Features, "bmi2", true);
2624 setFeatureEnabledImpl(Features, "rtm", true);
2625 setFeatureEnabledImpl(Features, "fma", true);
2626 setFeatureEnabledImpl(Features, "rdrnd", true);
2627 setFeatureEnabledImpl(Features, "f16c", true);
2628 setFeatureEnabledImpl(Features, "fsgsbase", true);
2629 setFeatureEnabledImpl(Features, "aes", true);
2630 setFeatureEnabledImpl(Features, "pclmul", true);
2631 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002632 break;
2633 case CK_K6_2:
2634 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002635 case CK_WinChip2:
2636 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002637 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002638 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002639 case CK_Athlon:
2640 case CK_AthlonThunderbird:
2641 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002642 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002643 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002644 case CK_Athlon4:
2645 case CK_AthlonXP:
2646 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002647 setFeatureEnabledImpl(Features, "sse", true);
2648 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002649 break;
2650 case CK_K8:
2651 case CK_Opteron:
2652 case CK_Athlon64:
2653 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002654 setFeatureEnabledImpl(Features, "sse2", true);
2655 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002656 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002657 case CK_AMDFAM10:
2658 setFeatureEnabledImpl(Features, "sse4a", true);
2659 setFeatureEnabledImpl(Features, "lzcnt", true);
2660 setFeatureEnabledImpl(Features, "popcnt", true);
2661 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002662 case CK_K8SSE3:
2663 case CK_OpteronSSE3:
2664 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002665 setFeatureEnabledImpl(Features, "sse3", true);
2666 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002667 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002668 case CK_BTVER2:
2669 setFeatureEnabledImpl(Features, "avx", true);
2670 setFeatureEnabledImpl(Features, "aes", true);
2671 setFeatureEnabledImpl(Features, "pclmul", true);
2672 setFeatureEnabledImpl(Features, "bmi", true);
2673 setFeatureEnabledImpl(Features, "f16c", true);
2674 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002675 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002676 setFeatureEnabledImpl(Features, "ssse3", true);
2677 setFeatureEnabledImpl(Features, "sse4a", true);
2678 setFeatureEnabledImpl(Features, "lzcnt", true);
2679 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002680 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002681 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002682 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002683 case CK_BDVER4:
2684 setFeatureEnabledImpl(Features, "avx2", true);
2685 setFeatureEnabledImpl(Features, "bmi2", true);
2686 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002687 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002688 setFeatureEnabledImpl(Features, "fsgsbase", true);
2689 // FALLTHROUGH
2690 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002691 setFeatureEnabledImpl(Features, "bmi", true);
2692 setFeatureEnabledImpl(Features, "fma", true);
2693 setFeatureEnabledImpl(Features, "f16c", true);
2694 setFeatureEnabledImpl(Features, "tbm", true);
2695 // FALLTHROUGH
2696 case CK_BDVER1:
2697 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002698 setFeatureEnabledImpl(Features, "xop", true);
2699 setFeatureEnabledImpl(Features, "lzcnt", true);
2700 setFeatureEnabledImpl(Features, "aes", true);
2701 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002702 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002703 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002704 break;
Eli Friedman33465822011-07-08 23:31:17 +00002705 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002706 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2707 return false;
2708
2709 // Can't do this earlier because we need to be able to explicitly enable
2710 // or disable these features and the things that they depend upon.
2711
2712 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2713 auto I = Features.find("sse4.2");
2714 if (I != Features.end() && I->getValue() == true &&
2715 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2716 FeaturesVec.end())
2717 Features["popcnt"] = true;
2718
2719 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2720 I = Features.find("3dnow");
2721 if (I != Features.end() && I->getValue() == true &&
2722 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2723 FeaturesVec.end())
2724 Features["prfchw"] = true;
2725
Eric Christophera7260af2015-10-08 20:10:18 +00002726 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2727 // then enable MMX.
2728 I = Features.find("sse");
2729 if (I != Features.end() && I->getValue() == true &&
2730 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2731 FeaturesVec.end())
2732 Features["mmx"] = true;
2733
Eric Christopherbbd746d2015-10-08 20:10:14 +00002734 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002735}
2736
Rafael Espindolae62e2792013-08-20 13:44:29 +00002737void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002738 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002739 if (Enabled) {
2740 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002741 case AVX512F:
2742 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002743 case AVX2:
2744 Features["avx2"] = true;
2745 case AVX:
2746 Features["avx"] = true;
2747 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002748 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002749 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002750 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002751 case SSSE3:
2752 Features["ssse3"] = true;
2753 case SSE3:
2754 Features["sse3"] = true;
2755 case SSE2:
2756 Features["sse2"] = true;
2757 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002758 Features["sse"] = true;
2759 case NoSSE:
2760 break;
2761 }
2762 return;
2763 }
2764
2765 switch (Level) {
2766 case NoSSE:
2767 case SSE1:
2768 Features["sse"] = false;
2769 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002770 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2771 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002772 case SSE3:
2773 Features["sse3"] = false;
2774 setXOPLevel(Features, NoXOP, false);
2775 case SSSE3:
2776 Features["ssse3"] = false;
2777 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002778 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002779 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002780 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002781 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002782 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002783 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002784 case AVX2:
2785 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002786 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002787 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002788 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2789 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002790 }
2791}
2792
2793void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002794 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002795 if (Enabled) {
2796 switch (Level) {
2797 case AMD3DNowAthlon:
2798 Features["3dnowa"] = true;
2799 case AMD3DNow:
2800 Features["3dnow"] = true;
2801 case MMX:
2802 Features["mmx"] = true;
2803 case NoMMX3DNow:
2804 break;
2805 }
2806 return;
2807 }
2808
2809 switch (Level) {
2810 case NoMMX3DNow:
2811 case MMX:
2812 Features["mmx"] = false;
2813 case AMD3DNow:
2814 Features["3dnow"] = false;
2815 case AMD3DNowAthlon:
2816 Features["3dnowa"] = false;
2817 }
2818}
2819
2820void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002821 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002822 if (Enabled) {
2823 switch (Level) {
2824 case XOP:
2825 Features["xop"] = true;
2826 case FMA4:
2827 Features["fma4"] = true;
2828 setSSELevel(Features, AVX, true);
2829 case SSE4A:
2830 Features["sse4a"] = true;
2831 setSSELevel(Features, SSE3, true);
2832 case NoXOP:
2833 break;
2834 }
2835 return;
2836 }
2837
2838 switch (Level) {
2839 case NoXOP:
2840 case SSE4A:
2841 Features["sse4a"] = false;
2842 case FMA4:
2843 Features["fma4"] = false;
2844 case XOP:
2845 Features["xop"] = false;
2846 }
2847}
2848
Craig Topper86d79ef2013-09-17 04:51:29 +00002849void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2850 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002851 // This is a bit of a hack to deal with the sse4 target feature when used
2852 // as part of the target attribute. We handle sse4 correctly everywhere
2853 // else. See below for more information on how we handle the sse4 options.
2854 if (Name != "sse4")
2855 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002856
Craig Topper29561122013-09-19 01:13:07 +00002857 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002858 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002859 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002860 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002861 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002862 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002863 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002864 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002865 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002866 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002867 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002868 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002869 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002870 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002871 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002872 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002873 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002874 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002875 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002876 if (Enabled)
2877 setSSELevel(Features, SSE2, Enabled);
2878 } else if (Name == "pclmul") {
2879 if (Enabled)
2880 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002881 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002882 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002883 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002884 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002885 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002886 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002887 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2888 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002889 if (Enabled)
2890 setSSELevel(Features, AVX512F, Enabled);
2891 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002892 if (Enabled)
2893 setSSELevel(Features, AVX, Enabled);
2894 } else if (Name == "fma4") {
2895 setXOPLevel(Features, FMA4, Enabled);
2896 } else if (Name == "xop") {
2897 setXOPLevel(Features, XOP, Enabled);
2898 } else if (Name == "sse4a") {
2899 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002900 } else if (Name == "f16c") {
2901 if (Enabled)
2902 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002903 } else if (Name == "sha") {
2904 if (Enabled)
2905 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002906 } else if (Name == "sse4") {
2907 // We can get here via the __target__ attribute since that's not controlled
2908 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2909 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2910 // disabled.
2911 if (Enabled)
2912 setSSELevel(Features, SSE42, Enabled);
2913 else
2914 setSSELevel(Features, SSE41, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002915 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002916}
2917
Eric Christopher3ff21b32013-10-16 21:26:26 +00002918/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002919/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002920bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002921 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00002922 for (const auto &Feature : Features) {
2923 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00002924 continue;
2925
Eric Christopher610fe112015-08-26 08:21:55 +00002926 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002927 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002928 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00002929 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002930 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002931 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002932 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002933 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002934 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00002935 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002936 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002937 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002938 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002939 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002940 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002941 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002942 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00002943 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002944 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00002945 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002946 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00002947 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002948 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00002949 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002950 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002951 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002952 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00002953 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002954 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00002955 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002956 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00002957 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002958 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00002959 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002960 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002961 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002962 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002963 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002964 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002965 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002966 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002967 HasAVX512VL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002968 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00002969 HasSHA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002970 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00002971 HasCX16 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002972 }
2973
Benjamin Kramer27402c62012-03-05 15:10:44 +00002974 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002975 .Case("+avx512f", AVX512F)
2976 .Case("+avx2", AVX2)
2977 .Case("+avx", AVX)
2978 .Case("+sse4.2", SSE42)
2979 .Case("+sse4.1", SSE41)
2980 .Case("+ssse3", SSSE3)
2981 .Case("+sse3", SSE3)
2982 .Case("+sse2", SSE2)
2983 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002984 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002985 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002986
Eli Friedman33465822011-07-08 23:31:17 +00002987 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002988 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002989 .Case("+3dnowa", AMD3DNowAthlon)
2990 .Case("+3dnow", AMD3DNow)
2991 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00002992 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002993 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002994
2995 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002996 .Case("+xop", XOP)
2997 .Case("+fma4", FMA4)
2998 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002999 .Default(NoXOP);
3000 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003001 }
Eli Friedman33465822011-07-08 23:31:17 +00003002
Rafael Espindolaeb265472013-08-21 21:59:03 +00003003 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3004 // matches the selected sse level.
3005 if (FPMath == FP_SSE && SSELevel < SSE1) {
3006 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
3007 return false;
3008 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
3009 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
3010 return false;
3011 }
3012
Alexey Bataev00396512015-07-02 03:40:19 +00003013 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003014 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003015 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003016}
Chris Lattnerecd49032009-03-02 22:27:17 +00003017
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003018/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3019/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003020void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003021 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003022 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003023 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003024 Builder.defineMacro("__amd64__");
3025 Builder.defineMacro("__amd64");
3026 Builder.defineMacro("__x86_64");
3027 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003028 if (getTriple().getArchName() == "x86_64h") {
3029 Builder.defineMacro("__x86_64h");
3030 Builder.defineMacro("__x86_64h__");
3031 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003032 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003033 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003034 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003035
Chris Lattnerecd49032009-03-02 22:27:17 +00003036 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003037 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3038 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003039 switch (CPU) {
3040 case CK_Generic:
3041 break;
3042 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003043 // The rest are coming from the i386 define above.
3044 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003045 break;
3046 case CK_i486:
3047 case CK_WinChipC6:
3048 case CK_WinChip2:
3049 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003050 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003051 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003052 case CK_PentiumMMX:
3053 Builder.defineMacro("__pentium_mmx__");
3054 Builder.defineMacro("__tune_pentium_mmx__");
3055 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003056 case CK_i586:
3057 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003058 defineCPUMacros(Builder, "i586");
3059 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003060 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003061 case CK_Pentium3:
3062 case CK_Pentium3M:
3063 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003064 Builder.defineMacro("__tune_pentium3__");
3065 // Fallthrough
3066 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003067 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003068 Builder.defineMacro("__tune_pentium2__");
3069 // Fallthrough
3070 case CK_PentiumPro:
3071 Builder.defineMacro("__tune_i686__");
3072 Builder.defineMacro("__tune_pentiumpro__");
3073 // Fallthrough
3074 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003075 Builder.defineMacro("__i686");
3076 Builder.defineMacro("__i686__");
3077 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3078 Builder.defineMacro("__pentiumpro");
3079 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003080 break;
3081 case CK_Pentium4:
3082 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003083 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003084 break;
3085 case CK_Yonah:
3086 case CK_Prescott:
3087 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003088 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003089 break;
3090 case CK_Core2:
3091 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003092 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003093 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003094 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003095 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003096 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003097 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003098 defineCPUMacros(Builder, "slm");
3099 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003100 case CK_Nehalem:
3101 case CK_Westmere:
3102 case CK_SandyBridge:
3103 case CK_IvyBridge:
3104 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003105 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003106 // FIXME: Historically, we defined this legacy name, it would be nice to
3107 // remove it at some point. We've never exposed fine-grained names for
3108 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003109 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003110 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003111 case CK_Skylake:
3112 // FIXME: Historically, we defined this legacy name, it would be nice to
3113 // remove it at some point. This is the only fine-grained CPU macro in the
3114 // main intel CPU line, and it would be better to not have these and force
3115 // people to use ISA macros.
3116 defineCPUMacros(Builder, "skx");
3117 break;
Craig Topper449314e2013-08-20 07:09:39 +00003118 case CK_KNL:
3119 defineCPUMacros(Builder, "knl");
3120 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003121 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003122 Builder.defineMacro("__k6_2__");
3123 Builder.defineMacro("__tune_k6_2__");
3124 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003125 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003126 if (CPU != CK_K6_2) { // In case of fallthrough
3127 // FIXME: GCC may be enabling these in cases where some other k6
3128 // architecture is specified but -m3dnow is explicitly provided. The
3129 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003130 Builder.defineMacro("__k6_3__");
3131 Builder.defineMacro("__tune_k6_3__");
3132 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003133 // Fallthrough
3134 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003135 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003136 break;
3137 case CK_Athlon:
3138 case CK_AthlonThunderbird:
3139 case CK_Athlon4:
3140 case CK_AthlonXP:
3141 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003142 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003143 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003144 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003145 Builder.defineMacro("__tune_athlon_sse__");
3146 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003147 break;
3148 case CK_K8:
3149 case CK_K8SSE3:
3150 case CK_x86_64:
3151 case CK_Opteron:
3152 case CK_OpteronSSE3:
3153 case CK_Athlon64:
3154 case CK_Athlon64SSE3:
3155 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003156 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003157 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003158 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003159 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003160 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003161 case CK_BTVER1:
3162 defineCPUMacros(Builder, "btver1");
3163 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003164 case CK_BTVER2:
3165 defineCPUMacros(Builder, "btver2");
3166 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003167 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003168 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003169 break;
3170 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003171 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003172 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003173 case CK_BDVER3:
3174 defineCPUMacros(Builder, "bdver3");
3175 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003176 case CK_BDVER4:
3177 defineCPUMacros(Builder, "bdver4");
3178 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003179 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003180 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003181 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003182 }
Chris Lattner96e43572009-03-02 22:40:39 +00003183
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003184 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003185 Builder.defineMacro("__REGISTER_PREFIX__", "");
3186
Chris Lattner6df41af2009-04-19 17:32:33 +00003187 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3188 // functions in glibc header files that use FP Stack inline asm which the
3189 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003190 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003191
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003192 if (HasAES)
3193 Builder.defineMacro("__AES__");
3194
Craig Topper3f122a72012-05-31 05:18:48 +00003195 if (HasPCLMUL)
3196 Builder.defineMacro("__PCLMUL__");
3197
Craig Topper22967d42011-12-25 05:06:45 +00003198 if (HasLZCNT)
3199 Builder.defineMacro("__LZCNT__");
3200
Benjamin Kramer1e250392012-07-07 09:39:18 +00003201 if (HasRDRND)
3202 Builder.defineMacro("__RDRND__");
3203
Craig Topper8c7f2512014-11-03 06:51:41 +00003204 if (HasFSGSBASE)
3205 Builder.defineMacro("__FSGSBASE__");
3206
Craig Topper22967d42011-12-25 05:06:45 +00003207 if (HasBMI)
3208 Builder.defineMacro("__BMI__");
3209
3210 if (HasBMI2)
3211 Builder.defineMacro("__BMI2__");
3212
Craig Topper1de83482011-12-29 16:10:46 +00003213 if (HasPOPCNT)
3214 Builder.defineMacro("__POPCNT__");
3215
Michael Liao625a8752012-11-10 05:17:46 +00003216 if (HasRTM)
3217 Builder.defineMacro("__RTM__");
3218
Michael Liao74f4eaf2013-03-26 17:52:08 +00003219 if (HasPRFCHW)
3220 Builder.defineMacro("__PRFCHW__");
3221
Michael Liaoffaae352013-03-29 05:17:55 +00003222 if (HasRDSEED)
3223 Builder.defineMacro("__RDSEED__");
3224
Robert Khasanov50e6f582014-09-19 09:53:48 +00003225 if (HasADX)
3226 Builder.defineMacro("__ADX__");
3227
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003228 if (HasTBM)
3229 Builder.defineMacro("__TBM__");
3230
Rafael Espindolae62e2792013-08-20 13:44:29 +00003231 switch (XOPLevel) {
3232 case XOP:
3233 Builder.defineMacro("__XOP__");
3234 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003235 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003236 case SSE4A:
3237 Builder.defineMacro("__SSE4A__");
3238 case NoXOP:
3239 break;
3240 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003241
Craig Topperbba778b2012-06-03 21:46:30 +00003242 if (HasFMA)
3243 Builder.defineMacro("__FMA__");
3244
Manman Rena45358c2012-10-11 00:59:55 +00003245 if (HasF16C)
3246 Builder.defineMacro("__F16C__");
3247
Craig Topper679b53a2013-08-21 05:29:10 +00003248 if (HasAVX512CD)
3249 Builder.defineMacro("__AVX512CD__");
3250 if (HasAVX512ER)
3251 Builder.defineMacro("__AVX512ER__");
3252 if (HasAVX512PF)
3253 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003254 if (HasAVX512DQ)
3255 Builder.defineMacro("__AVX512DQ__");
3256 if (HasAVX512BW)
3257 Builder.defineMacro("__AVX512BW__");
3258 if (HasAVX512VL)
3259 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003260
Ben Langmuir58078d02013-09-19 13:22:04 +00003261 if (HasSHA)
3262 Builder.defineMacro("__SHA__");
3263
Nick Lewycky50e8f482013-10-05 20:14:27 +00003264 if (HasCX16)
3265 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3266
Chris Lattner96e43572009-03-02 22:40:39 +00003267 // Each case falls through to the previous one here.
3268 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003269 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003270 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003271 case AVX2:
3272 Builder.defineMacro("__AVX2__");
3273 case AVX:
3274 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003275 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003276 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003277 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003278 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003279 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003280 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003281 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003282 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003283 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003284 Builder.defineMacro("__SSE2__");
3285 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003286 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003287 Builder.defineMacro("__SSE__");
3288 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003289 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003290 break;
3291 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003292
Derek Schuffc7dd7222012-10-11 15:52:22 +00003293 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003294 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003295 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003296 case AVX2:
3297 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003298 case SSE42:
3299 case SSE41:
3300 case SSSE3:
3301 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003302 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003303 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003304 break;
3305 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003306 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003307 break;
3308 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003309 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003310 }
3311 }
3312
Anders Carlssone437c682010-01-27 03:47:49 +00003313 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003314 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003315 case AMD3DNowAthlon:
3316 Builder.defineMacro("__3dNOW_A__");
3317 case AMD3DNow:
3318 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003319 case MMX:
3320 Builder.defineMacro("__MMX__");
3321 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003322 break;
3323 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003324
3325 if (CPU >= CK_i486) {
3326 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3327 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3328 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3329 }
3330 if (CPU >= CK_i586)
3331 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003332}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003333
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003334bool X86TargetInfo::hasFeature(StringRef Feature) const {
3335 return llvm::StringSwitch<bool>(Feature)
3336 .Case("aes", HasAES)
3337 .Case("avx", SSELevel >= AVX)
3338 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003339 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003340 .Case("avx512cd", HasAVX512CD)
3341 .Case("avx512er", HasAVX512ER)
3342 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003343 .Case("avx512dq", HasAVX512DQ)
3344 .Case("avx512bw", HasAVX512BW)
3345 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003346 .Case("bmi", HasBMI)
3347 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003348 .Case("cx16", HasCX16)
3349 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003350 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003351 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003352 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003353 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003354 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3355 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3356 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003357 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003358 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003359 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003360 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003361 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003362 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003363 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003364 .Case("sse", SSELevel >= SSE1)
3365 .Case("sse2", SSELevel >= SSE2)
3366 .Case("sse3", SSELevel >= SSE3)
3367 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003368 .Case("sse4.1", SSELevel >= SSE41)
3369 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003370 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003371 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003372 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003373 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3374 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003375 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003376 .Default(false);
3377}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003378
Eric Christopherd9832702015-06-29 21:00:05 +00003379// We can't use a generic validation scheme for the features accepted here
3380// versus subtarget features accepted in the target attribute because the
3381// bitfield structure that's initialized in the runtime only supports the
3382// below currently rather than the full range of subtarget features. (See
3383// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3384bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3385 return llvm::StringSwitch<bool>(FeatureStr)
3386 .Case("cmov", true)
3387 .Case("mmx", true)
3388 .Case("popcnt", true)
3389 .Case("sse", true)
3390 .Case("sse2", true)
3391 .Case("sse3", true)
3392 .Case("sse4.1", true)
3393 .Case("sse4.2", true)
3394 .Case("avx", true)
3395 .Case("avx2", true)
3396 .Case("sse4a", true)
3397 .Case("fma4", true)
3398 .Case("xop", true)
3399 .Case("fma", true)
3400 .Case("avx512f", true)
3401 .Case("bmi", true)
3402 .Case("bmi2", true)
3403 .Default(false);
3404}
3405
Eli Friedman3fd920a2008-08-20 02:34:37 +00003406bool
Anders Carlsson58436352009-02-28 17:11:49 +00003407X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003408 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003409 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003410 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003411 // Constant constraints.
3412 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3413 // instructions.
3414 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3415 // x86_64 instructions.
3416 case 's':
3417 Info.setRequiresImmediate();
3418 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003419 case 'I':
3420 Info.setRequiresImmediate(0, 31);
3421 return true;
3422 case 'J':
3423 Info.setRequiresImmediate(0, 63);
3424 return true;
3425 case 'K':
3426 Info.setRequiresImmediate(-128, 127);
3427 return true;
3428 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003429 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003430 return true;
3431 case 'M':
3432 Info.setRequiresImmediate(0, 3);
3433 return true;
3434 case 'N':
3435 Info.setRequiresImmediate(0, 255);
3436 return true;
3437 case 'O':
3438 Info.setRequiresImmediate(0, 127);
3439 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003440 // Register constraints.
3441 case 'Y': // 'Y' is the first character for several 2-character constraints.
3442 // Shift the pointer to the second character of the constraint.
3443 Name++;
3444 switch (*Name) {
3445 default:
3446 return false;
3447 case '0': // First SSE register.
3448 case 't': // Any SSE register, when SSE2 is enabled.
3449 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3450 case 'm': // Any MMX register, when inter-unit moves enabled.
3451 Info.setAllowsRegister();
3452 return true;
3453 }
3454 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003455 // Constraint 'f' cannot be used for output operands.
3456 if (Info.ConstraintStr[0] == '=')
3457 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003458 Info.setAllowsRegister();
3459 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003460 case 'a': // eax.
3461 case 'b': // ebx.
3462 case 'c': // ecx.
3463 case 'd': // edx.
3464 case 'S': // esi.
3465 case 'D': // edi.
3466 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003467 case 't': // Top of floating point stack.
3468 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003469 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003470 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003471 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003472 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003473 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3474 case 'l': // "Index" registers: any general register that can be used as an
3475 // index in a base+index memory access.
3476 Info.setAllowsRegister();
3477 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003478 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003479 case 'C': // SSE floating point constant.
3480 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003481 return true;
3482 }
3483}
3484
Akira Hatanaka974131e2014-09-18 18:17:18 +00003485bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3486 unsigned Size) const {
3487 // Strip off constraint modifiers.
3488 while (Constraint[0] == '=' ||
3489 Constraint[0] == '+' ||
3490 Constraint[0] == '&')
3491 Constraint = Constraint.substr(1);
3492
3493 return validateOperandSize(Constraint, Size);
3494}
3495
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003496bool X86TargetInfo::validateInputSize(StringRef Constraint,
3497 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003498 return validateOperandSize(Constraint, Size);
3499}
3500
3501bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3502 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003503 switch (Constraint[0]) {
3504 default: break;
3505 case 'y':
3506 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003507 case 'f':
3508 case 't':
3509 case 'u':
3510 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003511 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003512 if (SSELevel >= AVX512F)
3513 // 512-bit zmm registers can be used if target supports AVX512F.
3514 return Size <= 512U;
3515 else if (SSELevel >= AVX)
3516 // 256-bit ymm registers can be used if target supports AVX.
3517 return Size <= 256U;
3518 return Size <= 128U;
3519 case 'Y':
3520 // 'Y' is the first character for several 2-character constraints.
3521 switch (Constraint[1]) {
3522 default: break;
3523 case 'm':
3524 // 'Ym' is synonymous with 'y'.
3525 return Size <= 64;
3526 case 'i':
3527 case 't':
3528 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3529 if (SSELevel >= AVX512F)
3530 return Size <= 512U;
3531 else if (SSELevel >= AVX)
3532 return Size <= 256U;
3533 return SSELevel >= SSE2 && Size <= 128U;
3534 }
3535
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003536 }
3537
3538 return true;
3539}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003540
Eli Friedman3fd920a2008-08-20 02:34:37 +00003541std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003542X86TargetInfo::convertConstraint(const char *&Constraint) const {
3543 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003544 case 'a': return std::string("{ax}");
3545 case 'b': return std::string("{bx}");
3546 case 'c': return std::string("{cx}");
3547 case 'd': return std::string("{dx}");
3548 case 'S': return std::string("{si}");
3549 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003550 case 'p': // address
3551 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003552 case 't': // top of floating point stack.
3553 return std::string("{st}");
3554 case 'u': // second from top of floating point stack.
3555 return std::string("{st(1)}"); // second from top of floating point stack.
3556 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003557 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003558 }
3559}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003560
Eli Friedman3fd920a2008-08-20 02:34:37 +00003561// X86-32 generic target
3562class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003563public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003564 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003565 DoubleAlign = LongLongAlign = 32;
3566 LongDoubleWidth = 96;
3567 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003568 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003569 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003570 SizeType = UnsignedInt;
3571 PtrDiffType = SignedInt;
3572 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003573 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003574
3575 // Use fpret for all types.
3576 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3577 (1 << TargetInfo::Double) |
3578 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003579
3580 // x86-32 has atomics up to 8 bytes
3581 // FIXME: Check that we actually have cmpxchg8b before setting
3582 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3583 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003584 }
Craig Topper3164f332014-03-11 03:39:26 +00003585 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003586 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003587 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003588
Craig Topper3164f332014-03-11 03:39:26 +00003589 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003590 if (RegNo == 0) return 0;
3591 if (RegNo == 1) return 2;
3592 return -1;
3593 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003594 bool validateOperandSize(StringRef Constraint,
3595 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003596 switch (Constraint[0]) {
3597 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003598 case 'R':
3599 case 'q':
3600 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003601 case 'a':
3602 case 'b':
3603 case 'c':
3604 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003605 case 'S':
3606 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003607 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003608 case 'A':
3609 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003610 }
3611
Akira Hatanaka974131e2014-09-18 18:17:18 +00003612 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003613 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003614};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003615
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003616class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3617public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003618 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3619 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003620
Craig Topper3164f332014-03-11 03:39:26 +00003621 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003622 unsigned Major, Minor, Micro;
3623 getTriple().getOSVersion(Major, Minor, Micro);
3624 // New NetBSD uses the default rounding mode.
3625 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3626 return X86_32TargetInfo::getFloatEvalMethod();
3627 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003628 return 1;
3629 }
3630};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003631
Eli Friedmane3aa4542009-07-05 18:47:56 +00003632class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3633public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003634 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3635 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003636 SizeType = UnsignedLong;
3637 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003638 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003639 }
3640};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003641
Eli Friedman9fa28852012-08-08 23:57:20 +00003642class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3643public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003644 BitrigI386TargetInfo(const llvm::Triple &Triple)
3645 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003646 SizeType = UnsignedLong;
3647 IntPtrType = SignedLong;
3648 PtrDiffType = SignedLong;
3649 }
3650};
Eli Friedman9fa28852012-08-08 23:57:20 +00003651
Torok Edwinb2b37c62009-06-30 17:10:35 +00003652class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003653public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003654 DarwinI386TargetInfo(const llvm::Triple &Triple)
3655 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003656 LongDoubleWidth = 128;
3657 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003658 SuitableAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003659 SizeType = UnsignedLong;
3660 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003661 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003662 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003663 }
3664
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003665 bool handleTargetFeatures(std::vector<std::string> &Features,
3666 DiagnosticsEngine &Diags) override {
3667 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3668 Diags))
3669 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003670 // We now know the features we have: we can decide how to align vectors.
3671 MaxVectorAlign =
3672 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003673 return true;
3674 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003675};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003676
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003677// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003678class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003679public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003680 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3681 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003682 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003683 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003684 bool IsWinCOFF =
3685 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003686 DataLayoutString = IsWinCOFF
3687 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3688 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003689 }
Craig Topper3164f332014-03-11 03:39:26 +00003690 void getTargetDefines(const LangOptions &Opts,
3691 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003692 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3693 }
3694};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003695
3696// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003697class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003698public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003699 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003700 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003701 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003702 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3703 }
Craig Topper3164f332014-03-11 03:39:26 +00003704 void getTargetDefines(const LangOptions &Opts,
3705 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003706 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3707 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3708 // The value of the following reflects processor type.
3709 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3710 // We lost the original triple, so we use the default.
3711 Builder.defineMacro("_M_IX86", "600");
3712 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003713};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003714
David Majnemerae1ed0e2015-05-28 04:36:18 +00003715static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003716 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3717 // supports __declspec natively under -fms-extensions, but we define a no-op
3718 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003719 if (Opts.MicrosoftExt)
3720 Builder.defineMacro("__declspec", "__declspec");
3721 else
3722 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3723
3724 if (!Opts.MicrosoftExt) {
3725 // Provide macros for all the calling convention keywords. Provide both
3726 // single and double underscore prefixed variants. These are available on
3727 // x64 as well as x86, even though they have no effect.
3728 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3729 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003730 std::string GCCSpelling = "__attribute__((__";
3731 GCCSpelling += CC;
3732 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003733 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3734 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3735 }
3736 }
3737}
3738
David Majnemerae1ed0e2015-05-28 04:36:18 +00003739static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3740 Builder.defineMacro("__MSVCRT__");
3741 Builder.defineMacro("__MINGW32__");
3742 addCygMingDefines(Opts, Builder);
3743}
3744
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003745// x86-32 MinGW target
3746class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3747public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003748 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003749 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003750 void getTargetDefines(const LangOptions &Opts,
3751 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003752 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003753 DefineStd(Builder, "WIN32", Opts);
3754 DefineStd(Builder, "WINNT", Opts);
3755 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003756 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003757 }
3758};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003759
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003760// x86-32 Cygwin target
3761class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3762public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003763 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3764 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003765 TLSSupported = false;
3766 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003767 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003768 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 +00003769 }
Craig Topper3164f332014-03-11 03:39:26 +00003770 void getTargetDefines(const LangOptions &Opts,
3771 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003772 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003773 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003774 Builder.defineMacro("__CYGWIN__");
3775 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003776 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003777 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003778 if (Opts.CPlusPlus)
3779 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003780 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003781};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003782
Chris Lattnerb986aba2010-04-11 19:29:39 +00003783// x86-32 Haiku target
3784class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3785public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003786 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003787 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003788 IntPtrType = SignedLong;
3789 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003790 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003791 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003792 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003793 }
Craig Topper3164f332014-03-11 03:39:26 +00003794 void getTargetDefines(const LangOptions &Opts,
3795 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003796 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3797 Builder.defineMacro("__INTEL__");
3798 Builder.defineMacro("__HAIKU__");
3799 }
3800};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003801
Douglas Gregor9fabd852011-07-01 22:41:14 +00003802// RTEMS Target
3803template<typename Target>
3804class RTEMSTargetInfo : public OSTargetInfo<Target> {
3805protected:
Craig Topper3164f332014-03-11 03:39:26 +00003806 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3807 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003808 // RTEMS defines; list based off of gcc output
3809
Douglas Gregor9fabd852011-07-01 22:41:14 +00003810 Builder.defineMacro("__rtems__");
3811 Builder.defineMacro("__ELF__");
3812 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003813
Douglas Gregor9fabd852011-07-01 22:41:14 +00003814public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003815 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3816 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003817
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003818 switch (Triple.getArch()) {
3819 default:
3820 case llvm::Triple::x86:
3821 // this->MCountName = ".mcount";
3822 break;
3823 case llvm::Triple::mips:
3824 case llvm::Triple::mipsel:
3825 case llvm::Triple::ppc:
3826 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003827 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003828 // this->MCountName = "_mcount";
3829 break;
3830 case llvm::Triple::arm:
3831 // this->MCountName = "__mcount";
3832 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003833 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003834 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003835};
3836
Douglas Gregor9fabd852011-07-01 22:41:14 +00003837// x86-32 RTEMS target
3838class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3839public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003840 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003841 SizeType = UnsignedLong;
3842 IntPtrType = SignedLong;
3843 PtrDiffType = SignedLong;
3844 this->UserLabelPrefix = "";
3845 }
Craig Topper3164f332014-03-11 03:39:26 +00003846 void getTargetDefines(const LangOptions &Opts,
3847 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003848 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3849 Builder.defineMacro("__INTEL__");
3850 Builder.defineMacro("__rtems__");
3851 }
3852};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003853
Eli Friedman3fd920a2008-08-20 02:34:37 +00003854// x86-64 generic target
3855class X86_64TargetInfo : public X86TargetInfo {
3856public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003857 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003858 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003859 bool IsWinCOFF =
3860 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003861 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003862 LongDoubleWidth = 128;
3863 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003864 LargeArrayMinWidth = 128;
3865 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003866 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003867 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3868 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3869 IntPtrType = IsX32 ? SignedInt : SignedLong;
3870 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003871 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003872 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003873
Eric Christopher917e9522014-11-18 22:36:15 +00003874 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003875 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3876 : IsWinCOFF
3877 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3878 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003879
3880 // Use fpret only for long double.
3881 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003882
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003883 // Use fp2ret for _Complex long double.
3884 ComplexLongDoubleUsesFP2Ret = true;
3885
Charles Davisc7d5c942015-09-17 20:55:33 +00003886 // Make __builtin_ms_va_list available.
3887 HasBuiltinMSVaList = true;
3888
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003889 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003890 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003891 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003892 }
Craig Topper3164f332014-03-11 03:39:26 +00003893 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003894 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003895 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003896
Craig Topper3164f332014-03-11 03:39:26 +00003897 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003898 if (RegNo == 0) return 0;
3899 if (RegNo == 1) return 1;
3900 return -1;
3901 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003902
Craig Topper3164f332014-03-11 03:39:26 +00003903 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003904 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003905 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003906 CC == CC_IntelOclBicc ||
3907 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003908 }
3909
Craig Topper3164f332014-03-11 03:39:26 +00003910 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003911 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003912 }
3913
Pavel Chupinfd223e12014-08-04 12:39:43 +00003914 // for x32 we need it here explicitly
3915 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003916};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003917
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003918// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003919class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003920public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003921 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3922 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003923 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003924 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003925 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003926 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003927 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003928 SizeType = UnsignedLongLong;
3929 PtrDiffType = SignedLongLong;
3930 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003931 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003932 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003933
Craig Topper3164f332014-03-11 03:39:26 +00003934 void getTargetDefines(const LangOptions &Opts,
3935 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003936 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003937 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003938 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003939
Craig Topper3164f332014-03-11 03:39:26 +00003940 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003941 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003942 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003943
Craig Topper3164f332014-03-11 03:39:26 +00003944 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003945 switch (CC) {
3946 case CC_X86StdCall:
3947 case CC_X86ThisCall:
3948 case CC_X86FastCall:
3949 return CCCR_Ignore;
3950 case CC_C:
3951 case CC_X86VectorCall:
3952 case CC_IntelOclBicc:
3953 case CC_X86_64SysV:
3954 return CCCR_OK;
3955 default:
3956 return CCCR_Warning;
3957 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003958 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003959};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003960
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003961// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003962class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003963public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003964 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003965 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003966 LongDoubleWidth = LongDoubleAlign = 64;
3967 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003968 }
Craig Topper3164f332014-03-11 03:39:26 +00003969 void getTargetDefines(const LangOptions &Opts,
3970 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003971 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3972 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00003973 Builder.defineMacro("_M_X64", "100");
3974 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003975 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003976};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003977
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003978// x86-64 MinGW target
3979class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3980public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003981 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Yaron Keren480bc9f2015-08-20 21:51:46 +00003982 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003983 void getTargetDefines(const LangOptions &Opts,
3984 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003985 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003986 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003987 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003988 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003989
3990 // GCC defines this macro when it is using __gxx_personality_seh0.
3991 if (!Opts.SjLjExceptions)
3992 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003993 }
3994};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003995
Yaron Kerend030d112015-07-22 17:38:19 +00003996// x86-64 Cygwin target
3997class CygwinX86_64TargetInfo : public X86_64TargetInfo {
3998public:
3999 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4000 : X86_64TargetInfo(Triple) {
4001 TLSSupported = false;
4002 WCharType = UnsignedShort;
4003 }
4004 void getTargetDefines(const LangOptions &Opts,
4005 MacroBuilder &Builder) const override {
4006 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4007 Builder.defineMacro("__x86_64__");
4008 Builder.defineMacro("__CYGWIN__");
4009 Builder.defineMacro("__CYGWIN64__");
4010 addCygMingDefines(Opts, Builder);
4011 DefineStd(Builder, "unix", Opts);
4012 if (Opts.CPlusPlus)
4013 Builder.defineMacro("_GNU_SOURCE");
4014
4015 // GCC defines this macro when it is using __gxx_personality_seh0.
4016 if (!Opts.SjLjExceptions)
4017 Builder.defineMacro("__SEH__");
4018 }
4019};
4020
Eli Friedman2857ccb2009-07-01 03:36:11 +00004021class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4022public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004023 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4024 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004025 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004026 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4027 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004028 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004029 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004030 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004031 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004032
4033 bool handleTargetFeatures(std::vector<std::string> &Features,
4034 DiagnosticsEngine &Diags) override {
4035 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4036 Diags))
4037 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004038 // We now know the features we have: we can decide how to align vectors.
4039 MaxVectorAlign =
4040 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004041 return true;
4042 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004043};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004044
Eli Friedman245f2292009-07-05 22:31:18 +00004045class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4046public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004047 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4048 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004049 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004050 Int64Type = SignedLongLong;
4051 }
4052};
Eli Friedman245f2292009-07-05 22:31:18 +00004053
Eli Friedman9fa28852012-08-08 23:57:20 +00004054class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4055public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004056 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4057 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4058 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004059 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004060 }
4061};
Tim Northover9bb857a2013-01-31 12:13:10 +00004062
Eli Friedmanf05b7722008-08-20 07:44:10 +00004063class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004064 // Possible FPU choices.
4065 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004066 VFP2FPU = (1 << 0),
4067 VFP3FPU = (1 << 1),
4068 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004069 NeonFPU = (1 << 3),
4070 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004071 };
4072
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004073 // Possible HWDiv features.
4074 enum HWDivMode {
4075 HWDivThumb = (1 << 0),
4076 HWDivARM = (1 << 1)
4077 };
4078
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004079 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004080 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004081 }
4082
4083 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4084 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004085
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004086 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004087
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004088 StringRef CPUProfile;
4089 StringRef CPUAttr;
4090
Rafael Espindolaeb265472013-08-21 21:59:03 +00004091 enum {
4092 FP_Default,
4093 FP_VFP,
4094 FP_Neon
4095 } FPMath;
4096
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004097 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004098 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004099 unsigned ArchProfile;
4100 unsigned ArchVersion;
4101
Bernard Ogdenda13af32013-10-24 18:32:51 +00004102 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004103
Logan Chien57086ce2012-10-10 06:56:20 +00004104 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004105 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004106
4107 // Initialized via features.
4108 unsigned SoftFloat : 1;
4109 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004110
Bernard Ogden18b57012013-10-29 09:47:51 +00004111 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004112 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004113 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004114 unsigned Unaligned : 1;
4115
4116 enum {
4117 LDREX_B = (1 << 0), /// byte (8-bit)
4118 LDREX_H = (1 << 1), /// half (16-bit)
4119 LDREX_W = (1 << 2), /// word (32-bit)
4120 LDREX_D = (1 << 3), /// double (64-bit)
4121 };
4122
4123 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004124
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004125 // ACLE 6.5.1 Hardware floating point
4126 enum {
4127 HW_FP_HP = (1 << 1), /// half (16-bit)
4128 HW_FP_SP = (1 << 2), /// single (32-bit)
4129 HW_FP_DP = (1 << 3), /// double (64-bit)
4130 };
4131 uint32_t HW_FP;
4132
Chris Lattner5cc15e02010-03-03 19:03:45 +00004133 static const Builtin::Info BuiltinInfo[];
4134
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004135 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004136 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004137
4138 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004139 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004140
Renato Golin9ba39232015-02-27 16:35:48 +00004141 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4142 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4143 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004144 SizeType = UnsignedLong;
4145 else
4146 SizeType = UnsignedInt;
4147
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004148 switch (T.getOS()) {
4149 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004150 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004151 break;
4152 case llvm::Triple::Win32:
4153 WCharType = UnsignedShort;
4154 break;
4155 case llvm::Triple::Linux:
4156 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004157 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4158 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004159 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004160 }
4161
4162 UseBitFieldTypeAlignment = true;
4163
4164 ZeroLengthBitfieldBoundary = 0;
4165
Tim Northover147cd2f2014-10-14 22:12:21 +00004166 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4167 // so set preferred for small types to 32.
4168 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004169 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004170 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4171 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4172 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004173 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004174 DataLayoutString = "e"
4175 "-m:w"
4176 "-p:32:32"
4177 "-i64:64"
4178 "-v128:64:128"
4179 "-a:0:32"
4180 "-n32"
4181 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004182 } else if (T.isOSNaCl()) {
4183 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004184 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004185 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004186 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004187 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4188 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004189 }
4190
4191 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004192 }
4193
4194 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004195 const llvm::Triple &T = getTriple();
4196
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004197 IsAAPCS = false;
4198
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004199 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004200
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004201 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004202 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004203 SizeType = UnsignedInt;
4204 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004205 SizeType = UnsignedLong;
4206
4207 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4208 WCharType = SignedInt;
4209
4210 // Do not respect the alignment of bit-field types when laying out
4211 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4212 UseBitFieldTypeAlignment = false;
4213
4214 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4215 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4216 /// gcc.
4217 ZeroLengthBitfieldBoundary = 32;
4218
Tim Northover147cd2f2014-10-14 22:12:21 +00004219 if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004220 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004221 BigEndian
4222 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4223 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4224 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004225 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004226 BigEndian
4227 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4228 : "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 +00004229
4230 // FIXME: Override "preferred align" for double and long long.
4231 }
4232
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004233 void setArchInfo() {
4234 StringRef ArchName = getTriple().getArchName();
4235
Renato Goline84b0002015-10-08 16:43:26 +00004236 ArchISA = llvm::ARM::parseArchISA(ArchName);
4237 CPU = llvm::ARM::getDefaultCPU(ArchName);
4238 unsigned AK = llvm::ARM::parseArch(ArchName);
4239 if (AK != llvm::ARM::AK_INVALID)
4240 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004241 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004242 }
4243
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004244 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004245 StringRef SubArch;
4246
4247 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004248 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004249 SubArch = llvm::ARM::getSubArch(ArchKind);
4250 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4251 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004252
4253 // cache CPU related strings
4254 CPUAttr = getCPUAttr();
4255 CPUProfile = getCPUProfile();
4256 }
4257
4258 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004259 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004260 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004261 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004262 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4263 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004264 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004265 if (ArchProfile == llvm::ARM::PK_M) {
4266 MaxAtomicPromoteWidth = 32;
4267 if (ShouldUseInlineAtomic)
4268 MaxAtomicInlineWidth = 32;
4269 }
4270 else {
4271 MaxAtomicPromoteWidth = 64;
4272 if (ShouldUseInlineAtomic)
4273 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004274 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004275 }
4276
4277 bool isThumb() const {
4278 return (ArchISA == llvm::ARM::IK_THUMB);
4279 }
4280
4281 bool supportsThumb() const {
4282 return CPUAttr.count('T') || ArchVersion >= 6;
4283 }
4284
4285 bool supportsThumb2() const {
4286 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4287 }
4288
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004289 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004290 // For most sub-arches, the build attribute CPU name is enough.
4291 // For Cortex variants, it's slightly different.
4292 switch(ArchKind) {
4293 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004294 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004295 case llvm::ARM::AK_ARMV6M:
4296 case llvm::ARM::AK_ARMV6SM:
4297 case llvm::ARM::AK_ARMV6HL:
4298 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004299 case llvm::ARM::AK_ARMV7S:
4300 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004301 case llvm::ARM::AK_ARMV7:
4302 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004303 case llvm::ARM::AK_ARMV7L:
4304 case llvm::ARM::AK_ARMV7HL:
4305 return "7A";
4306 case llvm::ARM::AK_ARMV7R:
4307 return "7R";
4308 case llvm::ARM::AK_ARMV7M:
4309 return "7M";
4310 case llvm::ARM::AK_ARMV7EM:
4311 return "7EM";
4312 case llvm::ARM::AK_ARMV8A:
4313 return "8A";
4314 case llvm::ARM::AK_ARMV8_1A:
4315 return "8_1A";
4316 }
4317 }
4318
4319 StringRef getCPUProfile() const {
4320 switch(ArchProfile) {
4321 case llvm::ARM::PK_A:
4322 return "A";
4323 case llvm::ARM::PK_R:
4324 return "R";
4325 case llvm::ARM::PK_M:
4326 return "M";
4327 default:
4328 return "";
4329 }
4330 }
4331
Chris Lattner17df24e2008-04-21 18:56:49 +00004332public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004333 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004334 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004335 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004336 BigEndian = IsBigEndian;
4337
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004338 switch (getTriple().getOS()) {
4339 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004340 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004341 break;
4342 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004343 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004344 break;
4345 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004346
Renato Goline84b0002015-10-08 16:43:26 +00004347 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004348 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004349
Chris Lattner1a8f3942010-04-23 16:29:58 +00004350 // {} in inline assembly are neon specifiers, not assembly variant
4351 // specifiers.
4352 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004353
Eric Christopher0e261882014-12-05 01:06:59 +00004354 // FIXME: This duplicates code from the driver that sets the -target-abi
4355 // option - this code is used if -target-abi isn't passed and should
4356 // be unified in some way.
4357 if (Triple.isOSBinFormatMachO()) {
4358 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4359 // the frontend matches that.
4360 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4361 Triple.getOS() == llvm::Triple::UnknownOS ||
4362 StringRef(CPU).startswith("cortex-m")) {
4363 setABI("aapcs");
4364 } else {
4365 setABI("apcs-gnu");
4366 }
4367 } else if (Triple.isOSWindows()) {
4368 // FIXME: this is invalid for WindowsCE
4369 setABI("aapcs");
4370 } else {
4371 // Select the default based on the platform.
4372 switch (Triple.getEnvironment()) {
4373 case llvm::Triple::Android:
4374 case llvm::Triple::GNUEABI:
4375 case llvm::Triple::GNUEABIHF:
4376 setABI("aapcs-linux");
4377 break;
4378 case llvm::Triple::EABIHF:
4379 case llvm::Triple::EABI:
4380 setABI("aapcs");
4381 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004382 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004383 setABI("apcs-gnu");
4384 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004385 default:
4386 if (Triple.getOS() == llvm::Triple::NetBSD)
4387 setABI("apcs-gnu");
4388 else
4389 setABI("aapcs");
4390 break;
4391 }
4392 }
John McCall86353412010-08-21 22:46:04 +00004393
4394 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004395 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004396
Renato Golin15b86152015-07-03 16:41:13 +00004397 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004398 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004399
James Molloya7139222012-03-12 09:14:10 +00004400 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004401 // the alignment of the zero-length bitfield is greater than the member
4402 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004403 // zero length bitfield.
4404 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004405 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004406
Alp Toker4925ba72014-06-07 23:30:42 +00004407 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004408
Craig Topper3164f332014-03-11 03:39:26 +00004409 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004410 ABI = Name;
4411
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004412 // The defaults (above) are for AAPCS, check if we need to change them.
4413 //
4414 // FIXME: We need support for -meabi... we could just mangle it into the
4415 // name.
4416 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004417 setABIAPCS();
4418 return true;
4419 }
4420 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4421 setABIAAPCS();
4422 return true;
4423 }
4424 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004425 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004426
Renato Golinf5c4dec2015-05-27 13:33:00 +00004427 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004428 bool
4429 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4430 StringRef CPU,
4431 const std::vector<std::string> &FeaturesVec) const override {
4432
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004433 std::vector<const char*> TargetFeatures;
4434
4435 // get default FPU features
4436 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU);
4437 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4438
4439 // get default Extension features
4440 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU);
4441 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4442
4443 for (const char *Feature : TargetFeatures)
4444 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004445 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004446
Eric Christopher007b0a02015-08-28 22:32:01 +00004447 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004448 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004449
Craig Topper3164f332014-03-11 03:39:26 +00004450 bool handleTargetFeatures(std::vector<std::string> &Features,
4451 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004452 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004453 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004454 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004455 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004456 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004457 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004458 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004459
Ranjeet Singhac08e532015-06-24 23:39:25 +00004460 // This does not diagnose illegal cases like having both
4461 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4462 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004463 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004464 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004465 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004466 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004467 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004468 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004469 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004470 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004471 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004472 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004473 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004474 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004475 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004476 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004477 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004478 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004479 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004480 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004481 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004482 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004483 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004484 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004485 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004486 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004487 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004488 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004489 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004490 Crypto = 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004491 } else if (Feature == "+t2dsp") {
4492 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004493 } else if (Feature == "+fp-only-sp") {
Ranjeet Singhac08e532015-06-24 23:39:25 +00004494 HW_FP_remove |= HW_FP_DP | HW_FP_HP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004495 } else if (Feature == "+strict-align") {
4496 Unaligned = 0;
4497 } else if (Feature == "+fp16") {
4498 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004499 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004500 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004501 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004502
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004503 switch (ArchVersion) {
4504 case 6:
4505 if (ArchProfile == llvm::ARM::PK_M)
4506 LDREX = 0;
4507 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4508 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4509 else
4510 LDREX = LDREX_W;
4511 break;
4512 case 7:
4513 if (ArchProfile == llvm::ARM::PK_M)
4514 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4515 else
4516 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4517 break;
4518 case 8:
4519 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4520 }
4521
Rafael Espindolaeb265472013-08-21 21:59:03 +00004522 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4523 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4524 return false;
4525 }
4526
4527 if (FPMath == FP_Neon)
4528 Features.push_back("+neonfp");
4529 else if (FPMath == FP_VFP)
4530 Features.push_back("-neonfp");
4531
Daniel Dunbar893d4752009-12-19 04:15:38 +00004532 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004533 auto Feature =
4534 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4535 if (Feature != Features.end())
4536 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004537
Rafael Espindolaeb265472013-08-21 21:59:03 +00004538 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004539 }
4540
Craig Topper3164f332014-03-11 03:39:26 +00004541 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004542 return llvm::StringSwitch<bool>(Feature)
4543 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004544 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004545 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004546 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004547 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004548 .Case("hwdiv", HWDiv & HWDivThumb)
4549 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004550 .Default(false);
4551 }
Renato Golin15b86152015-07-03 16:41:13 +00004552
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004553 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004554 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004555 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004556
Renato Golin15b86152015-07-03 16:41:13 +00004557 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004558 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004559 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004560 CPU = Name;
4561 return true;
4562 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004563
Craig Topper3164f332014-03-11 03:39:26 +00004564 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004565
Craig Topper3164f332014-03-11 03:39:26 +00004566 void getTargetDefines(const LangOptions &Opts,
4567 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004568 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004569 Builder.defineMacro("__arm");
4570 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004571
Chris Lattnerecd49032009-03-02 22:27:17 +00004572 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004573 Builder.defineMacro("__REGISTER_PREFIX__", "");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004574 if (!CPUAttr.empty())
4575 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004576
4577 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004578 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004579 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004580
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004581 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004582 // ACLE 6.5.7 Crypto Extension
4583 if (Crypto)
4584 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4585 // ACLE 6.5.8 CRC32 Extension
4586 if (CRC)
4587 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4588 // ACLE 6.5.10 Numeric Maximum and Minimum
4589 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4590 // ACLE 6.5.9 Directed Rounding
4591 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004592 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004593
4594 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4595 // is not defined for the M-profile.
4596 // NOTE that the deffault profile is assumed to be 'A'
4597 if (CPUProfile.empty() || CPUProfile != "M")
4598 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4599
4600 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4601 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4602 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004603 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004604 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004605 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004606 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4607
4608 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4609 // instruction set such as ARM or Thumb.
4610 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4611
4612 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4613
4614 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004615 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004616 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004617
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004618 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004619 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004620 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004621
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004622 // ACLE 6.4.4 LDREX/STREX
4623 if (LDREX)
4624 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4625
4626 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004627 if (ArchVersion == 5 ||
4628 (ArchVersion == 6 && CPUProfile != "M") ||
4629 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004630 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4631
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004632 // ACLE 6.5.1 Hardware Floating Point
4633 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004634 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004635
Yi Konga44c4d72014-06-27 21:25:42 +00004636 // ACLE predefines.
4637 Builder.defineMacro("__ARM_ACLE", "200");
4638
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004639 // FP16 support (we currently only support IEEE format).
4640 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4641 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4642
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004643 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4644 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4645 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4646
Mike Stump9d54bd72009-04-08 02:07:04 +00004647 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004648
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004649 // FIXME: It's more complicated than this and we don't really support
4650 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004651 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004652 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004653 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004654
David Tweed8f676532012-10-25 13:33:01 +00004655 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004656 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004657 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4658 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004659 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004660 Builder.defineMacro("__ARM_PCS", "1");
4661
David Tweed8f676532012-10-25 13:33:01 +00004662 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004663 Builder.defineMacro("__ARM_PCS_VFP", "1");
4664 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004665
Daniel Dunbar893d4752009-12-19 04:15:38 +00004666 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004667 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004668
4669 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004670 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004671
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004672 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004673 Builder.defineMacro("__THUMBEL__");
4674 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004675 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004676 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004677 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004678
4679 // ACLE 6.4.9 32-bit SIMD instructions
4680 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4681 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4682
4683 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004684 if (((HWDiv & HWDivThumb) && isThumb()) ||
4685 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004686 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004687 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004688 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004689
4690 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004691 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004692
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004693 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004694 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004695 if (FPU & VFP2FPU)
4696 Builder.defineMacro("__ARM_VFPV2__");
4697 if (FPU & VFP3FPU)
4698 Builder.defineMacro("__ARM_VFPV3__");
4699 if (FPU & VFP4FPU)
4700 Builder.defineMacro("__ARM_VFPV4__");
4701 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004702
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004703 // This only gets set when Neon instructions are actually available, unlike
4704 // the VFP define, hence the soft float and arch check. This is subtly
4705 // different from gcc, we follow the intent which was that it should be set
4706 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004707 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004708 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004709 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004710 // current AArch32 NEON implementations do not support double-precision
4711 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004712 Builder.defineMacro("__ARM_NEON_FP",
4713 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004714 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004715
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004716 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4717 Opts.ShortWChar ? "2" : "4");
4718
4719 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4720 Opts.ShortEnums ? "1" : "4");
4721
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004722 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004723 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4724 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4725 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4726 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4727 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004728
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004729 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004730 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004731 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004732 }
4733
4734 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004735 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004736 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4737 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004738 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004739 }
4740
4741 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004742 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004743 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004744
4745 if (Opts.UnsafeFPMath)
4746 Builder.defineMacro("__ARM_FP_FAST", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004747 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004748
Craig Topper3164f332014-03-11 03:39:26 +00004749 void getTargetBuiltins(const Builtin::Info *&Records,
4750 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004751 Records = BuiltinInfo;
4752 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004753 }
Craig Topper3164f332014-03-11 03:39:26 +00004754 bool isCLZForZeroUndef() const override { return false; }
4755 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004756 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004757 }
Craig Topper3164f332014-03-11 03:39:26 +00004758 void getGCCRegNames(const char * const *&Names,
4759 unsigned &NumNames) const override;
4760 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4761 unsigned &NumAliases) const override;
4762 bool validateAsmConstraint(const char *&Name,
4763 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004764 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004765 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004766 case 'l': // r0-r7
4767 case 'h': // r8-r15
4768 case 'w': // VFP Floating point register single precision
4769 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004770 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004771 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004772 case 'I':
4773 case 'J':
4774 case 'K':
4775 case 'L':
4776 case 'M':
4777 // FIXME
4778 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004779 case 'Q': // A memory address that is a single base register.
4780 Info.setAllowsMemory();
4781 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004782 case 'U': // a memory reference...
4783 switch (Name[1]) {
4784 case 'q': // ...ARMV4 ldrsb
4785 case 'v': // ...VFP load/store (reg+constant offset)
4786 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004787 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004788 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004789 case 'n': // valid address for Neon doubleword vector load/store
4790 case 'm': // valid address for Neon element and structure load/store
4791 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004792 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004793 Info.setAllowsMemory();
4794 Name++;
4795 return true;
4796 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004797 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004798 return false;
4799 }
Craig Topper3164f332014-03-11 03:39:26 +00004800 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004801 std::string R;
4802 switch (*Constraint) {
4803 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004804 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004805 Constraint++;
4806 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004807 case 'p': // 'p' should be translated to 'r' by default.
4808 R = std::string("r");
4809 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004810 default:
4811 return std::string(1, *Constraint);
4812 }
4813 return R;
4814 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004815 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004816 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004817 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004818 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004819 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004820
Bill Wendling9d1ee112012-10-25 23:28:48 +00004821 // Strip off constraint modifiers.
4822 while (Constraint[0] == '=' ||
4823 Constraint[0] == '+' ||
4824 Constraint[0] == '&')
4825 Constraint = Constraint.substr(1);
4826
4827 switch (Constraint[0]) {
4828 default: break;
4829 case 'r': {
4830 switch (Modifier) {
4831 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004832 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004833 case 'q':
4834 // A register of size 32 cannot fit a vector type.
4835 return false;
4836 }
4837 }
4838 }
4839
4840 return true;
4841 }
Craig Topper3164f332014-03-11 03:39:26 +00004842 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004843 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004844 return "";
4845 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004846
Craig Topper3164f332014-03-11 03:39:26 +00004847 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004848 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4849 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004850
Craig Topper3164f332014-03-11 03:39:26 +00004851 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004852 if (RegNo == 0) return 0;
4853 if (RegNo == 1) return 1;
4854 return -1;
4855 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004856
4857 bool hasSjLjLowering() const override {
4858 return true;
4859 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004860};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004861
Rafael Espindolaeb265472013-08-21 21:59:03 +00004862bool ARMTargetInfo::setFPMath(StringRef Name) {
4863 if (Name == "neon") {
4864 FPMath = FP_Neon;
4865 return true;
4866 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4867 Name == "vfp4") {
4868 FPMath = FP_VFP;
4869 return true;
4870 }
4871 return false;
4872}
4873
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004874const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004875 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004876 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004877 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4878
4879 // Float registers
4880 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4881 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4882 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004883 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004884
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004885 // Double registers
4886 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4887 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004888 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4889 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004890
4891 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004892 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4893 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004894};
4895
4896void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004897 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004898 Names = GCCRegNames;
4899 NumNames = llvm::array_lengthof(GCCRegNames);
4900}
4901
4902const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004903 { { "a1" }, "r0" },
4904 { { "a2" }, "r1" },
4905 { { "a3" }, "r2" },
4906 { { "a4" }, "r3" },
4907 { { "v1" }, "r4" },
4908 { { "v2" }, "r5" },
4909 { { "v3" }, "r6" },
4910 { { "v4" }, "r7" },
4911 { { "v5" }, "r8" },
4912 { { "v6", "rfp" }, "r9" },
4913 { { "sl" }, "r10" },
4914 { { "fp" }, "r11" },
4915 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004916 { { "r13" }, "sp" },
4917 { { "r14" }, "lr" },
4918 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004919 // The S, D and Q registers overlap, but aren't really aliases; we
4920 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004921};
4922
4923void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4924 unsigned &NumAliases) const {
4925 Aliases = GCCRegAliases;
4926 NumAliases = llvm::array_lengthof(GCCRegAliases);
4927}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004928
4929const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00004930#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004931 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004932#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4933 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00004934#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004935
Craig Topper07d3b622015-08-07 05:14:44 +00004936#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004937 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004938#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004939 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004940#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4941 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004942#include "clang/Basic/BuiltinsARM.def"
4943};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004944
4945class ARMleTargetInfo : public ARMTargetInfo {
4946public:
4947 ARMleTargetInfo(const llvm::Triple &Triple)
4948 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004949 void getTargetDefines(const LangOptions &Opts,
4950 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004951 Builder.defineMacro("__ARMEL__");
4952 ARMTargetInfo::getTargetDefines(Opts, Builder);
4953 }
4954};
4955
4956class ARMbeTargetInfo : public ARMTargetInfo {
4957public:
4958 ARMbeTargetInfo(const llvm::Triple &Triple)
4959 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004960 void getTargetDefines(const LangOptions &Opts,
4961 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004962 Builder.defineMacro("__ARMEB__");
4963 Builder.defineMacro("__ARM_BIG_ENDIAN");
4964 ARMTargetInfo::getTargetDefines(Opts, Builder);
4965 }
4966};
Chris Lattner17df24e2008-04-21 18:56:49 +00004967
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004968class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4969 const llvm::Triple Triple;
4970public:
4971 WindowsARMTargetInfo(const llvm::Triple &Triple)
4972 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4973 TLSSupported = false;
4974 WCharType = UnsignedShort;
4975 SizeType = UnsignedInt;
4976 UserLabelPrefix = "";
4977 }
4978 void getVisualStudioDefines(const LangOptions &Opts,
4979 MacroBuilder &Builder) const {
4980 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4981
4982 // FIXME: this is invalid for WindowsCE
4983 Builder.defineMacro("_M_ARM_NT", "1");
4984 Builder.defineMacro("_M_ARMT", "_M_ARM");
4985 Builder.defineMacro("_M_THUMB", "_M_ARM");
4986
4987 assert((Triple.getArch() == llvm::Triple::arm ||
4988 Triple.getArch() == llvm::Triple::thumb) &&
4989 "invalid architecture for Windows ARM target info");
4990 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4991 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4992
4993 // TODO map the complete set of values
4994 // 31: VFPv3 40: VFPv4
4995 Builder.defineMacro("_M_ARM_FP", "31");
4996 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004997 BuiltinVaListKind getBuiltinVaListKind() const override {
4998 return TargetInfo::CharPtrBuiltinVaList;
4999 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005000 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5001 switch (CC) {
5002 case CC_X86StdCall:
5003 case CC_X86ThisCall:
5004 case CC_X86FastCall:
5005 case CC_X86VectorCall:
5006 return CCCR_Ignore;
5007 case CC_C:
5008 return CCCR_OK;
5009 default:
5010 return CCCR_Warning;
5011 }
5012 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005013};
5014
5015// Windows ARM + Itanium C++ ABI Target
5016class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5017public:
5018 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5019 : WindowsARMTargetInfo(Triple) {
5020 TheCXXABI.set(TargetCXXABI::GenericARM);
5021 }
5022
5023 void getTargetDefines(const LangOptions &Opts,
5024 MacroBuilder &Builder) const override {
5025 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5026
5027 if (Opts.MSVCCompat)
5028 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5029 }
5030};
5031
5032// Windows ARM, MS (C++) ABI
5033class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5034public:
5035 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5036 : WindowsARMTargetInfo(Triple) {
5037 TheCXXABI.set(TargetCXXABI::Microsoft);
5038 }
5039
5040 void getTargetDefines(const LangOptions &Opts,
5041 MacroBuilder &Builder) const override {
5042 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5043 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5044 }
5045};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005046
Yaron Keren321249c2015-07-15 13:32:23 +00005047// ARM MinGW target
5048class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5049public:
5050 MinGWARMTargetInfo(const llvm::Triple &Triple)
5051 : WindowsARMTargetInfo(Triple) {
5052 TheCXXABI.set(TargetCXXABI::GenericARM);
5053 }
5054
5055 void getTargetDefines(const LangOptions &Opts,
5056 MacroBuilder &Builder) const override {
5057 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5058 DefineStd(Builder, "WIN32", Opts);
5059 DefineStd(Builder, "WINNT", Opts);
5060 Builder.defineMacro("_ARM_");
5061 addMinGWDefines(Opts, Builder);
5062 }
5063};
5064
5065// ARM Cygwin target
5066class CygwinARMTargetInfo : public ARMleTargetInfo {
5067public:
5068 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5069 TLSSupported = false;
5070 WCharType = UnsignedShort;
5071 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005072 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005073 }
5074 void getTargetDefines(const LangOptions &Opts,
5075 MacroBuilder &Builder) const override {
5076 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5077 Builder.defineMacro("_ARM_");
5078 Builder.defineMacro("__CYGWIN__");
5079 Builder.defineMacro("__CYGWIN32__");
5080 DefineStd(Builder, "unix", Opts);
5081 if (Opts.CPlusPlus)
5082 Builder.defineMacro("_GNU_SOURCE");
5083 }
5084};
5085
Mike Stump11289f42009-09-09 15:08:12 +00005086class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005087 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005088protected:
Craig Topper3164f332014-03-11 03:39:26 +00005089 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5090 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005091 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005092 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005093
Torok Edwinb2b37c62009-06-30 17:10:35 +00005094public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005095 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005096 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005097 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005098 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005099 // FIXME: This should be based off of the target features in
5100 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005101 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005102
5103 // Darwin on iOS uses a variant of the ARM C++ ABI.
5104 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005105 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005106};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005107
Tim Northover573cbee2014-05-24 12:52:07 +00005108class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005109 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005110 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5111 static const char *const GCCRegNames[];
5112
James Molloy75f5f9e2014-04-16 15:33:48 +00005113 enum FPUModeEnum {
5114 FPUMode,
5115 NeonMode
5116 };
5117
5118 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005119 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005120 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005121 unsigned Unaligned;
James Molloy75f5f9e2014-04-16 15:33:48 +00005122
Tim Northovera2ee4332014-03-29 15:09:45 +00005123 static const Builtin::Info BuiltinInfo[];
5124
5125 std::string ABI;
5126
5127public:
Tim Northover573cbee2014-05-24 12:52:07 +00005128 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005129 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005130
5131 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5132 WCharType = SignedInt;
5133
5134 // NetBSD apparently prefers consistency across ARM targets to consistency
5135 // across 64-bit targets.
5136 Int64Type = SignedLongLong;
5137 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005138 } else {
5139 WCharType = UnsignedInt;
5140 Int64Type = SignedLong;
5141 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005142 }
5143
Tim Northovera2ee4332014-03-29 15:09:45 +00005144 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005145 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005146 MaxAtomicInlineWidth = 128;
5147 MaxAtomicPromoteWidth = 128;
5148
Tim Northovera6a19f12015-02-06 01:25:07 +00005149 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005150 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5151
Tim Northovera2ee4332014-03-29 15:09:45 +00005152 // {} in inline assembly are neon specifiers, not assembly variant
5153 // specifiers.
5154 NoAsmVariants = true;
5155
Tim Northover7ad87af2015-01-16 18:44:04 +00005156 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5157 // contributes to the alignment of the containing aggregate in the same way
5158 // a plain (non bit-field) member of that type would, without exception for
5159 // zero-sized or anonymous bit-fields."
5160 UseBitFieldTypeAlignment = true;
5161 UseZeroLengthBitfieldAlignment = true;
5162
Tim Northover573cbee2014-05-24 12:52:07 +00005163 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005164 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5165 }
5166
Alp Toker4925ba72014-06-07 23:30:42 +00005167 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005168 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005169 if (Name != "aapcs" && Name != "darwinpcs")
5170 return false;
5171
5172 ABI = Name;
5173 return true;
5174 }
5175
David Blaikie1cbb9712014-11-14 19:09:44 +00005176 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005177 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005178 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005179 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005180 .Case("cyclone", true)
5181 .Default(false);
5182 return CPUKnown;
5183 }
5184
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005185 void getTargetDefines(const LangOptions &Opts,
5186 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005187 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005188 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005189
5190 // Target properties.
5191 Builder.defineMacro("_LP64");
5192 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005193
5194 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5195 Builder.defineMacro("__ARM_ACLE", "200");
5196 Builder.defineMacro("__ARM_ARCH", "8");
5197 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5198
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005199 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005200 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005201 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005202
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005203 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5204 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5205 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5206 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005207 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005208 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5209 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005210
5211 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5212
5213 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005214 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005215
5216 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5217 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005218 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5219 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005220
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005221 if (Opts.UnsafeFPMath)
5222 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005223
5224 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5225
5226 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5227 Opts.ShortEnums ? "1" : "4");
5228
James Molloy75f5f9e2014-04-16 15:33:48 +00005229 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005230 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005231 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005232 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005233 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005234
Bradley Smith418c5932014-05-02 15:17:51 +00005235 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005236 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005237
James Molloy75f5f9e2014-04-16 15:33:48 +00005238 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005239 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5240
5241 if (Unaligned)
5242 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005243
5244 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5245 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5246 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5247 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5248 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005249 }
5250
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005251 void getTargetBuiltins(const Builtin::Info *&Records,
5252 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005253 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00005254 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00005255 }
5256
David Blaikie1cbb9712014-11-14 19:09:44 +00005257 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005258 return Feature == "aarch64" ||
5259 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005260 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005261 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005262 }
5263
James Molloy5e73df52014-04-16 15:06:20 +00005264 bool handleTargetFeatures(std::vector<std::string> &Features,
5265 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005266 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005267 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005268 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005269 Unaligned = 1;
5270
Eric Christopher610fe112015-08-26 08:21:55 +00005271 for (const auto &Feature : Features) {
5272 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005273 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005274 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005275 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005276 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005277 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005278 if (Feature == "+strict-align")
5279 Unaligned = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005280 }
5281
Eric Christopher964a5f32015-08-05 23:48:05 +00005282 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005283
5284 return true;
5285 }
5286
David Blaikie1cbb9712014-11-14 19:09:44 +00005287 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005288
David Blaikie1cbb9712014-11-14 19:09:44 +00005289 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005290 return TargetInfo::AArch64ABIBuiltinVaList;
5291 }
5292
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005293 void getGCCRegNames(const char *const *&Names,
5294 unsigned &NumNames) const override;
5295 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5296 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005297
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005298 bool validateAsmConstraint(const char *&Name,
5299 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005300 switch (*Name) {
5301 default:
5302 return false;
5303 case 'w': // Floating point and SIMD registers (V0-V31)
5304 Info.setAllowsRegister();
5305 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005306 case 'I': // Constant that can be used with an ADD instruction
5307 case 'J': // Constant that can be used with a SUB instruction
5308 case 'K': // Constant that can be used with a 32-bit logical instruction
5309 case 'L': // Constant that can be used with a 64-bit logical instruction
5310 case 'M': // Constant that can be used as a 32-bit MOV immediate
5311 case 'N': // Constant that can be used as a 64-bit MOV immediate
5312 case 'Y': // Floating point constant zero
5313 case 'Z': // Integer constant zero
5314 return true;
5315 case 'Q': // A memory reference with base register and no offset
5316 Info.setAllowsMemory();
5317 return true;
5318 case 'S': // A symbolic address
5319 Info.setAllowsRegister();
5320 return true;
5321 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005322 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5323 // Utf: A memory address suitable for ldp/stp in TF mode.
5324 // Usa: An absolute symbolic address.
5325 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5326 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005327 case 'z': // Zero register, wzr or xzr
5328 Info.setAllowsRegister();
5329 return true;
5330 case 'x': // Floating point and SIMD registers (V0-V15)
5331 Info.setAllowsRegister();
5332 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005333 }
5334 return false;
5335 }
5336
Akira Hatanaka987f1862014-08-22 06:05:21 +00005337 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005338 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005339 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005340 // Strip off constraint modifiers.
5341 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5342 Constraint = Constraint.substr(1);
5343
5344 switch (Constraint[0]) {
5345 default:
5346 return true;
5347 case 'z':
5348 case 'r': {
5349 switch (Modifier) {
5350 case 'x':
5351 case 'w':
5352 // For now assume that the person knows what they're
5353 // doing with the modifier.
5354 return true;
5355 default:
5356 // By default an 'r' constraint will be in the 'x'
5357 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005358 if (Size == 64)
5359 return true;
5360
5361 SuggestedModifier = "w";
5362 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005363 }
5364 }
5365 }
5366 }
5367
David Blaikie1cbb9712014-11-14 19:09:44 +00005368 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005369
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005370 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005371 if (RegNo == 0)
5372 return 0;
5373 if (RegNo == 1)
5374 return 1;
5375 return -1;
5376 }
5377};
5378
Tim Northover573cbee2014-05-24 12:52:07 +00005379const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005380 // 32-bit Integer registers
5381 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5382 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5383 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5384
5385 // 64-bit Integer registers
5386 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5387 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5388 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5389
5390 // 32-bit floating point regsisters
5391 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5392 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5393 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5394
5395 // 64-bit floating point regsisters
5396 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5397 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5398 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5399
5400 // Vector registers
5401 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5402 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5403 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5404};
5405
Tim Northover573cbee2014-05-24 12:52:07 +00005406void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005407 unsigned &NumNames) const {
5408 Names = GCCRegNames;
5409 NumNames = llvm::array_lengthof(GCCRegNames);
5410}
5411
Tim Northover573cbee2014-05-24 12:52:07 +00005412const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005413 { { "w31" }, "wsp" },
5414 { { "x29" }, "fp" },
5415 { { "x30" }, "lr" },
5416 { { "x31" }, "sp" },
5417 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5418 // don't want to substitute one of these for a different-sized one.
5419};
5420
Tim Northover573cbee2014-05-24 12:52:07 +00005421void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005422 unsigned &NumAliases) const {
5423 Aliases = GCCRegAliases;
5424 NumAliases = llvm::array_lengthof(GCCRegAliases);
5425}
5426
Tim Northover573cbee2014-05-24 12:52:07 +00005427const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005428#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005429 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005430#include "clang/Basic/BuiltinsNEON.def"
5431
5432#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005433 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005434#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005435};
James Molloy5e73df52014-04-16 15:06:20 +00005436
Tim Northover573cbee2014-05-24 12:52:07 +00005437class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005438 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005439 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005440 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005441 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005442 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005443 }
5444
5445public:
Tim Northover573cbee2014-05-24 12:52:07 +00005446 AArch64leTargetInfo(const llvm::Triple &Triple)
5447 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005448 BigEndian = false;
5449 }
5450 void getTargetDefines(const LangOptions &Opts,
5451 MacroBuilder &Builder) const override {
5452 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005453 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005454 }
5455};
5456
Tim Northover573cbee2014-05-24 12:52:07 +00005457class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005458 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005459 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005460 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005461 }
5462
5463public:
Tim Northover573cbee2014-05-24 12:52:07 +00005464 AArch64beTargetInfo(const llvm::Triple &Triple)
5465 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005466 void getTargetDefines(const LangOptions &Opts,
5467 MacroBuilder &Builder) const override {
5468 Builder.defineMacro("__AARCH64EB__");
5469 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5470 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005471 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005472 }
5473};
Tim Northovera2ee4332014-03-29 15:09:45 +00005474
Tim Northover573cbee2014-05-24 12:52:07 +00005475class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005476protected:
5477 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5478 MacroBuilder &Builder) const override {
5479 Builder.defineMacro("__AARCH64_SIMD__");
5480 Builder.defineMacro("__ARM64_ARCH_8__");
5481 Builder.defineMacro("__ARM_NEON__");
5482 Builder.defineMacro("__LITTLE_ENDIAN__");
5483 Builder.defineMacro("__REGISTER_PREFIX__", "");
5484 Builder.defineMacro("__arm64", "1");
5485 Builder.defineMacro("__arm64__", "1");
5486
5487 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5488 }
5489
Tim Northovera2ee4332014-03-29 15:09:45 +00005490public:
Tim Northover573cbee2014-05-24 12:52:07 +00005491 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5492 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005493 Int64Type = SignedLongLong;
5494 WCharType = SignedInt;
5495 UseSignedCharForObjCBool = false;
5496
Tim Northovera6a19f12015-02-06 01:25:07 +00005497 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005498 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5499
5500 TheCXXABI.set(TargetCXXABI::iOS64);
5501 }
5502
David Blaikie1cbb9712014-11-14 19:09:44 +00005503 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005504 return TargetInfo::CharPtrBuiltinVaList;
5505 }
5506};
Tim Northovera2ee4332014-03-29 15:09:45 +00005507
Tony Linthicum76329bf2011-12-12 21:14:55 +00005508// Hexagon abstract base class
5509class HexagonTargetInfo : public TargetInfo {
5510 static const Builtin::Info BuiltinInfo[];
5511 static const char * const GCCRegNames[];
5512 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5513 std::string CPU;
5514public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005515 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005516 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00005517 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005518
5519 // {} in inline assembly are packet specifiers, not assembly variant
5520 // specifiers.
5521 NoAsmVariants = true;
5522 }
5523
Craig Topper3164f332014-03-11 03:39:26 +00005524 void getTargetBuiltins(const Builtin::Info *&Records,
5525 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005526 Records = BuiltinInfo;
5527 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5528 }
5529
Craig Topper3164f332014-03-11 03:39:26 +00005530 bool validateAsmConstraint(const char *&Name,
5531 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005532 return true;
5533 }
5534
Craig Topper3164f332014-03-11 03:39:26 +00005535 void getTargetDefines(const LangOptions &Opts,
5536 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005537
Craig Topper3164f332014-03-11 03:39:26 +00005538 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005539 return Feature == "hexagon";
5540 }
Craig Topper3164f332014-03-11 03:39:26 +00005541
5542 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005543 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005544 }
Craig Topper3164f332014-03-11 03:39:26 +00005545 void getGCCRegNames(const char * const *&Names,
5546 unsigned &NumNames) const override;
5547 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5548 unsigned &NumAliases) const override;
5549 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005550 return "";
5551 }
Sebastian Pop86500282012-01-13 20:37:10 +00005552
5553 static const char *getHexagonCPUSuffix(StringRef Name) {
5554 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005555 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005556 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005557 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005558 }
5559
Craig Topper3164f332014-03-11 03:39:26 +00005560 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005561 if (!getHexagonCPUSuffix(Name))
5562 return false;
5563
Tony Linthicum76329bf2011-12-12 21:14:55 +00005564 CPU = Name;
5565 return true;
5566 }
5567};
5568
5569void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5570 MacroBuilder &Builder) const {
5571 Builder.defineMacro("qdsp6");
5572 Builder.defineMacro("__qdsp6", "1");
5573 Builder.defineMacro("__qdsp6__", "1");
5574
5575 Builder.defineMacro("hexagon");
5576 Builder.defineMacro("__hexagon", "1");
5577 Builder.defineMacro("__hexagon__", "1");
5578
5579 if(CPU == "hexagonv1") {
5580 Builder.defineMacro("__HEXAGON_V1__");
5581 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5582 if(Opts.HexagonQdsp6Compat) {
5583 Builder.defineMacro("__QDSP6_V1__");
5584 Builder.defineMacro("__QDSP6_ARCH__", "1");
5585 }
5586 }
5587 else if(CPU == "hexagonv2") {
5588 Builder.defineMacro("__HEXAGON_V2__");
5589 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5590 if(Opts.HexagonQdsp6Compat) {
5591 Builder.defineMacro("__QDSP6_V2__");
5592 Builder.defineMacro("__QDSP6_ARCH__", "2");
5593 }
5594 }
5595 else if(CPU == "hexagonv3") {
5596 Builder.defineMacro("__HEXAGON_V3__");
5597 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5598 if(Opts.HexagonQdsp6Compat) {
5599 Builder.defineMacro("__QDSP6_V3__");
5600 Builder.defineMacro("__QDSP6_ARCH__", "3");
5601 }
5602 }
5603 else if(CPU == "hexagonv4") {
5604 Builder.defineMacro("__HEXAGON_V4__");
5605 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5606 if(Opts.HexagonQdsp6Compat) {
5607 Builder.defineMacro("__QDSP6_V4__");
5608 Builder.defineMacro("__QDSP6_ARCH__", "4");
5609 }
5610 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005611 else if(CPU == "hexagonv5") {
5612 Builder.defineMacro("__HEXAGON_V5__");
5613 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5614 if(Opts.HexagonQdsp6Compat) {
5615 Builder.defineMacro("__QDSP6_V5__");
5616 Builder.defineMacro("__QDSP6_ARCH__", "5");
5617 }
5618 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005619}
5620
5621const char * const HexagonTargetInfo::GCCRegNames[] = {
5622 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5623 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5624 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5625 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5626 "p0", "p1", "p2", "p3",
5627 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5628};
5629
5630void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5631 unsigned &NumNames) const {
5632 Names = GCCRegNames;
5633 NumNames = llvm::array_lengthof(GCCRegNames);
5634}
5635
5636
5637const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5638 { { "sp" }, "r29" },
5639 { { "fp" }, "r30" },
5640 { { "lr" }, "r31" },
5641 };
5642
5643void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5644 unsigned &NumAliases) const {
5645 Aliases = GCCRegAliases;
5646 NumAliases = llvm::array_lengthof(GCCRegAliases);
5647}
5648
5649
5650const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005651#define BUILTIN(ID, TYPE, ATTRS) \
5652 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5653#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5654 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005655#include "clang/Basic/BuiltinsHexagon.def"
5656};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005657
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005658// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5659class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005660 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5661 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005662 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005663public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005664 SparcTargetInfo(const llvm::Triple &Triple)
5665 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005666
Craig Topper3164f332014-03-11 03:39:26 +00005667 bool handleTargetFeatures(std::vector<std::string> &Features,
5668 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005669 // The backend doesn't actually handle soft float yet, but in case someone
5670 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005671 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5672 if (Feature != Features.end()) {
5673 SoftFloat = true;
5674 Features.erase(Feature);
5675 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005676 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005677 }
Craig Topper3164f332014-03-11 03:39:26 +00005678 void getTargetDefines(const LangOptions &Opts,
5679 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005680 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005681 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005682
5683 if (SoftFloat)
5684 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005685 }
Craig Topper3164f332014-03-11 03:39:26 +00005686
5687 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005688 return llvm::StringSwitch<bool>(Feature)
5689 .Case("softfloat", SoftFloat)
5690 .Case("sparc", true)
5691 .Default(false);
5692 }
Craig Topper3164f332014-03-11 03:39:26 +00005693
5694 void getTargetBuiltins(const Builtin::Info *&Records,
5695 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005696 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005697 }
Craig Topper3164f332014-03-11 03:39:26 +00005698 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005699 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005700 }
Craig Topper3164f332014-03-11 03:39:26 +00005701 void getGCCRegNames(const char * const *&Names,
5702 unsigned &NumNames) const override;
5703 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5704 unsigned &NumAliases) const override;
5705 bool validateAsmConstraint(const char *&Name,
5706 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005707 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005708 switch (*Name) {
5709 case 'I': // Signed 13-bit constant
5710 case 'J': // Zero
5711 case 'K': // 32-bit constant with the low 12 bits clear
5712 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5713 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5714 case 'N': // Same as 'K' but zext (required for SIMode)
5715 case 'O': // The constant 4096
5716 return true;
5717 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005718 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005719 }
Craig Topper3164f332014-03-11 03:39:26 +00005720 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005721 // FIXME: Implement!
5722 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005723 }
5724};
5725
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005726const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005727 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5728 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5729 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5730 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5731};
5732
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005733void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5734 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005735 Names = GCCRegNames;
5736 NumNames = llvm::array_lengthof(GCCRegNames);
5737}
5738
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005739const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005740 { { "g0" }, "r0" },
5741 { { "g1" }, "r1" },
5742 { { "g2" }, "r2" },
5743 { { "g3" }, "r3" },
5744 { { "g4" }, "r4" },
5745 { { "g5" }, "r5" },
5746 { { "g6" }, "r6" },
5747 { { "g7" }, "r7" },
5748 { { "o0" }, "r8" },
5749 { { "o1" }, "r9" },
5750 { { "o2" }, "r10" },
5751 { { "o3" }, "r11" },
5752 { { "o4" }, "r12" },
5753 { { "o5" }, "r13" },
5754 { { "o6", "sp" }, "r14" },
5755 { { "o7" }, "r15" },
5756 { { "l0" }, "r16" },
5757 { { "l1" }, "r17" },
5758 { { "l2" }, "r18" },
5759 { { "l3" }, "r19" },
5760 { { "l4" }, "r20" },
5761 { { "l5" }, "r21" },
5762 { { "l6" }, "r22" },
5763 { { "l7" }, "r23" },
5764 { { "i0" }, "r24" },
5765 { { "i1" }, "r25" },
5766 { { "i2" }, "r26" },
5767 { { "i3" }, "r27" },
5768 { { "i4" }, "r28" },
5769 { { "i5" }, "r29" },
5770 { { "i6", "fp" }, "r30" },
5771 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005772};
5773
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005774void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5775 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005776 Aliases = GCCRegAliases;
5777 NumAliases = llvm::array_lengthof(GCCRegAliases);
5778}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005779
5780// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5781class SparcV8TargetInfo : public SparcTargetInfo {
5782public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005783 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005784 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00005785 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
5786 switch (getTriple().getOS()) {
5787 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00005788 SizeType = UnsignedInt;
5789 IntPtrType = SignedInt;
5790 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00005791 break;
5792 case llvm::Triple::NetBSD:
5793 case llvm::Triple::OpenBSD:
5794 SizeType = UnsignedLong;
5795 IntPtrType = SignedLong;
5796 PtrDiffType = SignedLong;
5797 break;
Brad Smith56495d52015-08-13 22:00:53 +00005798 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005799 }
5800
Craig Topper3164f332014-03-11 03:39:26 +00005801 void getTargetDefines(const LangOptions &Opts,
5802 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005803 SparcTargetInfo::getTargetDefines(Opts, Builder);
5804 Builder.defineMacro("__sparcv8");
5805 }
5806};
5807
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005808// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5809class SparcV8elTargetInfo : public SparcV8TargetInfo {
5810 public:
5811 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005812 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005813 BigEndian = false;
5814 }
5815};
5816
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005817// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5818class SparcV9TargetInfo : public SparcTargetInfo {
5819public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005820 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005821 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00005822 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005823 // This is an LP64 platform.
5824 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005825
5826 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005827 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005828 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005829 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005830 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005831 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005832
5833 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5834 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5835 LongDoubleWidth = 128;
5836 LongDoubleAlign = 128;
5837 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005838 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005839 }
5840
Craig Topper3164f332014-03-11 03:39:26 +00005841 void getTargetDefines(const LangOptions &Opts,
5842 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005843 SparcTargetInfo::getTargetDefines(Opts, Builder);
5844 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005845 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005846 // Solaris doesn't need these variants, but the BSDs do.
5847 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005848 Builder.defineMacro("__sparc64__");
5849 Builder.defineMacro("__sparc_v9__");
5850 Builder.defineMacro("__sparcv9__");
5851 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005852 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005853
Craig Topper3164f332014-03-11 03:39:26 +00005854 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005855 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5856 .Case("v9", true)
5857 .Case("ultrasparc", true)
5858 .Case("ultrasparc3", true)
5859 .Case("niagara", true)
5860 .Case("niagara2", true)
5861 .Case("niagara3", true)
5862 .Case("niagara4", true)
5863 .Default(false);
5864
5865 // No need to store the CPU yet. There aren't any CPU-specific
5866 // macros to define.
5867 return CPUKnown;
5868 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005869};
5870
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005871class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005872 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005873 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005874 std::string CPU;
5875 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005876 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005877
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005878public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005879 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00005880 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
5881 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005882 IntMaxType = SignedLong;
5883 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005884 TLSSupported = true;
5885 IntWidth = IntAlign = 32;
5886 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5887 PointerWidth = PointerAlign = 64;
5888 LongDoubleWidth = 128;
5889 LongDoubleAlign = 64;
5890 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005891 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005892 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00005893 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 +00005894 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5895 }
5896 void getTargetDefines(const LangOptions &Opts,
5897 MacroBuilder &Builder) const override {
5898 Builder.defineMacro("__s390__");
5899 Builder.defineMacro("__s390x__");
5900 Builder.defineMacro("__zarch__");
5901 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005902 if (HasTransactionalExecution)
5903 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005904 if (Opts.ZVector)
5905 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005906 }
5907 void getTargetBuiltins(const Builtin::Info *&Records,
5908 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005909 Records = BuiltinInfo;
5910 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005911 }
5912
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005913 void getGCCRegNames(const char *const *&Names,
5914 unsigned &NumNames) const override;
5915 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5916 unsigned &NumAliases) const override {
5917 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005918 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005919 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005920 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005921 bool validateAsmConstraint(const char *&Name,
5922 TargetInfo::ConstraintInfo &info) const override;
5923 const char *getClobbers() const override {
5924 // FIXME: Is this really right?
5925 return "";
5926 }
5927 BuiltinVaListKind getBuiltinVaListKind() const override {
5928 return TargetInfo::SystemZBuiltinVaList;
5929 }
5930 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005931 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005932 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5933 .Case("z10", true)
5934 .Case("z196", true)
5935 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005936 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005937 .Default(false);
5938
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005939 return CPUKnown;
5940 }
Eric Christopher8c47b422015-10-09 18:39:55 +00005941 bool
5942 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5943 StringRef CPU,
5944 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005945 if (CPU == "zEC12")
5946 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005947 if (CPU == "z13") {
5948 Features["transactional-execution"] = true;
5949 Features["vector"] = true;
5950 }
Eric Christopher007b0a02015-08-28 22:32:01 +00005951 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005952 }
5953
5954 bool handleTargetFeatures(std::vector<std::string> &Features,
5955 DiagnosticsEngine &Diags) override {
5956 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00005957 for (const auto &Feature : Features) {
5958 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005959 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00005960 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005961 HasVector = true;
5962 }
5963 // If we use the vector ABI, vector types are 64-bit aligned.
5964 if (HasVector) {
5965 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005966 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5967 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005968 }
5969 return true;
5970 }
5971
5972 bool hasFeature(StringRef Feature) const override {
5973 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005974 .Case("systemz", true)
5975 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005976 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005977 .Default(false);
5978 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005979
5980 StringRef getABI() const override {
5981 if (HasVector)
5982 return "vector";
5983 return "";
5984 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00005985
5986 bool useFloat128ManglingForLongDouble() const override {
5987 return true;
5988 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005989};
5990
5991const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5992#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005993 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005994#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005995};
5996
5997const char *const SystemZTargetInfo::GCCRegNames[] = {
5998 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5999 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6000 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6001 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6002};
6003
6004void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
6005 unsigned &NumNames) const {
6006 Names = GCCRegNames;
6007 NumNames = llvm::array_lengthof(GCCRegNames);
6008}
6009
6010bool SystemZTargetInfo::
6011validateAsmConstraint(const char *&Name,
6012 TargetInfo::ConstraintInfo &Info) const {
6013 switch (*Name) {
6014 default:
6015 return false;
6016
6017 case 'a': // Address register
6018 case 'd': // Data register (equivalent to 'r')
6019 case 'f': // Floating-point register
6020 Info.setAllowsRegister();
6021 return true;
6022
6023 case 'I': // Unsigned 8-bit constant
6024 case 'J': // Unsigned 12-bit constant
6025 case 'K': // Signed 16-bit constant
6026 case 'L': // Signed 20-bit displacement (on all targets we support)
6027 case 'M': // 0x7fffffff
6028 return true;
6029
6030 case 'Q': // Memory with base and unsigned 12-bit displacement
6031 case 'R': // Likewise, plus an index
6032 case 'S': // Memory with base and signed 20-bit displacement
6033 case 'T': // Likewise, plus an index
6034 Info.setAllowsMemory();
6035 return true;
6036 }
6037}
Ulrich Weigand47445072013-05-06 16:26:41 +00006038
Eric Christopherc48497a2015-09-18 21:26:24 +00006039class MSP430TargetInfo : public TargetInfo {
6040 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006041
Eric Christopherc48497a2015-09-18 21:26:24 +00006042public:
6043 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6044 BigEndian = false;
6045 TLSSupported = false;
6046 IntWidth = 16;
6047 IntAlign = 16;
6048 LongWidth = 32;
6049 LongLongWidth = 64;
6050 LongAlign = LongLongAlign = 16;
6051 PointerWidth = 16;
6052 PointerAlign = 16;
6053 SuitableAlign = 16;
6054 SizeType = UnsignedInt;
6055 IntMaxType = SignedLongLong;
6056 IntPtrType = SignedInt;
6057 PtrDiffType = SignedInt;
6058 SigAtomicType = SignedLong;
6059 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006060 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006061 void getTargetDefines(const LangOptions &Opts,
6062 MacroBuilder &Builder) const override {
6063 Builder.defineMacro("MSP430");
6064 Builder.defineMacro("__MSP430__");
6065 // FIXME: defines for different 'flavours' of MCU
6066 }
6067 void getTargetBuiltins(const Builtin::Info *&Records,
6068 unsigned &NumRecords) const override {
6069 // FIXME: Implement.
6070 Records = nullptr;
6071 NumRecords = 0;
6072 }
6073 bool hasFeature(StringRef Feature) const override {
6074 return Feature == "msp430";
6075 }
6076 void getGCCRegNames(const char *const *&Names,
6077 unsigned &NumNames) const override;
6078 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6079 unsigned &NumAliases) const override {
6080 // No aliases.
6081 Aliases = nullptr;
6082 NumAliases = 0;
6083 }
6084 bool validateAsmConstraint(const char *&Name,
6085 TargetInfo::ConstraintInfo &info) const override {
6086 // FIXME: implement
6087 switch (*Name) {
6088 case 'K': // the constant 1
6089 case 'L': // constant -1^20 .. 1^19
6090 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006091 return true;
6092 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006093 // No target constraints for now.
6094 return false;
6095 }
6096 const char *getClobbers() const override {
6097 // FIXME: Is this really right?
6098 return "";
6099 }
6100 BuiltinVaListKind getBuiltinVaListKind() const override {
6101 // FIXME: implement
6102 return TargetInfo::CharPtrBuiltinVaList;
6103 }
6104};
6105
6106const char *const MSP430TargetInfo::GCCRegNames[] = {
6107 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6108 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6109
6110void MSP430TargetInfo::getGCCRegNames(const char *const *&Names,
6111 unsigned &NumNames) const {
6112 Names = GCCRegNames;
6113 NumNames = llvm::array_lengthof(GCCRegNames);
6114}
6115
6116// LLVM and Clang cannot be used directly to output native binaries for
6117// target, but is used to compile C code to llvm bitcode with correct
6118// type and alignment information.
6119//
6120// TCE uses the llvm bitcode as input and uses it for generating customized
6121// target processor and program binary. TCE co-design environment is
6122// publicly available in http://tce.cs.tut.fi
6123
6124static const unsigned TCEOpenCLAddrSpaceMap[] = {
6125 3, // opencl_global
6126 4, // opencl_local
6127 5, // opencl_constant
6128 // FIXME: generic has to be added to the target
6129 0, // opencl_generic
6130 0, // cuda_device
6131 0, // cuda_constant
6132 0 // cuda_shared
6133};
6134
6135class TCETargetInfo : public TargetInfo {
6136public:
6137 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6138 TLSSupported = false;
6139 IntWidth = 32;
6140 LongWidth = LongLongWidth = 32;
6141 PointerWidth = 32;
6142 IntAlign = 32;
6143 LongAlign = LongLongAlign = 32;
6144 PointerAlign = 32;
6145 SuitableAlign = 32;
6146 SizeType = UnsignedInt;
6147 IntMaxType = SignedLong;
6148 IntPtrType = SignedInt;
6149 PtrDiffType = SignedInt;
6150 FloatWidth = 32;
6151 FloatAlign = 32;
6152 DoubleWidth = 32;
6153 DoubleAlign = 32;
6154 LongDoubleWidth = 32;
6155 LongDoubleAlign = 32;
6156 FloatFormat = &llvm::APFloat::IEEEsingle;
6157 DoubleFormat = &llvm::APFloat::IEEEsingle;
6158 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6159 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6160 "-f64:32-v64:32-v128:32-a:0:32-n32";
6161 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6162 UseAddrSpaceMapMangling = true;
6163 }
6164
6165 void getTargetDefines(const LangOptions &Opts,
6166 MacroBuilder &Builder) const override {
6167 DefineStd(Builder, "tce", Opts);
6168 Builder.defineMacro("__TCE__");
6169 Builder.defineMacro("__TCE_V1__");
6170 }
6171 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6172
6173 void getTargetBuiltins(const Builtin::Info *&Records,
6174 unsigned &NumRecords) const override {}
6175 const char *getClobbers() const override { return ""; }
6176 BuiltinVaListKind getBuiltinVaListKind() const override {
6177 return TargetInfo::VoidPtrBuiltinVaList;
6178 }
6179 void getGCCRegNames(const char *const *&Names,
6180 unsigned &NumNames) const override {}
6181 bool validateAsmConstraint(const char *&Name,
6182 TargetInfo::ConstraintInfo &info) const override {
6183 return true;
6184 }
6185 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6186 unsigned &NumAliases) const override {}
6187};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006188
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006189class BPFTargetInfo : public TargetInfo {
6190public:
6191 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6192 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6193 SizeType = UnsignedLong;
6194 PtrDiffType = SignedLong;
6195 IntPtrType = SignedLong;
6196 IntMaxType = SignedLong;
6197 Int64Type = SignedLong;
6198 RegParmMax = 5;
6199 if (Triple.getArch() == llvm::Triple::bpfeb) {
6200 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006201 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006202 } else {
6203 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006204 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006205 }
6206 MaxAtomicPromoteWidth = 64;
6207 MaxAtomicInlineWidth = 64;
6208 TLSSupported = false;
6209 }
6210 void getTargetDefines(const LangOptions &Opts,
6211 MacroBuilder &Builder) const override {
6212 DefineStd(Builder, "bpf", Opts);
6213 Builder.defineMacro("__BPF__");
6214 }
6215 bool hasFeature(StringRef Feature) const override {
6216 return Feature == "bpf";
6217 }
6218
6219 void getTargetBuiltins(const Builtin::Info *&Records,
6220 unsigned &NumRecords) const override {}
6221 const char *getClobbers() const override {
6222 return "";
6223 }
6224 BuiltinVaListKind getBuiltinVaListKind() const override {
6225 return TargetInfo::VoidPtrBuiltinVaList;
6226 }
6227 void getGCCRegNames(const char * const *&Names,
6228 unsigned &NumNames) const override {
6229 Names = nullptr;
6230 NumNames = 0;
6231 }
6232 bool validateAsmConstraint(const char *&Name,
6233 TargetInfo::ConstraintInfo &info) const override {
6234 return true;
6235 }
6236 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6237 unsigned &NumAliases) const override {
6238 Aliases = nullptr;
6239 NumAliases = 0;
6240 }
6241};
6242
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006243class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006244 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006245
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006246 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006247 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006248 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006249 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006250 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006251 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006252 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006253 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006254 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006255 enum DspRevEnum {
6256 NoDSP, DSP1, DSP2
6257 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006258 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006259
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006260protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006261 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006262 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006263
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006264public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006265 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6266 const std::string &CPUStr)
6267 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006268 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006269 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6270 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6271 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006272
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006273 bool isNaN2008Default() const {
6274 return CPU == "mips32r6" || CPU == "mips64r6";
6275 }
6276
6277 bool isFP64Default() const {
6278 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6279 }
6280
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006281 bool isNan2008() const override {
6282 return IsNan2008;
6283 }
6284
Alp Toker4925ba72014-06-07 23:30:42 +00006285 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006286 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006287 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6288 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006289 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006290 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006291 .Case("mips1", IsMips32)
6292 .Case("mips2", IsMips32)
6293 .Case("mips3", true)
6294 .Case("mips4", true)
6295 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006296 .Case("mips32", IsMips32)
6297 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006298 .Case("mips32r3", IsMips32)
6299 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006300 .Case("mips32r6", IsMips32)
6301 .Case("mips64", true)
6302 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006303 .Case("mips64r3", true)
6304 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006305 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006306 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006307 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006308 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006309 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006310 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006311 bool
6312 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6313 StringRef CPU,
6314 const std::vector<std::string> &FeaturesVec) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006315 if (CPU == "octeon")
6316 Features["mips64r2"] = Features["cnmips"] = true;
6317 else
6318 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006319 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006320 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006321
Craig Topper3164f332014-03-11 03:39:26 +00006322 void getTargetDefines(const LangOptions &Opts,
6323 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006324 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006325 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006326 if (Opts.GNUMode)
6327 Builder.defineMacro("mips");
6328
Simon Atanasyan683535b2012-08-29 19:14:58 +00006329 Builder.defineMacro("__REGISTER_PREFIX__", "");
6330
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006331 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006332 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006333 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006334 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006335 case SoftFloat:
6336 Builder.defineMacro("__mips_soft_float", Twine(1));
6337 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006338 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006339
Simon Atanasyan16071912013-04-14 14:07:30 +00006340 if (IsSingleFloat)
6341 Builder.defineMacro("__mips_single_float", Twine(1));
6342
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006343 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6344 Builder.defineMacro("_MIPS_FPSET",
6345 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6346
Simon Atanasyan72244b62012-07-05 16:06:06 +00006347 if (IsMips16)
6348 Builder.defineMacro("__mips16", Twine(1));
6349
Simon Atanasyan60777612013-04-14 14:07:51 +00006350 if (IsMicromips)
6351 Builder.defineMacro("__mips_micromips", Twine(1));
6352
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006353 if (IsNan2008)
6354 Builder.defineMacro("__mips_nan2008", Twine(1));
6355
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006356 switch (DspRev) {
6357 default:
6358 break;
6359 case DSP1:
6360 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6361 Builder.defineMacro("__mips_dsp", Twine(1));
6362 break;
6363 case DSP2:
6364 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6365 Builder.defineMacro("__mips_dspr2", Twine(1));
6366 Builder.defineMacro("__mips_dsp", Twine(1));
6367 break;
6368 }
6369
Jack Carter44ff1e52013-08-12 17:20:29 +00006370 if (HasMSA)
6371 Builder.defineMacro("__mips_msa", Twine(1));
6372
Simon Atanasyan26f19672012-04-05 19:28:31 +00006373 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6374 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6375 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006376
6377 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6378 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006379 }
6380
Craig Topper3164f332014-03-11 03:39:26 +00006381 void getTargetBuiltins(const Builtin::Info *&Records,
6382 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006383 Records = BuiltinInfo;
6384 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006385 }
Craig Topper3164f332014-03-11 03:39:26 +00006386 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006387 return llvm::StringSwitch<bool>(Feature)
6388 .Case("mips", true)
6389 .Case("fp64", HasFP64)
6390 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006391 }
Craig Topper3164f332014-03-11 03:39:26 +00006392 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006393 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006394 }
Craig Topper3164f332014-03-11 03:39:26 +00006395 void getGCCRegNames(const char * const *&Names,
6396 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006397 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006398 // CPU register names
6399 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006400 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6401 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6402 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006403 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6404 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006405 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6406 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6407 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6408 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006409 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006410 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006411 "$fcc5","$fcc6","$fcc7",
6412 // MSA register names
6413 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6414 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6415 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6416 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6417 // MSA control register names
6418 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6419 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006420 };
6421 Names = GCCRegNames;
6422 NumNames = llvm::array_lengthof(GCCRegNames);
6423 }
Craig Topper3164f332014-03-11 03:39:26 +00006424 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6425 unsigned &NumAliases) const override = 0;
6426 bool validateAsmConstraint(const char *&Name,
6427 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006428 switch (*Name) {
6429 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006430 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006431 case 'r': // CPU registers.
6432 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006433 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006434 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006435 case 'c': // $25 for indirect jumps
6436 case 'l': // lo register
6437 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006438 Info.setAllowsRegister();
6439 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006440 case 'I': // Signed 16-bit constant
6441 case 'J': // Integer 0
6442 case 'K': // Unsigned 16-bit constant
6443 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6444 case 'M': // Constants not loadable via lui, addiu, or ori
6445 case 'N': // Constant -1 to -65535
6446 case 'O': // A signed 15-bit constant
6447 case 'P': // A constant between 1 go 65535
6448 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006449 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006450 Info.setAllowsMemory();
6451 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006452 case 'Z':
6453 if (Name[1] == 'C') { // An address usable by ll, and sc.
6454 Info.setAllowsMemory();
6455 Name++; // Skip over 'Z'.
6456 return true;
6457 }
6458 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006459 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006460 }
6461
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006462 std::string convertConstraint(const char *&Constraint) const override {
6463 std::string R;
6464 switch (*Constraint) {
6465 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6466 if (Constraint[1] == 'C') {
6467 R = std::string("^") + std::string(Constraint, 2);
6468 Constraint++;
6469 return R;
6470 }
6471 break;
6472 }
6473 return TargetInfo::convertConstraint(Constraint);
6474 }
6475
Craig Topper3164f332014-03-11 03:39:26 +00006476 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006477 // In GCC, $1 is not widely used in generated code (it's used only in a few
6478 // specific situations), so there is no real need for users to add it to
6479 // the clobbers list if they want to use it in their inline assembly code.
6480 //
6481 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6482 // code generation, so using it in inline assembly without adding it to the
6483 // clobbers list can cause conflicts between the inline assembly code and
6484 // the surrounding generated code.
6485 //
6486 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6487 // operands, which will conflict with the ".set at" assembler option (which
6488 // we use only for inline assembly, in order to maintain compatibility with
6489 // GCC) and will also conflict with the user's usage of $1.
6490 //
6491 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6492 // register for generated code is to automatically clobber $1 for all inline
6493 // assembly code.
6494 //
6495 // FIXME: We should automatically clobber $1 only for inline assembly code
6496 // which actually uses it. This would allow LLVM to use $1 for inline
6497 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006498 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006499 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006500
Craig Topper3164f332014-03-11 03:39:26 +00006501 bool handleTargetFeatures(std::vector<std::string> &Features,
6502 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006503 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006504 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006505 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006506 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006507 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006508 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006509 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006510
Eric Christopher610fe112015-08-26 08:21:55 +00006511 for (const auto &Feature : Features) {
6512 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006513 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006514 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006515 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006516 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006517 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006518 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006519 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006520 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006521 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006522 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006523 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006524 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006525 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006526 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006527 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006528 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006529 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006530 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006531 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006532 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006533 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006534 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006535
Eric Christopher964a5f32015-08-05 23:48:05 +00006536 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006537
Rafael Espindolaeb265472013-08-21 21:59:03 +00006538 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006539 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006540
Craig Topper3164f332014-03-11 03:39:26 +00006541 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006542 if (RegNo == 0) return 4;
6543 if (RegNo == 1) return 5;
6544 return -1;
6545 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006546
6547 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006548};
6549
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006550const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006551#define BUILTIN(ID, TYPE, ATTRS) \
6552 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6553#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6554 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006555#include "clang/Basic/BuiltinsMips.def"
6556};
6557
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006558class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006559public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006560 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006561 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006562 SizeType = UnsignedInt;
6563 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006564 Int64Type = SignedLongLong;
6565 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006566 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006567 }
Craig Topper3164f332014-03-11 03:39:26 +00006568 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006569 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006570 ABI = Name;
6571 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006572 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006573 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006574 }
Craig Topper3164f332014-03-11 03:39:26 +00006575 void getTargetDefines(const LangOptions &Opts,
6576 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006577 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006578
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006579 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006580 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6581
6582 const std::string& CPUStr = getCPU();
6583 if (CPUStr == "mips32")
6584 Builder.defineMacro("__mips_isa_rev", "1");
6585 else if (CPUStr == "mips32r2")
6586 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006587 else if (CPUStr == "mips32r3")
6588 Builder.defineMacro("__mips_isa_rev", "3");
6589 else if (CPUStr == "mips32r5")
6590 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006591 else if (CPUStr == "mips32r6")
6592 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006593
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006594 if (ABI == "o32") {
6595 Builder.defineMacro("__mips_o32");
6596 Builder.defineMacro("_ABIO32", "1");
6597 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6598 }
6599 else if (ABI == "eabi")
6600 Builder.defineMacro("__mips_eabi");
6601 else
David Blaikie83d382b2011-09-23 05:06:16 +00006602 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006603 }
Craig Topper3164f332014-03-11 03:39:26 +00006604 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6605 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006606 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6607 { { "at" }, "$1" },
6608 { { "v0" }, "$2" },
6609 { { "v1" }, "$3" },
6610 { { "a0" }, "$4" },
6611 { { "a1" }, "$5" },
6612 { { "a2" }, "$6" },
6613 { { "a3" }, "$7" },
6614 { { "t0" }, "$8" },
6615 { { "t1" }, "$9" },
6616 { { "t2" }, "$10" },
6617 { { "t3" }, "$11" },
6618 { { "t4" }, "$12" },
6619 { { "t5" }, "$13" },
6620 { { "t6" }, "$14" },
6621 { { "t7" }, "$15" },
6622 { { "s0" }, "$16" },
6623 { { "s1" }, "$17" },
6624 { { "s2" }, "$18" },
6625 { { "s3" }, "$19" },
6626 { { "s4" }, "$20" },
6627 { { "s5" }, "$21" },
6628 { { "s6" }, "$22" },
6629 { { "s7" }, "$23" },
6630 { { "t8" }, "$24" },
6631 { { "t9" }, "$25" },
6632 { { "k0" }, "$26" },
6633 { { "k1" }, "$27" },
6634 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006635 { { "sp","$sp" }, "$29" },
6636 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006637 { { "ra" }, "$31" }
6638 };
6639 Aliases = GCCRegAliases;
6640 NumAliases = llvm::array_lengthof(GCCRegAliases);
6641 }
6642};
6643
6644class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006645 void setDataLayoutString() override {
6646 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006647 }
6648
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006649public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006650 Mips32EBTargetInfo(const llvm::Triple &Triple)
6651 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006652 }
Craig Topper3164f332014-03-11 03:39:26 +00006653 void getTargetDefines(const LangOptions &Opts,
6654 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006655 DefineStd(Builder, "MIPSEB", Opts);
6656 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006657 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006658 }
6659};
6660
6661class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006662 void setDataLayoutString() override {
6663 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006664 }
6665
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006666public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006667 Mips32ELTargetInfo(const llvm::Triple &Triple)
6668 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006669 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006670 }
Craig Topper3164f332014-03-11 03:39:26 +00006671 void getTargetDefines(const LangOptions &Opts,
6672 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006673 DefineStd(Builder, "MIPSEL", Opts);
6674 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006675 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006676 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006677};
Akira Hatanakabef17452011-09-20 19:21:49 +00006678
6679class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006680public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006681 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006682 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006683 LongDoubleWidth = LongDoubleAlign = 128;
6684 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006685 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6686 LongDoubleWidth = LongDoubleAlign = 64;
6687 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6688 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006689 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006690 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006691 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006692 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006693
6694 void setN64ABITypes() {
6695 LongWidth = LongAlign = 64;
6696 PointerWidth = PointerAlign = 64;
6697 SizeType = UnsignedLong;
6698 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006699 Int64Type = SignedLong;
6700 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006701 }
6702
6703 void setN32ABITypes() {
6704 LongWidth = LongAlign = 32;
6705 PointerWidth = PointerAlign = 32;
6706 SizeType = UnsignedInt;
6707 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006708 Int64Type = SignedLongLong;
6709 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006710 }
6711
Craig Topper3164f332014-03-11 03:39:26 +00006712 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006713 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006714 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006715 ABI = Name;
6716 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006717 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006718 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006719 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006720 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006721 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006722 }
6723 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006724 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006725
Craig Topper3164f332014-03-11 03:39:26 +00006726 void getTargetDefines(const LangOptions &Opts,
6727 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006728 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006729
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006730 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006731 Builder.defineMacro("__mips64");
6732 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006733 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6734
6735 const std::string& CPUStr = getCPU();
6736 if (CPUStr == "mips64")
6737 Builder.defineMacro("__mips_isa_rev", "1");
6738 else if (CPUStr == "mips64r2")
6739 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006740 else if (CPUStr == "mips64r3")
6741 Builder.defineMacro("__mips_isa_rev", "3");
6742 else if (CPUStr == "mips64r5")
6743 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006744 else if (CPUStr == "mips64r6")
6745 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006746
Akira Hatanakabef17452011-09-20 19:21:49 +00006747 if (ABI == "n32") {
6748 Builder.defineMacro("__mips_n32");
6749 Builder.defineMacro("_ABIN32", "2");
6750 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6751 }
6752 else if (ABI == "n64") {
6753 Builder.defineMacro("__mips_n64");
6754 Builder.defineMacro("_ABI64", "3");
6755 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6756 }
6757 else
David Blaikie83d382b2011-09-23 05:06:16 +00006758 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006759 }
Craig Topper3164f332014-03-11 03:39:26 +00006760 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6761 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006762 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6763 { { "at" }, "$1" },
6764 { { "v0" }, "$2" },
6765 { { "v1" }, "$3" },
6766 { { "a0" }, "$4" },
6767 { { "a1" }, "$5" },
6768 { { "a2" }, "$6" },
6769 { { "a3" }, "$7" },
6770 { { "a4" }, "$8" },
6771 { { "a5" }, "$9" },
6772 { { "a6" }, "$10" },
6773 { { "a7" }, "$11" },
6774 { { "t0" }, "$12" },
6775 { { "t1" }, "$13" },
6776 { { "t2" }, "$14" },
6777 { { "t3" }, "$15" },
6778 { { "s0" }, "$16" },
6779 { { "s1" }, "$17" },
6780 { { "s2" }, "$18" },
6781 { { "s3" }, "$19" },
6782 { { "s4" }, "$20" },
6783 { { "s5" }, "$21" },
6784 { { "s6" }, "$22" },
6785 { { "s7" }, "$23" },
6786 { { "t8" }, "$24" },
6787 { { "t9" }, "$25" },
6788 { { "k0" }, "$26" },
6789 { { "k1" }, "$27" },
6790 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006791 { { "sp","$sp" }, "$29" },
6792 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006793 { { "ra" }, "$31" }
6794 };
6795 Aliases = GCCRegAliases;
6796 NumAliases = llvm::array_lengthof(GCCRegAliases);
6797 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006798
6799 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006800};
6801
6802class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006803 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006804 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006805 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 +00006806 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006807 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006808
Akira Hatanakabef17452011-09-20 19:21:49 +00006809 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006810
Akira Hatanakabef17452011-09-20 19:21:49 +00006811public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006812 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006813 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006814 void getTargetDefines(const LangOptions &Opts,
6815 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006816 DefineStd(Builder, "MIPSEB", Opts);
6817 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006818 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006819 }
6820};
6821
6822class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006823 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006824 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006825 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 +00006826 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006827 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006828 }
6829public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006830 Mips64ELTargetInfo(const llvm::Triple &Triple)
6831 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006832 // Default ABI is n64.
6833 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006834 }
Craig Topper3164f332014-03-11 03:39:26 +00006835 void getTargetDefines(const LangOptions &Opts,
6836 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006837 DefineStd(Builder, "MIPSEL", Opts);
6838 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006839 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006840 }
6841};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006842
Ivan Krasindd7403e2011-08-24 20:22:22 +00006843class PNaClTargetInfo : public TargetInfo {
6844public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006845 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006846 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006847 this->UserLabelPrefix = "";
6848 this->LongAlign = 32;
6849 this->LongWidth = 32;
6850 this->PointerAlign = 32;
6851 this->PointerWidth = 32;
6852 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006853 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006854 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006855 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006856 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006857 this->SizeType = TargetInfo::UnsignedInt;
6858 this->PtrDiffType = TargetInfo::SignedInt;
6859 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006860 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006861 }
6862
Craig Toppere6f17d02014-03-11 04:07:52 +00006863 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006864 Builder.defineMacro("__le32__");
6865 Builder.defineMacro("__pnacl__");
6866 }
Craig Topper3164f332014-03-11 03:39:26 +00006867 void getTargetDefines(const LangOptions &Opts,
6868 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006869 getArchDefines(Opts, Builder);
6870 }
Craig Topper3164f332014-03-11 03:39:26 +00006871 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006872 return Feature == "pnacl";
6873 }
Craig Topper3164f332014-03-11 03:39:26 +00006874 void getTargetBuiltins(const Builtin::Info *&Records,
6875 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006876 }
Craig Topper3164f332014-03-11 03:39:26 +00006877 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006878 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006879 }
Craig Topper3164f332014-03-11 03:39:26 +00006880 void getGCCRegNames(const char * const *&Names,
6881 unsigned &NumNames) const override;
6882 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6883 unsigned &NumAliases) const override;
6884 bool validateAsmConstraint(const char *&Name,
6885 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006886 return false;
6887 }
6888
Craig Topper3164f332014-03-11 03:39:26 +00006889 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006890 return "";
6891 }
6892};
6893
6894void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6895 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006896 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006897 NumNames = 0;
6898}
6899
6900void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6901 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006902 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006903 NumAliases = 0;
6904}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006905
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006906// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6907class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6908public:
6909 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00006910 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006911 }
6912
6913 BuiltinVaListKind getBuiltinVaListKind() const override {
6914 return TargetInfo::PNaClABIBuiltinVaList;
6915 }
6916};
6917
JF Bastien643817d2014-09-12 17:52:47 +00006918class Le64TargetInfo : public TargetInfo {
6919 static const Builtin::Info BuiltinInfo[];
6920
6921public:
6922 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6923 BigEndian = false;
6924 NoAsmVariants = true;
6925 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6926 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006927 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006928 }
6929
6930 void getTargetDefines(const LangOptions &Opts,
6931 MacroBuilder &Builder) const override {
6932 DefineStd(Builder, "unix", Opts);
6933 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6934 Builder.defineMacro("__ELF__");
6935 }
6936 void getTargetBuiltins(const Builtin::Info *&Records,
6937 unsigned &NumRecords) const override {
6938 Records = BuiltinInfo;
6939 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6940 }
6941 BuiltinVaListKind getBuiltinVaListKind() const override {
6942 return TargetInfo::PNaClABIBuiltinVaList;
6943 }
6944 const char *getClobbers() const override { return ""; }
6945 void getGCCRegNames(const char *const *&Names,
6946 unsigned &NumNames) const override {
6947 Names = nullptr;
6948 NumNames = 0;
6949 }
6950 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6951 unsigned &NumAliases) const override {
6952 Aliases = nullptr;
6953 NumAliases = 0;
6954 }
6955 bool validateAsmConstraint(const char *&Name,
6956 TargetInfo::ConstraintInfo &Info) const override {
6957 return false;
6958 }
6959
6960 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006961};
Dan Gohmanc2853072015-09-03 22:51:53 +00006962
6963class WebAssemblyTargetInfo : public TargetInfo {
6964 static const Builtin::Info BuiltinInfo[];
6965
6966 enum SIMDEnum {
6967 NoSIMD,
6968 SIMD128,
6969 } SIMDLevel;
6970
6971public:
6972 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
6973 : TargetInfo(T), SIMDLevel(NoSIMD) {
6974 BigEndian = false;
6975 NoAsmVariants = true;
6976 SuitableAlign = 128;
6977 LargeArrayMinWidth = 128;
6978 LargeArrayAlign = 128;
6979 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00006980 SigAtomicType = SignedLong;
Dan Gohmanc2853072015-09-03 22:51:53 +00006981 }
6982
6983protected:
6984 void getTargetDefines(const LangOptions &Opts,
6985 MacroBuilder &Builder) const override {
6986 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
6987 if (SIMDLevel >= SIMD128)
6988 Builder.defineMacro("__wasm_simd128__");
6989 }
6990
6991private:
Eric Christopher8c47b422015-10-09 18:39:55 +00006992 bool
6993 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6994 StringRef CPU,
6995 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00006996 if (CPU == "bleeding-edge")
6997 Features["simd128"] = true;
6998 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6999 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007000 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007001 return llvm::StringSwitch<bool>(Feature)
7002 .Case("simd128", SIMDLevel >= SIMD128)
7003 .Default(false);
7004 }
7005 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007006 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007007 for (const auto &Feature : Features) {
7008 if (Feature == "+simd128") {
7009 SIMDLevel = std::max(SIMDLevel, SIMD128);
7010 continue;
7011 }
7012 if (Feature == "-simd128") {
7013 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7014 continue;
7015 }
7016
7017 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7018 << "-target-feature";
7019 return false;
7020 }
7021 return true;
7022 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007023 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007024 return llvm::StringSwitch<bool>(Name)
7025 .Case("mvp", true)
7026 .Case("bleeding-edge", true)
7027 .Case("generic", true)
7028 .Default(false);
7029 }
7030 void getTargetBuiltins(const Builtin::Info *&Records,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007031 unsigned &NumRecords) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007032 Records = BuiltinInfo;
7033 NumRecords = clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin;
7034 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007035 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007036 // TODO: Implement va_list properly.
7037 return VoidPtrBuiltinVaList;
7038 }
7039 void getGCCRegNames(const char *const *&Names,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007040 unsigned &NumNames) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007041 Names = nullptr;
7042 NumNames = 0;
7043 }
7044 void getGCCRegAliases(const GCCRegAlias *&Aliases,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007045 unsigned &NumAliases) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007046 Aliases = nullptr;
7047 NumAliases = 0;
7048 }
7049 bool
7050 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007051 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007052 return false;
7053 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007054 const char *getClobbers() const final { return ""; }
7055 bool isCLZForZeroUndef() const final { return false; }
7056 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007057 IntType getIntTypeByWidth(unsigned BitWidth,
7058 bool IsSigned) const final {
7059 // WebAssembly prefers long long for explicitly 64-bit integers.
7060 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7061 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7062 }
7063 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7064 bool IsSigned) const final {
7065 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7066 return BitWidth == 64
7067 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7068 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7069 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007070};
7071
7072const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7073#define BUILTIN(ID, TYPE, ATTRS) \
7074 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7075#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7076 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7077#include "clang/Basic/BuiltinsWebAssembly.def"
7078};
7079
7080class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7081public:
7082 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7083 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007084 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohmanc2853072015-09-03 22:51:53 +00007085 DataLayoutString = "e-p:32:32-i64:64-n32:64-S128";
7086 }
7087
7088protected:
7089 void getTargetDefines(const LangOptions &Opts,
7090 MacroBuilder &Builder) const override {
7091 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7092 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7093 }
7094};
7095
7096class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7097public:
7098 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7099 : WebAssemblyTargetInfo(T) {
7100 LongAlign = LongWidth = 64;
7101 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007102 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohmanc2853072015-09-03 22:51:53 +00007103 DataLayoutString = "e-p:64:64-i64:64-n32:64-S128";
7104 }
7105
7106protected:
7107 void getTargetDefines(const LangOptions &Opts,
7108 MacroBuilder &Builder) const override {
7109 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7110 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7111 }
7112};
7113
JF Bastien643817d2014-09-12 17:52:47 +00007114const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7115#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007116 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007117#include "clang/Basic/BuiltinsLe64.def"
7118};
7119
Eric Christopherc48497a2015-09-18 21:26:24 +00007120static const unsigned SPIRAddrSpaceMap[] = {
7121 1, // opencl_global
7122 3, // opencl_local
7123 2, // opencl_constant
7124 4, // opencl_generic
7125 0, // cuda_device
7126 0, // cuda_constant
7127 0 // cuda_shared
7128};
7129class SPIRTargetInfo : public TargetInfo {
7130public:
7131 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7132 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7133 "SPIR target must use unknown OS");
7134 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7135 "SPIR target must use unknown environment type");
7136 BigEndian = false;
7137 TLSSupported = false;
7138 LongWidth = LongAlign = 64;
7139 AddrSpaceMap = &SPIRAddrSpaceMap;
7140 UseAddrSpaceMapMangling = true;
7141 // Define available target features
7142 // These must be defined in sorted order!
7143 NoAsmVariants = true;
7144 }
7145 void getTargetDefines(const LangOptions &Opts,
7146 MacroBuilder &Builder) const override {
7147 DefineStd(Builder, "SPIR", Opts);
7148 }
7149 bool hasFeature(StringRef Feature) const override {
7150 return Feature == "spir";
7151 }
Craig Topper3164f332014-03-11 03:39:26 +00007152
Eric Christopherc48497a2015-09-18 21:26:24 +00007153 void getTargetBuiltins(const Builtin::Info *&Records,
7154 unsigned &NumRecords) const override {}
7155 const char *getClobbers() const override { return ""; }
7156 void getGCCRegNames(const char *const *&Names,
7157 unsigned &NumNames) const override {}
7158 bool validateAsmConstraint(const char *&Name,
7159 TargetInfo::ConstraintInfo &info) const override {
7160 return true;
7161 }
7162 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7163 unsigned &NumAliases) const override {}
7164 BuiltinVaListKind getBuiltinVaListKind() const override {
7165 return TargetInfo::VoidPtrBuiltinVaList;
7166 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007167
Eric Christopherc48497a2015-09-18 21:26:24 +00007168 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7169 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7170 : CCCR_Warning;
7171 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007172
Eric Christopherc48497a2015-09-18 21:26:24 +00007173 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7174 return CC_SpirFunction;
7175 }
7176};
Guy Benyeib798fc92012-12-11 21:38:14 +00007177
Eric Christopherc48497a2015-09-18 21:26:24 +00007178class SPIR32TargetInfo : public SPIRTargetInfo {
7179public:
7180 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7181 PointerWidth = PointerAlign = 32;
7182 SizeType = TargetInfo::UnsignedInt;
7183 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7184 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7185 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7186 }
7187 void getTargetDefines(const LangOptions &Opts,
7188 MacroBuilder &Builder) const override {
7189 DefineStd(Builder, "SPIR32", Opts);
7190 }
7191};
Guy Benyeib798fc92012-12-11 21:38:14 +00007192
Eric Christopherc48497a2015-09-18 21:26:24 +00007193class SPIR64TargetInfo : public SPIRTargetInfo {
7194public:
7195 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7196 PointerWidth = PointerAlign = 64;
7197 SizeType = TargetInfo::UnsignedLong;
7198 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7199 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7200 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7201 }
7202 void getTargetDefines(const LangOptions &Opts,
7203 MacroBuilder &Builder) const override {
7204 DefineStd(Builder, "SPIR64", Opts);
7205 }
7206};
Guy Benyeib798fc92012-12-11 21:38:14 +00007207
Robert Lytton0e076492013-08-13 09:43:10 +00007208class XCoreTargetInfo : public TargetInfo {
7209 static const Builtin::Info BuiltinInfo[];
7210public:
7211 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7212 BigEndian = false;
7213 NoAsmVariants = true;
7214 LongLongAlign = 32;
7215 SuitableAlign = 32;
7216 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007217 SizeType = UnsignedInt;
7218 PtrDiffType = SignedInt;
7219 IntPtrType = SignedInt;
7220 WCharType = UnsignedChar;
7221 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007222 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007223 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7224 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007225 }
Craig Topper3164f332014-03-11 03:39:26 +00007226 void getTargetDefines(const LangOptions &Opts,
7227 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007228 Builder.defineMacro("__XS1B__");
7229 }
Craig Topper3164f332014-03-11 03:39:26 +00007230 void getTargetBuiltins(const Builtin::Info *&Records,
7231 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007232 Records = BuiltinInfo;
7233 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
7234 }
Craig Topper3164f332014-03-11 03:39:26 +00007235 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007236 return TargetInfo::VoidPtrBuiltinVaList;
7237 }
Craig Topper3164f332014-03-11 03:39:26 +00007238 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007239 return "";
7240 }
Craig Topper3164f332014-03-11 03:39:26 +00007241 void getGCCRegNames(const char * const *&Names,
7242 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007243 static const char * const GCCRegNames[] = {
7244 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7245 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7246 };
7247 Names = GCCRegNames;
7248 NumNames = llvm::array_lengthof(GCCRegNames);
7249 }
Craig Topper3164f332014-03-11 03:39:26 +00007250 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7251 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00007252 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00007253 NumAliases = 0;
7254 }
Craig Topper3164f332014-03-11 03:39:26 +00007255 bool validateAsmConstraint(const char *&Name,
7256 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007257 return false;
7258 }
Craig Topper3164f332014-03-11 03:39:26 +00007259 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007260 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7261 return (RegNo < 2)? RegNo : -1;
7262 }
Robert Lytton0e076492013-08-13 09:43:10 +00007263};
7264
7265const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007266#define BUILTIN(ID, TYPE, ATTRS) \
7267 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7268#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7269 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007270#include "clang/Basic/BuiltinsXCore.def"
7271};
Robert Lytton0e076492013-08-13 09:43:10 +00007272
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007273// x86_32 Android target
7274class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7275public:
7276 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7277 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7278 SuitableAlign = 32;
7279 LongDoubleWidth = 64;
7280 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7281 }
7282};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007283
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007284// x86_64 Android target
7285class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7286public:
7287 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7288 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7289 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7290 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007291
7292 bool useFloat128ManglingForLongDouble() const override {
7293 return true;
7294 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007295};
7296} // end anonymous namespace
7297
Chris Lattner5ba61f02006-10-14 07:39:34 +00007298//===----------------------------------------------------------------------===//
7299// Driver code
7300//===----------------------------------------------------------------------===//
7301
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007302static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007303 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007304
Daniel Dunbar52322032009-08-18 05:47:58 +00007305 switch (Triple.getArch()) {
7306 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007307 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007308
Tim Northover2a0783d2014-05-30 14:14:07 +00007309 case llvm::Triple::xcore:
7310 return new XCoreTargetInfo(Triple);
7311
7312 case llvm::Triple::hexagon:
7313 return new HexagonTargetInfo(Triple);
7314
7315 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007316 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007317 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007318
7319 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007320 case llvm::Triple::FreeBSD:
7321 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007322 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007323 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007324 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007325 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007326 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007327 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007328 }
7329
Christian Pirker9b019ae2014-02-25 13:51:00 +00007330 case llvm::Triple::aarch64_be:
7331 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007332 case llvm::Triple::FreeBSD:
7333 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007334 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007335 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007336 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007337 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007338 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007339 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007340 }
7341
Daniel Dunbar52322032009-08-18 05:47:58 +00007342 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007343 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007344 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007345 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007346
Daniel Dunbar52322032009-08-18 05:47:58 +00007347 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007348 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007349 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007350 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007351 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007352 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007353 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007354 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007355 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007356 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007357 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007358 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007359 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007360 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007361 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007362 case llvm::Triple::Win32:
7363 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007364 case llvm::Triple::Cygnus:
7365 return new CygwinARMTargetInfo(Triple);
7366 case llvm::Triple::GNU:
7367 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007368 case llvm::Triple::Itanium:
7369 return new ItaniumWindowsARMleTargetInfo(Triple);
7370 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007371 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007372 return new MicrosoftARMleTargetInfo(Triple);
7373 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007374 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007375 return new ARMleTargetInfo(Triple);
7376 }
7377
7378 case llvm::Triple::armeb:
7379 case llvm::Triple::thumbeb:
7380 if (Triple.isOSDarwin())
7381 return new DarwinARMTargetInfo(Triple);
7382
7383 switch (os) {
7384 case llvm::Triple::Linux:
7385 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7386 case llvm::Triple::FreeBSD:
7387 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7388 case llvm::Triple::NetBSD:
7389 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7390 case llvm::Triple::OpenBSD:
7391 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7392 case llvm::Triple::Bitrig:
7393 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7394 case llvm::Triple::RTEMS:
7395 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7396 case llvm::Triple::NaCl:
7397 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7398 default:
7399 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007400 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007401
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007402 case llvm::Triple::bpfeb:
7403 case llvm::Triple::bpfel:
7404 return new BPFTargetInfo(Triple);
7405
Daniel Dunbar52322032009-08-18 05:47:58 +00007406 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007407 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007408
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007409 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007410 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007411 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007412 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007413 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007414 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007415 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007416 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007417 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007418 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007419 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007420 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007421 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007422
7423 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007424 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007425 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007426 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007427 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007428 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007429 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007430 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007431 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007432 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007433 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007434 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007435 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007436 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007437 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007438
Akira Hatanakabef17452011-09-20 19:21:49 +00007439 case llvm::Triple::mips64:
7440 switch (os) {
7441 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007442 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007443 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007444 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007445 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007446 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007447 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007448 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007449 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007450 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007451 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007452 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007453 }
7454
7455 case llvm::Triple::mips64el:
7456 switch (os) {
7457 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007458 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007459 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007460 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007461 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007462 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007463 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007464 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007465 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007466 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007467 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007468 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007469 }
7470
Ivan Krasindd7403e2011-08-24 20:22:22 +00007471 case llvm::Triple::le32:
7472 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007473 case llvm::Triple::NaCl:
7474 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7475 default:
7476 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007477 }
7478
JF Bastien643817d2014-09-12 17:52:47 +00007479 case llvm::Triple::le64:
7480 return new Le64TargetInfo(Triple);
7481
Daniel Dunbar52322032009-08-18 05:47:58 +00007482 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007483 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007484 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007485 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007486 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007487 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007488 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007489 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007490 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007491 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007492 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007493 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007494 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007495 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007496 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007497 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007498 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007499
7500 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007501 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007502 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007503 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007504 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007505 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007506 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007507 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007508 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007509 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007510 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007511 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007512 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007513 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007514 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007515
Bill Schmidt778d3872013-07-26 01:36:11 +00007516 case llvm::Triple::ppc64le:
7517 switch (os) {
7518 case llvm::Triple::Linux:
7519 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007520 case llvm::Triple::NetBSD:
7521 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007522 default:
7523 return new PPC64TargetInfo(Triple);
7524 }
7525
Peter Collingbournec947aae2012-05-20 23:28:41 +00007526 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007527 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007528 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007529 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007530
Tom Stellardd8e38a32015-01-06 20:34:47 +00007531 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007532 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007533 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007534
Daniel Dunbar52322032009-08-18 05:47:58 +00007535 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007536 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007537 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007538 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007539 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007540 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007541 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007542 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007543 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007544 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007545 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007546 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007547 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007548 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007549 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007550
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007551 // The 'sparcel' architecture copies all the above cases except for Solaris.
7552 case llvm::Triple::sparcel:
7553 switch (os) {
7554 case llvm::Triple::Linux:
7555 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7556 case llvm::Triple::NetBSD:
7557 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7558 case llvm::Triple::OpenBSD:
7559 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7560 case llvm::Triple::RTEMS:
7561 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7562 default:
7563 return new SparcV8elTargetInfo(Triple);
7564 }
7565
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007566 case llvm::Triple::sparcv9:
7567 switch (os) {
7568 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007569 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007570 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007571 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007572 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007573 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007574 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007575 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007576 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007577 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007578 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007579 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007580 }
7581
Ulrich Weigand47445072013-05-06 16:26:41 +00007582 case llvm::Triple::systemz:
7583 switch (os) {
7584 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007585 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007586 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007587 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007588 }
7589
Eli Friedmana9c3d712009-08-19 20:47:07 +00007590 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007591 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007592
Daniel Dunbar52322032009-08-18 05:47:58 +00007593 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007594 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007595 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007596
Daniel Dunbar52322032009-08-18 05:47:58 +00007597 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007598 case llvm::Triple::CloudABI:
7599 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007600 case llvm::Triple::Linux: {
7601 switch (Triple.getEnvironment()) {
7602 default:
7603 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7604 case llvm::Triple::Android:
7605 return new AndroidX86_32TargetInfo(Triple);
7606 }
7607 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007608 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007609 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007610 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007611 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007612 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007613 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007614 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007615 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007616 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007617 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007618 case llvm::Triple::KFreeBSD:
7619 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007620 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007621 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007622 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007623 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007624 case llvm::Triple::Win32: {
7625 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007626 case llvm::Triple::Cygnus:
7627 return new CygwinX86_32TargetInfo(Triple);
7628 case llvm::Triple::GNU:
7629 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007630 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007631 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007632 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007633 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007634 }
7635 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007636 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007637 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007638 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007639 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007640 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007641 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007642 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007643 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007644 }
7645
7646 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007647 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007648 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007649
Daniel Dunbar52322032009-08-18 05:47:58 +00007650 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007651 case llvm::Triple::CloudABI:
7652 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007653 case llvm::Triple::Linux: {
7654 switch (Triple.getEnvironment()) {
7655 default:
7656 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7657 case llvm::Triple::Android:
7658 return new AndroidX86_64TargetInfo(Triple);
7659 }
7660 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007661 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007662 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007663 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007664 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007665 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007666 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007667 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007668 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007669 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007670 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007671 case llvm::Triple::KFreeBSD:
7672 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007673 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007674 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007675 case llvm::Triple::Win32: {
7676 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007677 case llvm::Triple::Cygnus:
7678 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007679 case llvm::Triple::GNU:
7680 return new MinGWX86_64TargetInfo(Triple);
7681 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007682 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007683 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007684 }
7685 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007686 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007687 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007688 case llvm::Triple::PS4:
7689 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007690 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007691 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007692 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007693
Douglas Katzman78d7c542015-05-12 21:18:10 +00007694 case llvm::Triple::spir: {
7695 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7696 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7697 return nullptr;
7698 return new SPIR32TargetInfo(Triple);
7699 }
7700 case llvm::Triple::spir64: {
7701 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7702 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7703 return nullptr;
7704 return new SPIR64TargetInfo(Triple);
7705 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007706 case llvm::Triple::wasm32:
7707 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7708 return nullptr;
7709 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7710 case llvm::Triple::wasm64:
7711 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7712 return nullptr;
7713 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007714 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007715}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007716
7717/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007718/// options.
Alp Toker80758082014-07-06 05:26:44 +00007719TargetInfo *
7720TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7721 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007722 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007723
7724 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007725 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007726 if (!Target) {
7727 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007728 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007729 }
Alp Toker80758082014-07-06 05:26:44 +00007730 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007731
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007732 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007733 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7734 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007735 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007736 }
7737
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007738 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007739 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7740 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007741 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007742 }
7743
Rafael Espindolaeb265472013-08-21 21:59:03 +00007744 // Set the fp math unit.
7745 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7746 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007747 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007748 }
7749
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007750 // Compute the default target features, we need the target to handle this
7751 // because features may have dependencies on one another.
7752 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00007753 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
7754 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00007755 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007756
7757 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007758 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007759 for (const auto &F : Features)
7760 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7761
Eric Christopher3ff21b32013-10-16 21:26:26 +00007762 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007763 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007764
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007765 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007766}