blob: 8ffb87f69932186a1f6d8190d4ee319692e550ae [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
Chris Lattner96e43572009-03-02 22:40:39 +00002063 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00002064 enum MMX3DNowEnum {
2065 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
2066 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002067 enum XOPEnum {
2068 NoXOP,
2069 SSE4A,
2070 FMA4,
2071 XOP
2072 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00002073
Eric Christophere1ddaf92010-04-02 23:50:19 +00002074 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00002075 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00002076 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00002077 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00002078 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00002079 bool HasBMI;
2080 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00002081 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00002082 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00002083 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00002084 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00002085 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002086 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00002087 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00002088 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00002089 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
2090 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00002091 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002092 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002093
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002094 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2095 ///
2096 /// Each enumeration represents a particular CPU supported by Clang. These
2097 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2098 enum CPUKind {
2099 CK_Generic,
2100
2101 /// \name i386
2102 /// i386-generation processors.
2103 //@{
2104 CK_i386,
2105 //@}
2106
2107 /// \name i486
2108 /// i486-generation processors.
2109 //@{
2110 CK_i486,
2111 CK_WinChipC6,
2112 CK_WinChip2,
2113 CK_C3,
2114 //@}
2115
2116 /// \name i586
2117 /// i586-generation processors, P5 microarchitecture based.
2118 //@{
2119 CK_i586,
2120 CK_Pentium,
2121 CK_PentiumMMX,
2122 //@}
2123
2124 /// \name i686
2125 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2126 //@{
2127 CK_i686,
2128 CK_PentiumPro,
2129 CK_Pentium2,
2130 CK_Pentium3,
2131 CK_Pentium3M,
2132 CK_PentiumM,
2133 CK_C3_2,
2134
2135 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2136 /// Clang however has some logic to suport this.
2137 // FIXME: Warn, deprecate, and potentially remove this.
2138 CK_Yonah,
2139 //@}
2140
2141 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002142 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002143 //@{
2144 CK_Pentium4,
2145 CK_Pentium4M,
2146 CK_Prescott,
2147 CK_Nocona,
2148 //@}
2149
2150 /// \name Core
2151 /// Core microarchitecture based processors.
2152 //@{
2153 CK_Core2,
2154
2155 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2156 /// codename which GCC no longer accepts as an option to -march, but Clang
2157 /// has some logic for recognizing it.
2158 // FIXME: Warn, deprecate, and potentially remove this.
2159 CK_Penryn,
2160 //@}
2161
2162 /// \name Atom
2163 /// Atom processors
2164 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002165 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002166 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002167 //@}
2168
2169 /// \name Nehalem
2170 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002171 CK_Nehalem,
2172
2173 /// \name Westmere
2174 /// Westmere microarchitecture based processors.
2175 CK_Westmere,
2176
2177 /// \name Sandy Bridge
2178 /// Sandy Bridge microarchitecture based processors.
2179 CK_SandyBridge,
2180
2181 /// \name Ivy Bridge
2182 /// Ivy Bridge microarchitecture based processors.
2183 CK_IvyBridge,
2184
2185 /// \name Haswell
2186 /// Haswell microarchitecture based processors.
2187 CK_Haswell,
2188
2189 /// \name Broadwell
2190 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002191 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002192
2193 /// \name Skylake
2194 /// Skylake microarchitecture based processors.
2195 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002196
Craig Topper449314e2013-08-20 07:09:39 +00002197 /// \name Knights Landing
2198 /// Knights Landing processor.
2199 CK_KNL,
2200
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002201 /// \name K6
2202 /// K6 architecture processors.
2203 //@{
2204 CK_K6,
2205 CK_K6_2,
2206 CK_K6_3,
2207 //@}
2208
2209 /// \name K7
2210 /// K7 architecture processors.
2211 //@{
2212 CK_Athlon,
2213 CK_AthlonThunderbird,
2214 CK_Athlon4,
2215 CK_AthlonXP,
2216 CK_AthlonMP,
2217 //@}
2218
2219 /// \name K8
2220 /// K8 architecture processors.
2221 //@{
2222 CK_Athlon64,
2223 CK_Athlon64SSE3,
2224 CK_AthlonFX,
2225 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002226 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002227 CK_Opteron,
2228 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002229 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002230 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002231
Benjamin Kramer569f2152012-01-10 11:50:18 +00002232 /// \name Bobcat
2233 /// Bobcat architecture processors.
2234 //@{
2235 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002236 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002237 //@}
2238
2239 /// \name Bulldozer
2240 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002241 //@{
2242 CK_BDVER1,
2243 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002244 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002245 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002246 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002247
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002248 /// This specification is deprecated and will be removed in the future.
2249 /// Users should prefer \see CK_K8.
2250 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002251 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002252 CK_x86_64,
2253 //@}
2254
2255 /// \name Geode
2256 /// Geode processors.
2257 //@{
2258 CK_Geode
2259 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002260 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002261
Eric Christopherc50738f2015-08-27 00:05:50 +00002262 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002263 return llvm::StringSwitch<CPUKind>(CPU)
2264 .Case("i386", CK_i386)
2265 .Case("i486", CK_i486)
2266 .Case("winchip-c6", CK_WinChipC6)
2267 .Case("winchip2", CK_WinChip2)
2268 .Case("c3", CK_C3)
2269 .Case("i586", CK_i586)
2270 .Case("pentium", CK_Pentium)
2271 .Case("pentium-mmx", CK_PentiumMMX)
2272 .Case("i686", CK_i686)
2273 .Case("pentiumpro", CK_PentiumPro)
2274 .Case("pentium2", CK_Pentium2)
2275 .Case("pentium3", CK_Pentium3)
2276 .Case("pentium3m", CK_Pentium3M)
2277 .Case("pentium-m", CK_PentiumM)
2278 .Case("c3-2", CK_C3_2)
2279 .Case("yonah", CK_Yonah)
2280 .Case("pentium4", CK_Pentium4)
2281 .Case("pentium4m", CK_Pentium4M)
2282 .Case("prescott", CK_Prescott)
2283 .Case("nocona", CK_Nocona)
2284 .Case("core2", CK_Core2)
2285 .Case("penryn", CK_Penryn)
2286 .Case("bonnell", CK_Bonnell)
2287 .Case("atom", CK_Bonnell) // Legacy name.
2288 .Case("silvermont", CK_Silvermont)
2289 .Case("slm", CK_Silvermont) // Legacy name.
2290 .Case("nehalem", CK_Nehalem)
2291 .Case("corei7", CK_Nehalem) // Legacy name.
2292 .Case("westmere", CK_Westmere)
2293 .Case("sandybridge", CK_SandyBridge)
2294 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2295 .Case("ivybridge", CK_IvyBridge)
2296 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2297 .Case("haswell", CK_Haswell)
2298 .Case("core-avx2", CK_Haswell) // Legacy name.
2299 .Case("broadwell", CK_Broadwell)
2300 .Case("skylake", CK_Skylake)
2301 .Case("skx", CK_Skylake) // Legacy name.
2302 .Case("knl", CK_KNL)
2303 .Case("k6", CK_K6)
2304 .Case("k6-2", CK_K6_2)
2305 .Case("k6-3", CK_K6_3)
2306 .Case("athlon", CK_Athlon)
2307 .Case("athlon-tbird", CK_AthlonThunderbird)
2308 .Case("athlon-4", CK_Athlon4)
2309 .Case("athlon-xp", CK_AthlonXP)
2310 .Case("athlon-mp", CK_AthlonMP)
2311 .Case("athlon64", CK_Athlon64)
2312 .Case("athlon64-sse3", CK_Athlon64SSE3)
2313 .Case("athlon-fx", CK_AthlonFX)
2314 .Case("k8", CK_K8)
2315 .Case("k8-sse3", CK_K8SSE3)
2316 .Case("opteron", CK_Opteron)
2317 .Case("opteron-sse3", CK_OpteronSSE3)
2318 .Case("barcelona", CK_AMDFAM10)
2319 .Case("amdfam10", CK_AMDFAM10)
2320 .Case("btver1", CK_BTVER1)
2321 .Case("btver2", CK_BTVER2)
2322 .Case("bdver1", CK_BDVER1)
2323 .Case("bdver2", CK_BDVER2)
2324 .Case("bdver3", CK_BDVER3)
2325 .Case("bdver4", CK_BDVER4)
2326 .Case("x86-64", CK_x86_64)
2327 .Case("geode", CK_Geode)
2328 .Default(CK_Generic);
2329 }
2330
Rafael Espindolaeb265472013-08-21 21:59:03 +00002331 enum FPMathKind {
2332 FP_Default,
2333 FP_SSE,
2334 FP_387
2335 } FPMath;
2336
Eli Friedman3fd920a2008-08-20 02:34:37 +00002337public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002338 X86TargetInfo(const llvm::Triple &Triple)
2339 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002340 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002341 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2342 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2343 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2344 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2345 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2346 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002347 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002348 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002349 }
Craig Topper3164f332014-03-11 03:39:26 +00002350 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002351 // X87 evaluates with 80 bits "long double" precision.
2352 return SSELevel == NoSSE ? 2 : 0;
2353 }
Craig Topper3164f332014-03-11 03:39:26 +00002354 void getTargetBuiltins(const Builtin::Info *&Records,
2355 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002356 Records = BuiltinInfo;
2357 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002358 }
Craig Topper3164f332014-03-11 03:39:26 +00002359 void getGCCRegNames(const char * const *&Names,
2360 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002361 Names = GCCRegNames;
2362 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002363 }
Craig Topper3164f332014-03-11 03:39:26 +00002364 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2365 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002366 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002367 NumAliases = 0;
2368 }
Craig Topper3164f332014-03-11 03:39:26 +00002369 void getGCCAddlRegNames(const AddlRegName *&Names,
2370 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002371 Names = AddlRegNames;
2372 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002373 }
Eric Christopherd9832702015-06-29 21:00:05 +00002374 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002375 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002376 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002377
Akira Hatanaka974131e2014-09-18 18:17:18 +00002378 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2379
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002380 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2381
Akira Hatanaka974131e2014-09-18 18:17:18 +00002382 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2383
Craig Topper3164f332014-03-11 03:39:26 +00002384 std::string convertConstraint(const char *&Constraint) const override;
2385 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002386 return "~{dirflag},~{fpsr},~{flags}";
2387 }
Craig Topper3164f332014-03-11 03:39:26 +00002388 void getTargetDefines(const LangOptions &Opts,
2389 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002390 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2391 bool Enabled);
2392 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2393 bool Enabled);
2394 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2395 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002396 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2397 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002398 setFeatureEnabledImpl(Features, Name, Enabled);
2399 }
2400 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002401 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002402 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2403 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002404 bool
2405 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2406 StringRef CPU,
2407 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002408 bool hasFeature(StringRef Feature) const override;
2409 bool handleTargetFeatures(std::vector<std::string> &Features,
2410 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002411 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002412 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2413 return "avx512";
2414 else if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002415 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002416 else if (getTriple().getArch() == llvm::Triple::x86 &&
2417 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002418 return "no-mmx";
2419 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002420 }
Craig Topper3164f332014-03-11 03:39:26 +00002421 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002422 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002423
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002424 // Perform any per-CPU checks necessary to determine if this CPU is
2425 // acceptable.
2426 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2427 // invalid without explaining *why*.
2428 switch (CPU) {
2429 case CK_Generic:
2430 // No processor selected!
2431 return false;
2432
2433 case CK_i386:
2434 case CK_i486:
2435 case CK_WinChipC6:
2436 case CK_WinChip2:
2437 case CK_C3:
2438 case CK_i586:
2439 case CK_Pentium:
2440 case CK_PentiumMMX:
2441 case CK_i686:
2442 case CK_PentiumPro:
2443 case CK_Pentium2:
2444 case CK_Pentium3:
2445 case CK_Pentium3M:
2446 case CK_PentiumM:
2447 case CK_Yonah:
2448 case CK_C3_2:
2449 case CK_Pentium4:
2450 case CK_Pentium4M:
2451 case CK_Prescott:
2452 case CK_K6:
2453 case CK_K6_2:
2454 case CK_K6_3:
2455 case CK_Athlon:
2456 case CK_AthlonThunderbird:
2457 case CK_Athlon4:
2458 case CK_AthlonXP:
2459 case CK_AthlonMP:
2460 case CK_Geode:
2461 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002462 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002463 return false;
2464
2465 // Fallthrough
2466 case CK_Nocona:
2467 case CK_Core2:
2468 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002469 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002470 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002471 case CK_Nehalem:
2472 case CK_Westmere:
2473 case CK_SandyBridge:
2474 case CK_IvyBridge:
2475 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002476 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002477 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002478 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002479 case CK_Athlon64:
2480 case CK_Athlon64SSE3:
2481 case CK_AthlonFX:
2482 case CK_K8:
2483 case CK_K8SSE3:
2484 case CK_Opteron:
2485 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002486 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002487 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002488 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002489 case CK_BDVER1:
2490 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002491 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002492 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002493 case CK_x86_64:
2494 return true;
2495 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002496 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002497 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002498
Craig Topper3164f332014-03-11 03:39:26 +00002499 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002500
Craig Topper3164f332014-03-11 03:39:26 +00002501 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002502 // We accept all non-ARM calling conventions
2503 return (CC == CC_X86ThisCall ||
2504 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002505 CC == CC_X86StdCall ||
2506 CC == CC_X86VectorCall ||
2507 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002508 CC == CC_X86Pascal ||
2509 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002510 }
2511
Craig Topper3164f332014-03-11 03:39:26 +00002512 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002513 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002514 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002515
2516 bool hasSjLjLowering() const override {
2517 return true;
2518 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002519};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002520
Rafael Espindolaeb265472013-08-21 21:59:03 +00002521bool X86TargetInfo::setFPMath(StringRef Name) {
2522 if (Name == "387") {
2523 FPMath = FP_387;
2524 return true;
2525 }
2526 if (Name == "sse") {
2527 FPMath = FP_SSE;
2528 return true;
2529 }
2530 return false;
2531}
2532
Eric Christopher007b0a02015-08-28 22:32:01 +00002533bool X86TargetInfo::initFeatureMap(
2534 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002535 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002536 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002537 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002538 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002539 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002540
Eric Christopher2b4a7252015-08-27 00:05:52 +00002541 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002542 case CK_Generic:
2543 case CK_i386:
2544 case CK_i486:
2545 case CK_i586:
2546 case CK_Pentium:
2547 case CK_i686:
2548 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002549 break;
2550 case CK_PentiumMMX:
2551 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002552 case CK_K6:
2553 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002554 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002555 break;
2556 case CK_Pentium3:
2557 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002558 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002559 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002560 break;
2561 case CK_PentiumM:
2562 case CK_Pentium4:
2563 case CK_Pentium4M:
2564 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002565 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002566 break;
2567 case CK_Yonah:
2568 case CK_Prescott:
2569 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002570 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002571 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002572 break;
2573 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002574 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002575 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002576 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002577 break;
2578 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002579 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002580 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002581 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002582 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002583 setFeatureEnabledImpl(Features, "avx512f", true);
2584 setFeatureEnabledImpl(Features, "avx512cd", true);
2585 setFeatureEnabledImpl(Features, "avx512dq", true);
2586 setFeatureEnabledImpl(Features, "avx512bw", true);
2587 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002588 // FALLTHROUGH
2589 case CK_Broadwell:
2590 setFeatureEnabledImpl(Features, "rdseed", true);
2591 setFeatureEnabledImpl(Features, "adx", true);
2592 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002593 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002594 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002595 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002596 setFeatureEnabledImpl(Features, "bmi", true);
2597 setFeatureEnabledImpl(Features, "bmi2", true);
2598 setFeatureEnabledImpl(Features, "rtm", true);
2599 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002600 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002601 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002602 setFeatureEnabledImpl(Features, "rdrnd", true);
2603 setFeatureEnabledImpl(Features, "f16c", true);
2604 setFeatureEnabledImpl(Features, "fsgsbase", true);
2605 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002606 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002607 setFeatureEnabledImpl(Features, "avx", true);
2608 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002609 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002610 case CK_Silvermont:
2611 setFeatureEnabledImpl(Features, "aes", true);
2612 setFeatureEnabledImpl(Features, "pclmul", true);
2613 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002614 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002615 setFeatureEnabledImpl(Features, "sse4.2", true);
2616 setFeatureEnabledImpl(Features, "cx16", true);
2617 break;
2618 case CK_KNL:
2619 setFeatureEnabledImpl(Features, "avx512f", true);
2620 setFeatureEnabledImpl(Features, "avx512cd", true);
2621 setFeatureEnabledImpl(Features, "avx512er", true);
2622 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002623 setFeatureEnabledImpl(Features, "rdseed", true);
2624 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002625 setFeatureEnabledImpl(Features, "lzcnt", true);
2626 setFeatureEnabledImpl(Features, "bmi", true);
2627 setFeatureEnabledImpl(Features, "bmi2", true);
2628 setFeatureEnabledImpl(Features, "rtm", true);
2629 setFeatureEnabledImpl(Features, "fma", true);
2630 setFeatureEnabledImpl(Features, "rdrnd", true);
2631 setFeatureEnabledImpl(Features, "f16c", true);
2632 setFeatureEnabledImpl(Features, "fsgsbase", true);
2633 setFeatureEnabledImpl(Features, "aes", true);
2634 setFeatureEnabledImpl(Features, "pclmul", true);
2635 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002636 break;
2637 case CK_K6_2:
2638 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002639 case CK_WinChip2:
2640 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002641 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002642 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002643 case CK_Athlon:
2644 case CK_AthlonThunderbird:
2645 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002646 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002647 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002648 case CK_Athlon4:
2649 case CK_AthlonXP:
2650 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002651 setFeatureEnabledImpl(Features, "sse", true);
2652 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002653 break;
2654 case CK_K8:
2655 case CK_Opteron:
2656 case CK_Athlon64:
2657 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002658 setFeatureEnabledImpl(Features, "sse2", true);
2659 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002660 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002661 case CK_AMDFAM10:
2662 setFeatureEnabledImpl(Features, "sse4a", true);
2663 setFeatureEnabledImpl(Features, "lzcnt", true);
2664 setFeatureEnabledImpl(Features, "popcnt", true);
2665 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002666 case CK_K8SSE3:
2667 case CK_OpteronSSE3:
2668 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002669 setFeatureEnabledImpl(Features, "sse3", true);
2670 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002671 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002672 case CK_BTVER2:
2673 setFeatureEnabledImpl(Features, "avx", true);
2674 setFeatureEnabledImpl(Features, "aes", true);
2675 setFeatureEnabledImpl(Features, "pclmul", true);
2676 setFeatureEnabledImpl(Features, "bmi", true);
2677 setFeatureEnabledImpl(Features, "f16c", true);
2678 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002679 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002680 setFeatureEnabledImpl(Features, "ssse3", true);
2681 setFeatureEnabledImpl(Features, "sse4a", true);
2682 setFeatureEnabledImpl(Features, "lzcnt", true);
2683 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002684 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002685 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002686 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002687 case CK_BDVER4:
2688 setFeatureEnabledImpl(Features, "avx2", true);
2689 setFeatureEnabledImpl(Features, "bmi2", true);
2690 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002691 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002692 setFeatureEnabledImpl(Features, "fsgsbase", true);
2693 // FALLTHROUGH
2694 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002695 setFeatureEnabledImpl(Features, "bmi", true);
2696 setFeatureEnabledImpl(Features, "fma", true);
2697 setFeatureEnabledImpl(Features, "f16c", true);
2698 setFeatureEnabledImpl(Features, "tbm", true);
2699 // FALLTHROUGH
2700 case CK_BDVER1:
2701 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002702 setFeatureEnabledImpl(Features, "xop", true);
2703 setFeatureEnabledImpl(Features, "lzcnt", true);
2704 setFeatureEnabledImpl(Features, "aes", true);
2705 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002706 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002707 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002708 break;
Eli Friedman33465822011-07-08 23:31:17 +00002709 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002710 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2711 return false;
2712
2713 // Can't do this earlier because we need to be able to explicitly enable
2714 // or disable these features and the things that they depend upon.
2715
2716 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2717 auto I = Features.find("sse4.2");
2718 if (I != Features.end() && I->getValue() == true &&
2719 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2720 FeaturesVec.end())
2721 Features["popcnt"] = true;
2722
2723 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2724 I = Features.find("3dnow");
2725 if (I != Features.end() && I->getValue() == true &&
2726 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2727 FeaturesVec.end())
2728 Features["prfchw"] = true;
2729
Eric Christophera7260af2015-10-08 20:10:18 +00002730 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2731 // then enable MMX.
2732 I = Features.find("sse");
2733 if (I != Features.end() && I->getValue() == true &&
2734 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2735 FeaturesVec.end())
2736 Features["mmx"] = true;
2737
Eric Christopherbbd746d2015-10-08 20:10:14 +00002738 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002739}
2740
Rafael Espindolae62e2792013-08-20 13:44:29 +00002741void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002742 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002743 if (Enabled) {
2744 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002745 case AVX512F:
2746 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002747 case AVX2:
2748 Features["avx2"] = true;
2749 case AVX:
2750 Features["avx"] = true;
2751 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002752 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002753 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002754 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002755 case SSSE3:
2756 Features["ssse3"] = true;
2757 case SSE3:
2758 Features["sse3"] = true;
2759 case SSE2:
2760 Features["sse2"] = true;
2761 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002762 Features["sse"] = true;
2763 case NoSSE:
2764 break;
2765 }
2766 return;
2767 }
2768
2769 switch (Level) {
2770 case NoSSE:
2771 case SSE1:
2772 Features["sse"] = false;
2773 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002774 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2775 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002776 case SSE3:
2777 Features["sse3"] = false;
2778 setXOPLevel(Features, NoXOP, false);
2779 case SSSE3:
2780 Features["ssse3"] = false;
2781 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002782 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002783 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002784 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002785 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002786 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002787 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002788 case AVX2:
2789 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002790 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002791 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002792 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2793 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002794 }
2795}
2796
2797void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002798 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002799 if (Enabled) {
2800 switch (Level) {
2801 case AMD3DNowAthlon:
2802 Features["3dnowa"] = true;
2803 case AMD3DNow:
2804 Features["3dnow"] = true;
2805 case MMX:
2806 Features["mmx"] = true;
2807 case NoMMX3DNow:
2808 break;
2809 }
2810 return;
2811 }
2812
2813 switch (Level) {
2814 case NoMMX3DNow:
2815 case MMX:
2816 Features["mmx"] = false;
2817 case AMD3DNow:
2818 Features["3dnow"] = false;
2819 case AMD3DNowAthlon:
2820 Features["3dnowa"] = false;
2821 }
2822}
2823
2824void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002825 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002826 if (Enabled) {
2827 switch (Level) {
2828 case XOP:
2829 Features["xop"] = true;
2830 case FMA4:
2831 Features["fma4"] = true;
2832 setSSELevel(Features, AVX, true);
2833 case SSE4A:
2834 Features["sse4a"] = true;
2835 setSSELevel(Features, SSE3, true);
2836 case NoXOP:
2837 break;
2838 }
2839 return;
2840 }
2841
2842 switch (Level) {
2843 case NoXOP:
2844 case SSE4A:
2845 Features["sse4a"] = false;
2846 case FMA4:
2847 Features["fma4"] = false;
2848 case XOP:
2849 Features["xop"] = false;
2850 }
2851}
2852
Craig Topper86d79ef2013-09-17 04:51:29 +00002853void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2854 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002855 // This is a bit of a hack to deal with the sse4 target feature when used
2856 // as part of the target attribute. We handle sse4 correctly everywhere
2857 // else. See below for more information on how we handle the sse4 options.
2858 if (Name != "sse4")
2859 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002860
Craig Topper29561122013-09-19 01:13:07 +00002861 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002862 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002863 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002864 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002865 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002866 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002867 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002868 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002869 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002870 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002871 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002872 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002873 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002874 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002875 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002876 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002877 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002878 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002879 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002880 if (Enabled)
2881 setSSELevel(Features, SSE2, Enabled);
2882 } else if (Name == "pclmul") {
2883 if (Enabled)
2884 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002885 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002886 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002887 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002888 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002889 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002890 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002891 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2892 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002893 if (Enabled)
2894 setSSELevel(Features, AVX512F, Enabled);
2895 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002896 if (Enabled)
2897 setSSELevel(Features, AVX, Enabled);
2898 } else if (Name == "fma4") {
2899 setXOPLevel(Features, FMA4, Enabled);
2900 } else if (Name == "xop") {
2901 setXOPLevel(Features, XOP, Enabled);
2902 } else if (Name == "sse4a") {
2903 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002904 } else if (Name == "f16c") {
2905 if (Enabled)
2906 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002907 } else if (Name == "sha") {
2908 if (Enabled)
2909 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002910 } else if (Name == "sse4") {
2911 // We can get here via the __target__ attribute since that's not controlled
2912 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2913 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2914 // disabled.
2915 if (Enabled)
2916 setSSELevel(Features, SSE42, Enabled);
2917 else
2918 setSSELevel(Features, SSE41, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002919 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002920}
2921
Eric Christopher3ff21b32013-10-16 21:26:26 +00002922/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002923/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002924bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002925 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00002926 for (const auto &Feature : Features) {
2927 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00002928 continue;
2929
Eric Christopher610fe112015-08-26 08:21:55 +00002930 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002931 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002932 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00002933 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002934 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002935 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002936 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002937 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002938 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00002939 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002940 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002941 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002942 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002943 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002944 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002945 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002946 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00002947 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002948 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00002949 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002950 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00002951 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002952 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00002953 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002954 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002955 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002956 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00002957 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002958 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00002959 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002960 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00002961 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002962 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00002963 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002964 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002965 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002966 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002967 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002968 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002969 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002970 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002971 HasAVX512VL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002972 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00002973 HasSHA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002974 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00002975 HasCX16 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002976 }
2977
Benjamin Kramer27402c62012-03-05 15:10:44 +00002978 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002979 .Case("+avx512f", AVX512F)
2980 .Case("+avx2", AVX2)
2981 .Case("+avx", AVX)
2982 .Case("+sse4.2", SSE42)
2983 .Case("+sse4.1", SSE41)
2984 .Case("+ssse3", SSSE3)
2985 .Case("+sse3", SSE3)
2986 .Case("+sse2", SSE2)
2987 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002988 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002989 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002990
Eli Friedman33465822011-07-08 23:31:17 +00002991 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002992 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00002993 .Case("+3dnowa", AMD3DNowAthlon)
2994 .Case("+3dnow", AMD3DNow)
2995 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00002996 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002997 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002998
2999 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003000 .Case("+xop", XOP)
3001 .Case("+fma4", FMA4)
3002 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003003 .Default(NoXOP);
3004 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003005 }
Eli Friedman33465822011-07-08 23:31:17 +00003006
Rafael Espindolaeb265472013-08-21 21:59:03 +00003007 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3008 // matches the selected sse level.
3009 if (FPMath == FP_SSE && SSELevel < SSE1) {
3010 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
3011 return false;
3012 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
3013 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
3014 return false;
3015 }
3016
Alexey Bataev00396512015-07-02 03:40:19 +00003017 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003018 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003019 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003020}
Chris Lattnerecd49032009-03-02 22:27:17 +00003021
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003022/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3023/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003024void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003025 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003026 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003027 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003028 Builder.defineMacro("__amd64__");
3029 Builder.defineMacro("__amd64");
3030 Builder.defineMacro("__x86_64");
3031 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003032 if (getTriple().getArchName() == "x86_64h") {
3033 Builder.defineMacro("__x86_64h");
3034 Builder.defineMacro("__x86_64h__");
3035 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003036 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003037 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003038 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003039
Chris Lattnerecd49032009-03-02 22:27:17 +00003040 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003041 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3042 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003043 switch (CPU) {
3044 case CK_Generic:
3045 break;
3046 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003047 // The rest are coming from the i386 define above.
3048 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003049 break;
3050 case CK_i486:
3051 case CK_WinChipC6:
3052 case CK_WinChip2:
3053 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003054 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003055 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003056 case CK_PentiumMMX:
3057 Builder.defineMacro("__pentium_mmx__");
3058 Builder.defineMacro("__tune_pentium_mmx__");
3059 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003060 case CK_i586:
3061 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003062 defineCPUMacros(Builder, "i586");
3063 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003064 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003065 case CK_Pentium3:
3066 case CK_Pentium3M:
3067 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003068 Builder.defineMacro("__tune_pentium3__");
3069 // Fallthrough
3070 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003071 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003072 Builder.defineMacro("__tune_pentium2__");
3073 // Fallthrough
3074 case CK_PentiumPro:
3075 Builder.defineMacro("__tune_i686__");
3076 Builder.defineMacro("__tune_pentiumpro__");
3077 // Fallthrough
3078 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003079 Builder.defineMacro("__i686");
3080 Builder.defineMacro("__i686__");
3081 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3082 Builder.defineMacro("__pentiumpro");
3083 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003084 break;
3085 case CK_Pentium4:
3086 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003087 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003088 break;
3089 case CK_Yonah:
3090 case CK_Prescott:
3091 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003092 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003093 break;
3094 case CK_Core2:
3095 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003096 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003097 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003098 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003099 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003100 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003101 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003102 defineCPUMacros(Builder, "slm");
3103 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003104 case CK_Nehalem:
3105 case CK_Westmere:
3106 case CK_SandyBridge:
3107 case CK_IvyBridge:
3108 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003109 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003110 // FIXME: Historically, we defined this legacy name, it would be nice to
3111 // remove it at some point. We've never exposed fine-grained names for
3112 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003113 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003114 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003115 case CK_Skylake:
3116 // FIXME: Historically, we defined this legacy name, it would be nice to
3117 // remove it at some point. This is the only fine-grained CPU macro in the
3118 // main intel CPU line, and it would be better to not have these and force
3119 // people to use ISA macros.
3120 defineCPUMacros(Builder, "skx");
3121 break;
Craig Topper449314e2013-08-20 07:09:39 +00003122 case CK_KNL:
3123 defineCPUMacros(Builder, "knl");
3124 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003125 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003126 Builder.defineMacro("__k6_2__");
3127 Builder.defineMacro("__tune_k6_2__");
3128 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003129 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003130 if (CPU != CK_K6_2) { // In case of fallthrough
3131 // FIXME: GCC may be enabling these in cases where some other k6
3132 // architecture is specified but -m3dnow is explicitly provided. The
3133 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003134 Builder.defineMacro("__k6_3__");
3135 Builder.defineMacro("__tune_k6_3__");
3136 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003137 // Fallthrough
3138 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003139 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003140 break;
3141 case CK_Athlon:
3142 case CK_AthlonThunderbird:
3143 case CK_Athlon4:
3144 case CK_AthlonXP:
3145 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003146 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003147 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003148 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003149 Builder.defineMacro("__tune_athlon_sse__");
3150 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003151 break;
3152 case CK_K8:
3153 case CK_K8SSE3:
3154 case CK_x86_64:
3155 case CK_Opteron:
3156 case CK_OpteronSSE3:
3157 case CK_Athlon64:
3158 case CK_Athlon64SSE3:
3159 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003160 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003161 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003162 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003163 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003164 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003165 case CK_BTVER1:
3166 defineCPUMacros(Builder, "btver1");
3167 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003168 case CK_BTVER2:
3169 defineCPUMacros(Builder, "btver2");
3170 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003171 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003172 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003173 break;
3174 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003175 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003176 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003177 case CK_BDVER3:
3178 defineCPUMacros(Builder, "bdver3");
3179 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003180 case CK_BDVER4:
3181 defineCPUMacros(Builder, "bdver4");
3182 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003183 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003184 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003185 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003186 }
Chris Lattner96e43572009-03-02 22:40:39 +00003187
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003188 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003189 Builder.defineMacro("__REGISTER_PREFIX__", "");
3190
Chris Lattner6df41af2009-04-19 17:32:33 +00003191 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3192 // functions in glibc header files that use FP Stack inline asm which the
3193 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003194 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003195
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003196 if (HasAES)
3197 Builder.defineMacro("__AES__");
3198
Craig Topper3f122a72012-05-31 05:18:48 +00003199 if (HasPCLMUL)
3200 Builder.defineMacro("__PCLMUL__");
3201
Craig Topper22967d42011-12-25 05:06:45 +00003202 if (HasLZCNT)
3203 Builder.defineMacro("__LZCNT__");
3204
Benjamin Kramer1e250392012-07-07 09:39:18 +00003205 if (HasRDRND)
3206 Builder.defineMacro("__RDRND__");
3207
Craig Topper8c7f2512014-11-03 06:51:41 +00003208 if (HasFSGSBASE)
3209 Builder.defineMacro("__FSGSBASE__");
3210
Craig Topper22967d42011-12-25 05:06:45 +00003211 if (HasBMI)
3212 Builder.defineMacro("__BMI__");
3213
3214 if (HasBMI2)
3215 Builder.defineMacro("__BMI2__");
3216
Craig Topper1de83482011-12-29 16:10:46 +00003217 if (HasPOPCNT)
3218 Builder.defineMacro("__POPCNT__");
3219
Michael Liao625a8752012-11-10 05:17:46 +00003220 if (HasRTM)
3221 Builder.defineMacro("__RTM__");
3222
Michael Liao74f4eaf2013-03-26 17:52:08 +00003223 if (HasPRFCHW)
3224 Builder.defineMacro("__PRFCHW__");
3225
Michael Liaoffaae352013-03-29 05:17:55 +00003226 if (HasRDSEED)
3227 Builder.defineMacro("__RDSEED__");
3228
Robert Khasanov50e6f582014-09-19 09:53:48 +00003229 if (HasADX)
3230 Builder.defineMacro("__ADX__");
3231
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003232 if (HasTBM)
3233 Builder.defineMacro("__TBM__");
3234
Rafael Espindolae62e2792013-08-20 13:44:29 +00003235 switch (XOPLevel) {
3236 case XOP:
3237 Builder.defineMacro("__XOP__");
3238 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003239 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003240 case SSE4A:
3241 Builder.defineMacro("__SSE4A__");
3242 case NoXOP:
3243 break;
3244 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003245
Craig Topperbba778b2012-06-03 21:46:30 +00003246 if (HasFMA)
3247 Builder.defineMacro("__FMA__");
3248
Manman Rena45358c2012-10-11 00:59:55 +00003249 if (HasF16C)
3250 Builder.defineMacro("__F16C__");
3251
Craig Topper679b53a2013-08-21 05:29:10 +00003252 if (HasAVX512CD)
3253 Builder.defineMacro("__AVX512CD__");
3254 if (HasAVX512ER)
3255 Builder.defineMacro("__AVX512ER__");
3256 if (HasAVX512PF)
3257 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003258 if (HasAVX512DQ)
3259 Builder.defineMacro("__AVX512DQ__");
3260 if (HasAVX512BW)
3261 Builder.defineMacro("__AVX512BW__");
3262 if (HasAVX512VL)
3263 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003264
Ben Langmuir58078d02013-09-19 13:22:04 +00003265 if (HasSHA)
3266 Builder.defineMacro("__SHA__");
3267
Nick Lewycky50e8f482013-10-05 20:14:27 +00003268 if (HasCX16)
3269 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3270
Chris Lattner96e43572009-03-02 22:40:39 +00003271 // Each case falls through to the previous one here.
3272 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003273 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003274 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003275 case AVX2:
3276 Builder.defineMacro("__AVX2__");
3277 case AVX:
3278 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003279 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003280 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003281 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003282 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003283 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003284 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003285 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003286 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003287 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003288 Builder.defineMacro("__SSE2__");
3289 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003290 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003291 Builder.defineMacro("__SSE__");
3292 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003293 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003294 break;
3295 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003296
Derek Schuffc7dd7222012-10-11 15:52:22 +00003297 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003298 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003299 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003300 case AVX2:
3301 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003302 case SSE42:
3303 case SSE41:
3304 case SSSE3:
3305 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003306 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003307 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003308 break;
3309 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003310 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003311 break;
3312 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003313 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003314 }
3315 }
3316
Anders Carlssone437c682010-01-27 03:47:49 +00003317 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003318 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003319 case AMD3DNowAthlon:
3320 Builder.defineMacro("__3dNOW_A__");
3321 case AMD3DNow:
3322 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003323 case MMX:
3324 Builder.defineMacro("__MMX__");
3325 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003326 break;
3327 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003328
3329 if (CPU >= CK_i486) {
3330 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3331 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3332 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3333 }
3334 if (CPU >= CK_i586)
3335 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003336}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003337
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003338bool X86TargetInfo::hasFeature(StringRef Feature) const {
3339 return llvm::StringSwitch<bool>(Feature)
3340 .Case("aes", HasAES)
3341 .Case("avx", SSELevel >= AVX)
3342 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003343 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003344 .Case("avx512cd", HasAVX512CD)
3345 .Case("avx512er", HasAVX512ER)
3346 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003347 .Case("avx512dq", HasAVX512DQ)
3348 .Case("avx512bw", HasAVX512BW)
3349 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003350 .Case("bmi", HasBMI)
3351 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003352 .Case("cx16", HasCX16)
3353 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003354 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003355 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003356 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003357 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003358 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3359 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3360 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003361 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003362 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003363 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003364 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003365 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003366 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003367 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003368 .Case("sse", SSELevel >= SSE1)
3369 .Case("sse2", SSELevel >= SSE2)
3370 .Case("sse3", SSELevel >= SSE3)
3371 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003372 .Case("sse4.1", SSELevel >= SSE41)
3373 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003374 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003375 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003376 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003377 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3378 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003379 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003380 .Default(false);
3381}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003382
Eric Christopherd9832702015-06-29 21:00:05 +00003383// We can't use a generic validation scheme for the features accepted here
3384// versus subtarget features accepted in the target attribute because the
3385// bitfield structure that's initialized in the runtime only supports the
3386// below currently rather than the full range of subtarget features. (See
3387// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3388bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3389 return llvm::StringSwitch<bool>(FeatureStr)
3390 .Case("cmov", true)
3391 .Case("mmx", true)
3392 .Case("popcnt", true)
3393 .Case("sse", true)
3394 .Case("sse2", true)
3395 .Case("sse3", true)
3396 .Case("sse4.1", true)
3397 .Case("sse4.2", true)
3398 .Case("avx", true)
3399 .Case("avx2", true)
3400 .Case("sse4a", true)
3401 .Case("fma4", true)
3402 .Case("xop", true)
3403 .Case("fma", true)
3404 .Case("avx512f", true)
3405 .Case("bmi", true)
3406 .Case("bmi2", true)
3407 .Default(false);
3408}
3409
Eli Friedman3fd920a2008-08-20 02:34:37 +00003410bool
Anders Carlsson58436352009-02-28 17:11:49 +00003411X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003412 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003413 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003414 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003415 // Constant constraints.
3416 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3417 // instructions.
3418 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3419 // x86_64 instructions.
3420 case 's':
3421 Info.setRequiresImmediate();
3422 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003423 case 'I':
3424 Info.setRequiresImmediate(0, 31);
3425 return true;
3426 case 'J':
3427 Info.setRequiresImmediate(0, 63);
3428 return true;
3429 case 'K':
3430 Info.setRequiresImmediate(-128, 127);
3431 return true;
3432 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003433 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003434 return true;
3435 case 'M':
3436 Info.setRequiresImmediate(0, 3);
3437 return true;
3438 case 'N':
3439 Info.setRequiresImmediate(0, 255);
3440 return true;
3441 case 'O':
3442 Info.setRequiresImmediate(0, 127);
3443 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003444 // Register constraints.
3445 case 'Y': // 'Y' is the first character for several 2-character constraints.
3446 // Shift the pointer to the second character of the constraint.
3447 Name++;
3448 switch (*Name) {
3449 default:
3450 return false;
3451 case '0': // First SSE register.
3452 case 't': // Any SSE register, when SSE2 is enabled.
3453 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3454 case 'm': // Any MMX register, when inter-unit moves enabled.
3455 Info.setAllowsRegister();
3456 return true;
3457 }
3458 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003459 // Constraint 'f' cannot be used for output operands.
3460 if (Info.ConstraintStr[0] == '=')
3461 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003462 Info.setAllowsRegister();
3463 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003464 case 'a': // eax.
3465 case 'b': // ebx.
3466 case 'c': // ecx.
3467 case 'd': // edx.
3468 case 'S': // esi.
3469 case 'D': // edi.
3470 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003471 case 't': // Top of floating point stack.
3472 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003473 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003474 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003475 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003476 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003477 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3478 case 'l': // "Index" registers: any general register that can be used as an
3479 // index in a base+index memory access.
3480 Info.setAllowsRegister();
3481 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003482 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003483 case 'C': // SSE floating point constant.
3484 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003485 return true;
3486 }
3487}
3488
Akira Hatanaka974131e2014-09-18 18:17:18 +00003489bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3490 unsigned Size) const {
3491 // Strip off constraint modifiers.
3492 while (Constraint[0] == '=' ||
3493 Constraint[0] == '+' ||
3494 Constraint[0] == '&')
3495 Constraint = Constraint.substr(1);
3496
3497 return validateOperandSize(Constraint, Size);
3498}
3499
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003500bool X86TargetInfo::validateInputSize(StringRef Constraint,
3501 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003502 return validateOperandSize(Constraint, Size);
3503}
3504
3505bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3506 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003507 switch (Constraint[0]) {
3508 default: break;
3509 case 'y':
3510 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003511 case 'f':
3512 case 't':
3513 case 'u':
3514 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003515 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003516 if (SSELevel >= AVX512F)
3517 // 512-bit zmm registers can be used if target supports AVX512F.
3518 return Size <= 512U;
3519 else if (SSELevel >= AVX)
3520 // 256-bit ymm registers can be used if target supports AVX.
3521 return Size <= 256U;
3522 return Size <= 128U;
3523 case 'Y':
3524 // 'Y' is the first character for several 2-character constraints.
3525 switch (Constraint[1]) {
3526 default: break;
3527 case 'm':
3528 // 'Ym' is synonymous with 'y'.
3529 return Size <= 64;
3530 case 'i':
3531 case 't':
3532 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3533 if (SSELevel >= AVX512F)
3534 return Size <= 512U;
3535 else if (SSELevel >= AVX)
3536 return Size <= 256U;
3537 return SSELevel >= SSE2 && Size <= 128U;
3538 }
3539
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003540 }
3541
3542 return true;
3543}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003544
Eli Friedman3fd920a2008-08-20 02:34:37 +00003545std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003546X86TargetInfo::convertConstraint(const char *&Constraint) const {
3547 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003548 case 'a': return std::string("{ax}");
3549 case 'b': return std::string("{bx}");
3550 case 'c': return std::string("{cx}");
3551 case 'd': return std::string("{dx}");
3552 case 'S': return std::string("{si}");
3553 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003554 case 'p': // address
3555 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003556 case 't': // top of floating point stack.
3557 return std::string("{st}");
3558 case 'u': // second from top of floating point stack.
3559 return std::string("{st(1)}"); // second from top of floating point stack.
3560 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003561 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003562 }
3563}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003564
Eli Friedman3fd920a2008-08-20 02:34:37 +00003565// X86-32 generic target
3566class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003567public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003568 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003569 DoubleAlign = LongLongAlign = 32;
3570 LongDoubleWidth = 96;
3571 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003572 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003573 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003574 SizeType = UnsignedInt;
3575 PtrDiffType = SignedInt;
3576 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003577 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003578
3579 // Use fpret for all types.
3580 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3581 (1 << TargetInfo::Double) |
3582 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003583
3584 // x86-32 has atomics up to 8 bytes
3585 // FIXME: Check that we actually have cmpxchg8b before setting
3586 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3587 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003588 }
Craig Topper3164f332014-03-11 03:39:26 +00003589 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003590 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003591 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003592
Craig Topper3164f332014-03-11 03:39:26 +00003593 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003594 if (RegNo == 0) return 0;
3595 if (RegNo == 1) return 2;
3596 return -1;
3597 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003598 bool validateOperandSize(StringRef Constraint,
3599 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003600 switch (Constraint[0]) {
3601 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003602 case 'R':
3603 case 'q':
3604 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003605 case 'a':
3606 case 'b':
3607 case 'c':
3608 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003609 case 'S':
3610 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003611 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003612 case 'A':
3613 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003614 }
3615
Akira Hatanaka974131e2014-09-18 18:17:18 +00003616 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003617 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003618};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003619
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003620class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3621public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003622 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3623 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003624
Craig Topper3164f332014-03-11 03:39:26 +00003625 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003626 unsigned Major, Minor, Micro;
3627 getTriple().getOSVersion(Major, Minor, Micro);
3628 // New NetBSD uses the default rounding mode.
3629 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3630 return X86_32TargetInfo::getFloatEvalMethod();
3631 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003632 return 1;
3633 }
3634};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003635
Eli Friedmane3aa4542009-07-05 18:47:56 +00003636class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3637public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003638 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3639 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003640 SizeType = UnsignedLong;
3641 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003642 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003643 }
3644};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003645
Eli Friedman9fa28852012-08-08 23:57:20 +00003646class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3647public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003648 BitrigI386TargetInfo(const llvm::Triple &Triple)
3649 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003650 SizeType = UnsignedLong;
3651 IntPtrType = SignedLong;
3652 PtrDiffType = SignedLong;
3653 }
3654};
Eli Friedman9fa28852012-08-08 23:57:20 +00003655
Torok Edwinb2b37c62009-06-30 17:10:35 +00003656class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003657public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003658 DarwinI386TargetInfo(const llvm::Triple &Triple)
3659 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003660 LongDoubleWidth = 128;
3661 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003662 SuitableAlign = 128;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003663 SizeType = UnsignedLong;
3664 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003665 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003666 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003667 }
3668
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003669 bool handleTargetFeatures(std::vector<std::string> &Features,
3670 DiagnosticsEngine &Diags) override {
3671 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3672 Diags))
3673 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003674 // We now know the features we have: we can decide how to align vectors.
3675 MaxVectorAlign =
3676 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003677 return true;
3678 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003679};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003680
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003681// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003682class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003683public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003684 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3685 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003686 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003687 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003688 bool IsWinCOFF =
3689 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003690 DataLayoutString = IsWinCOFF
3691 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3692 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003693 }
Craig Topper3164f332014-03-11 03:39:26 +00003694 void getTargetDefines(const LangOptions &Opts,
3695 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003696 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3697 }
3698};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003699
3700// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003701class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003702public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003703 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003704 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003705 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003706 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3707 }
Craig Topper3164f332014-03-11 03:39:26 +00003708 void getTargetDefines(const LangOptions &Opts,
3709 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003710 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3711 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3712 // The value of the following reflects processor type.
3713 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3714 // We lost the original triple, so we use the default.
3715 Builder.defineMacro("_M_IX86", "600");
3716 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003717};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003718
David Majnemerae1ed0e2015-05-28 04:36:18 +00003719static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003720 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3721 // supports __declspec natively under -fms-extensions, but we define a no-op
3722 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003723 if (Opts.MicrosoftExt)
3724 Builder.defineMacro("__declspec", "__declspec");
3725 else
3726 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3727
3728 if (!Opts.MicrosoftExt) {
3729 // Provide macros for all the calling convention keywords. Provide both
3730 // single and double underscore prefixed variants. These are available on
3731 // x64 as well as x86, even though they have no effect.
3732 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3733 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003734 std::string GCCSpelling = "__attribute__((__";
3735 GCCSpelling += CC;
3736 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003737 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3738 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3739 }
3740 }
3741}
3742
David Majnemerae1ed0e2015-05-28 04:36:18 +00003743static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3744 Builder.defineMacro("__MSVCRT__");
3745 Builder.defineMacro("__MINGW32__");
3746 addCygMingDefines(Opts, Builder);
3747}
3748
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003749// x86-32 MinGW target
3750class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3751public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003752 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003753 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003754 void getTargetDefines(const LangOptions &Opts,
3755 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003756 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003757 DefineStd(Builder, "WIN32", Opts);
3758 DefineStd(Builder, "WINNT", Opts);
3759 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003760 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003761 }
3762};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003763
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003764// x86-32 Cygwin target
3765class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3766public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003767 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3768 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003769 TLSSupported = false;
3770 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003771 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003772 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 +00003773 }
Craig Topper3164f332014-03-11 03:39:26 +00003774 void getTargetDefines(const LangOptions &Opts,
3775 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003776 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003777 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003778 Builder.defineMacro("__CYGWIN__");
3779 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003780 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003781 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003782 if (Opts.CPlusPlus)
3783 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003784 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003785};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003786
Chris Lattnerb986aba2010-04-11 19:29:39 +00003787// x86-32 Haiku target
3788class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3789public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003790 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003791 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003792 IntPtrType = SignedLong;
3793 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003794 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003795 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003796 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003797 }
Craig Topper3164f332014-03-11 03:39:26 +00003798 void getTargetDefines(const LangOptions &Opts,
3799 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003800 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3801 Builder.defineMacro("__INTEL__");
3802 Builder.defineMacro("__HAIKU__");
3803 }
3804};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003805
Douglas Gregor9fabd852011-07-01 22:41:14 +00003806// RTEMS Target
3807template<typename Target>
3808class RTEMSTargetInfo : public OSTargetInfo<Target> {
3809protected:
Craig Topper3164f332014-03-11 03:39:26 +00003810 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3811 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003812 // RTEMS defines; list based off of gcc output
3813
Douglas Gregor9fabd852011-07-01 22:41:14 +00003814 Builder.defineMacro("__rtems__");
3815 Builder.defineMacro("__ELF__");
3816 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003817
Douglas Gregor9fabd852011-07-01 22:41:14 +00003818public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003819 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3820 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003821
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003822 switch (Triple.getArch()) {
3823 default:
3824 case llvm::Triple::x86:
3825 // this->MCountName = ".mcount";
3826 break;
3827 case llvm::Triple::mips:
3828 case llvm::Triple::mipsel:
3829 case llvm::Triple::ppc:
3830 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003831 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003832 // this->MCountName = "_mcount";
3833 break;
3834 case llvm::Triple::arm:
3835 // this->MCountName = "__mcount";
3836 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003837 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003838 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003839};
3840
Douglas Gregor9fabd852011-07-01 22:41:14 +00003841// x86-32 RTEMS target
3842class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3843public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003844 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003845 SizeType = UnsignedLong;
3846 IntPtrType = SignedLong;
3847 PtrDiffType = SignedLong;
3848 this->UserLabelPrefix = "";
3849 }
Craig Topper3164f332014-03-11 03:39:26 +00003850 void getTargetDefines(const LangOptions &Opts,
3851 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003852 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3853 Builder.defineMacro("__INTEL__");
3854 Builder.defineMacro("__rtems__");
3855 }
3856};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003857
Eli Friedman3fd920a2008-08-20 02:34:37 +00003858// x86-64 generic target
3859class X86_64TargetInfo : public X86TargetInfo {
3860public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003861 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003862 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003863 bool IsWinCOFF =
3864 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003865 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003866 LongDoubleWidth = 128;
3867 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003868 LargeArrayMinWidth = 128;
3869 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003870 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003871 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3872 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3873 IntPtrType = IsX32 ? SignedInt : SignedLong;
3874 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003875 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003876 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003877
Eric Christopher917e9522014-11-18 22:36:15 +00003878 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003879 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3880 : IsWinCOFF
3881 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3882 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003883
3884 // Use fpret only for long double.
3885 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003886
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003887 // Use fp2ret for _Complex long double.
3888 ComplexLongDoubleUsesFP2Ret = true;
3889
Charles Davisc7d5c942015-09-17 20:55:33 +00003890 // Make __builtin_ms_va_list available.
3891 HasBuiltinMSVaList = true;
3892
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003893 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003894 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003895 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003896 }
Craig Topper3164f332014-03-11 03:39:26 +00003897 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003898 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003899 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003900
Craig Topper3164f332014-03-11 03:39:26 +00003901 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003902 if (RegNo == 0) return 0;
3903 if (RegNo == 1) return 1;
3904 return -1;
3905 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003906
Craig Topper3164f332014-03-11 03:39:26 +00003907 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003908 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003909 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003910 CC == CC_IntelOclBicc ||
3911 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003912 }
3913
Craig Topper3164f332014-03-11 03:39:26 +00003914 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003915 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003916 }
3917
Pavel Chupinfd223e12014-08-04 12:39:43 +00003918 // for x32 we need it here explicitly
3919 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003920};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003921
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003922// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003923class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003924public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003925 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3926 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003927 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003928 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003929 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003930 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003931 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003932 SizeType = UnsignedLongLong;
3933 PtrDiffType = SignedLongLong;
3934 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003935 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003936 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003937
Craig Topper3164f332014-03-11 03:39:26 +00003938 void getTargetDefines(const LangOptions &Opts,
3939 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003940 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003941 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003942 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003943
Craig Topper3164f332014-03-11 03:39:26 +00003944 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003945 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003946 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003947
Craig Topper3164f332014-03-11 03:39:26 +00003948 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003949 switch (CC) {
3950 case CC_X86StdCall:
3951 case CC_X86ThisCall:
3952 case CC_X86FastCall:
3953 return CCCR_Ignore;
3954 case CC_C:
3955 case CC_X86VectorCall:
3956 case CC_IntelOclBicc:
3957 case CC_X86_64SysV:
3958 return CCCR_OK;
3959 default:
3960 return CCCR_Warning;
3961 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003962 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003963};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003964
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003965// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003966class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003967public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003968 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003969 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003970 LongDoubleWidth = LongDoubleAlign = 64;
3971 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003972 }
Craig Topper3164f332014-03-11 03:39:26 +00003973 void getTargetDefines(const LangOptions &Opts,
3974 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003975 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3976 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00003977 Builder.defineMacro("_M_X64", "100");
3978 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003979 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003980};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003981
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003982// x86-64 MinGW target
3983class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3984public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003985 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Yaron Keren480bc9f2015-08-20 21:51:46 +00003986 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003987 void getTargetDefines(const LangOptions &Opts,
3988 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003989 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003990 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003991 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003992 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003993
3994 // GCC defines this macro when it is using __gxx_personality_seh0.
3995 if (!Opts.SjLjExceptions)
3996 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003997 }
3998};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003999
Yaron Kerend030d112015-07-22 17:38:19 +00004000// x86-64 Cygwin target
4001class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4002public:
4003 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4004 : X86_64TargetInfo(Triple) {
4005 TLSSupported = false;
4006 WCharType = UnsignedShort;
4007 }
4008 void getTargetDefines(const LangOptions &Opts,
4009 MacroBuilder &Builder) const override {
4010 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4011 Builder.defineMacro("__x86_64__");
4012 Builder.defineMacro("__CYGWIN__");
4013 Builder.defineMacro("__CYGWIN64__");
4014 addCygMingDefines(Opts, Builder);
4015 DefineStd(Builder, "unix", Opts);
4016 if (Opts.CPlusPlus)
4017 Builder.defineMacro("_GNU_SOURCE");
4018
4019 // GCC defines this macro when it is using __gxx_personality_seh0.
4020 if (!Opts.SjLjExceptions)
4021 Builder.defineMacro("__SEH__");
4022 }
4023};
4024
Eli Friedman2857ccb2009-07-01 03:36:11 +00004025class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4026public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004027 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4028 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004029 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004030 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4031 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004032 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004033 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004034 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004035 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004036
4037 bool handleTargetFeatures(std::vector<std::string> &Features,
4038 DiagnosticsEngine &Diags) override {
4039 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4040 Diags))
4041 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004042 // We now know the features we have: we can decide how to align vectors.
4043 MaxVectorAlign =
4044 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004045 return true;
4046 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004047};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004048
Eli Friedman245f2292009-07-05 22:31:18 +00004049class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4050public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004051 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4052 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004053 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004054 Int64Type = SignedLongLong;
4055 }
4056};
Eli Friedman245f2292009-07-05 22:31:18 +00004057
Eli Friedman9fa28852012-08-08 23:57:20 +00004058class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4059public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004060 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4061 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4062 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004063 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004064 }
4065};
Tim Northover9bb857a2013-01-31 12:13:10 +00004066
Eli Friedmanf05b7722008-08-20 07:44:10 +00004067class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004068 // Possible FPU choices.
4069 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004070 VFP2FPU = (1 << 0),
4071 VFP3FPU = (1 << 1),
4072 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004073 NeonFPU = (1 << 3),
4074 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004075 };
4076
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004077 // Possible HWDiv features.
4078 enum HWDivMode {
4079 HWDivThumb = (1 << 0),
4080 HWDivARM = (1 << 1)
4081 };
4082
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004083 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004084 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004085 }
4086
4087 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4088 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004089
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004090 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004091
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004092 StringRef CPUProfile;
4093 StringRef CPUAttr;
4094
Rafael Espindolaeb265472013-08-21 21:59:03 +00004095 enum {
4096 FP_Default,
4097 FP_VFP,
4098 FP_Neon
4099 } FPMath;
4100
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004101 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004102 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004103 unsigned ArchProfile;
4104 unsigned ArchVersion;
4105
Bernard Ogdenda13af32013-10-24 18:32:51 +00004106 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004107
Logan Chien57086ce2012-10-10 06:56:20 +00004108 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004109 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004110
4111 // Initialized via features.
4112 unsigned SoftFloat : 1;
4113 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004114
Bernard Ogden18b57012013-10-29 09:47:51 +00004115 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004116 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004117 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004118 unsigned Unaligned : 1;
4119
4120 enum {
4121 LDREX_B = (1 << 0), /// byte (8-bit)
4122 LDREX_H = (1 << 1), /// half (16-bit)
4123 LDREX_W = (1 << 2), /// word (32-bit)
4124 LDREX_D = (1 << 3), /// double (64-bit)
4125 };
4126
4127 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004128
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004129 // ACLE 6.5.1 Hardware floating point
4130 enum {
4131 HW_FP_HP = (1 << 1), /// half (16-bit)
4132 HW_FP_SP = (1 << 2), /// single (32-bit)
4133 HW_FP_DP = (1 << 3), /// double (64-bit)
4134 };
4135 uint32_t HW_FP;
4136
Chris Lattner5cc15e02010-03-03 19:03:45 +00004137 static const Builtin::Info BuiltinInfo[];
4138
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004139 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004140 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004141
4142 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004143 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004144
Renato Golin9ba39232015-02-27 16:35:48 +00004145 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4146 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4147 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004148 SizeType = UnsignedLong;
4149 else
4150 SizeType = UnsignedInt;
4151
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004152 switch (T.getOS()) {
4153 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004154 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004155 break;
4156 case llvm::Triple::Win32:
4157 WCharType = UnsignedShort;
4158 break;
4159 case llvm::Triple::Linux:
4160 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004161 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4162 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004163 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004164 }
4165
4166 UseBitFieldTypeAlignment = true;
4167
4168 ZeroLengthBitfieldBoundary = 0;
4169
Tim Northover147cd2f2014-10-14 22:12:21 +00004170 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4171 // so set preferred for small types to 32.
4172 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004173 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004174 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4175 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4176 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004177 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004178 DataLayoutString = "e"
4179 "-m:w"
4180 "-p:32:32"
4181 "-i64:64"
4182 "-v128:64:128"
4183 "-a:0:32"
4184 "-n32"
4185 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004186 } else if (T.isOSNaCl()) {
4187 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004188 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004189 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004190 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004191 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4192 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004193 }
4194
4195 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004196 }
4197
4198 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004199 const llvm::Triple &T = getTriple();
4200
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004201 IsAAPCS = false;
4202
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004203 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004204
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004205 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004206 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004207 SizeType = UnsignedInt;
4208 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004209 SizeType = UnsignedLong;
4210
4211 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4212 WCharType = SignedInt;
4213
4214 // Do not respect the alignment of bit-field types when laying out
4215 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4216 UseBitFieldTypeAlignment = false;
4217
4218 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4219 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4220 /// gcc.
4221 ZeroLengthBitfieldBoundary = 32;
4222
Tim Northover147cd2f2014-10-14 22:12:21 +00004223 if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004224 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004225 BigEndian
4226 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4227 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4228 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004229 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004230 BigEndian
4231 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4232 : "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004233
4234 // FIXME: Override "preferred align" for double and long long.
4235 }
4236
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004237 void setArchInfo() {
4238 StringRef ArchName = getTriple().getArchName();
4239
Renato Goline84b0002015-10-08 16:43:26 +00004240 ArchISA = llvm::ARM::parseArchISA(ArchName);
4241 CPU = llvm::ARM::getDefaultCPU(ArchName);
4242 unsigned AK = llvm::ARM::parseArch(ArchName);
4243 if (AK != llvm::ARM::AK_INVALID)
4244 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004245 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004246 }
4247
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004248 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004249 StringRef SubArch;
4250
4251 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004252 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004253 SubArch = llvm::ARM::getSubArch(ArchKind);
4254 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4255 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004256
4257 // cache CPU related strings
4258 CPUAttr = getCPUAttr();
4259 CPUProfile = getCPUProfile();
4260 }
4261
4262 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004263 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004264 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004265 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004266 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4267 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004268 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004269 if (ArchProfile == llvm::ARM::PK_M) {
4270 MaxAtomicPromoteWidth = 32;
4271 if (ShouldUseInlineAtomic)
4272 MaxAtomicInlineWidth = 32;
4273 }
4274 else {
4275 MaxAtomicPromoteWidth = 64;
4276 if (ShouldUseInlineAtomic)
4277 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004278 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004279 }
4280
4281 bool isThumb() const {
4282 return (ArchISA == llvm::ARM::IK_THUMB);
4283 }
4284
4285 bool supportsThumb() const {
4286 return CPUAttr.count('T') || ArchVersion >= 6;
4287 }
4288
4289 bool supportsThumb2() const {
4290 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4291 }
4292
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004293 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004294 // For most sub-arches, the build attribute CPU name is enough.
4295 // For Cortex variants, it's slightly different.
4296 switch(ArchKind) {
4297 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004298 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004299 case llvm::ARM::AK_ARMV6M:
4300 case llvm::ARM::AK_ARMV6SM:
4301 case llvm::ARM::AK_ARMV6HL:
4302 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004303 case llvm::ARM::AK_ARMV7S:
4304 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004305 case llvm::ARM::AK_ARMV7:
4306 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004307 case llvm::ARM::AK_ARMV7L:
4308 case llvm::ARM::AK_ARMV7HL:
4309 return "7A";
4310 case llvm::ARM::AK_ARMV7R:
4311 return "7R";
4312 case llvm::ARM::AK_ARMV7M:
4313 return "7M";
4314 case llvm::ARM::AK_ARMV7EM:
4315 return "7EM";
4316 case llvm::ARM::AK_ARMV8A:
4317 return "8A";
4318 case llvm::ARM::AK_ARMV8_1A:
4319 return "8_1A";
4320 }
4321 }
4322
4323 StringRef getCPUProfile() const {
4324 switch(ArchProfile) {
4325 case llvm::ARM::PK_A:
4326 return "A";
4327 case llvm::ARM::PK_R:
4328 return "R";
4329 case llvm::ARM::PK_M:
4330 return "M";
4331 default:
4332 return "";
4333 }
4334 }
4335
Chris Lattner17df24e2008-04-21 18:56:49 +00004336public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004337 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004338 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004339 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004340 BigEndian = IsBigEndian;
4341
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004342 switch (getTriple().getOS()) {
4343 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004344 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004345 break;
4346 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004347 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004348 break;
4349 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004350
Renato Goline84b0002015-10-08 16:43:26 +00004351 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004352 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004353
Chris Lattner1a8f3942010-04-23 16:29:58 +00004354 // {} in inline assembly are neon specifiers, not assembly variant
4355 // specifiers.
4356 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004357
Eric Christopher0e261882014-12-05 01:06:59 +00004358 // FIXME: This duplicates code from the driver that sets the -target-abi
4359 // option - this code is used if -target-abi isn't passed and should
4360 // be unified in some way.
4361 if (Triple.isOSBinFormatMachO()) {
4362 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4363 // the frontend matches that.
4364 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4365 Triple.getOS() == llvm::Triple::UnknownOS ||
4366 StringRef(CPU).startswith("cortex-m")) {
4367 setABI("aapcs");
4368 } else {
4369 setABI("apcs-gnu");
4370 }
4371 } else if (Triple.isOSWindows()) {
4372 // FIXME: this is invalid for WindowsCE
4373 setABI("aapcs");
4374 } else {
4375 // Select the default based on the platform.
4376 switch (Triple.getEnvironment()) {
4377 case llvm::Triple::Android:
4378 case llvm::Triple::GNUEABI:
4379 case llvm::Triple::GNUEABIHF:
4380 setABI("aapcs-linux");
4381 break;
4382 case llvm::Triple::EABIHF:
4383 case llvm::Triple::EABI:
4384 setABI("aapcs");
4385 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004386 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004387 setABI("apcs-gnu");
4388 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004389 default:
4390 if (Triple.getOS() == llvm::Triple::NetBSD)
4391 setABI("apcs-gnu");
4392 else
4393 setABI("aapcs");
4394 break;
4395 }
4396 }
John McCall86353412010-08-21 22:46:04 +00004397
4398 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004399 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004400
Renato Golin15b86152015-07-03 16:41:13 +00004401 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004402 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004403
James Molloya7139222012-03-12 09:14:10 +00004404 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004405 // the alignment of the zero-length bitfield is greater than the member
4406 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004407 // zero length bitfield.
4408 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004409 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004410
Alp Toker4925ba72014-06-07 23:30:42 +00004411 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004412
Craig Topper3164f332014-03-11 03:39:26 +00004413 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004414 ABI = Name;
4415
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004416 // The defaults (above) are for AAPCS, check if we need to change them.
4417 //
4418 // FIXME: We need support for -meabi... we could just mangle it into the
4419 // name.
4420 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004421 setABIAPCS();
4422 return true;
4423 }
4424 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4425 setABIAAPCS();
4426 return true;
4427 }
4428 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004429 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004430
Renato Golinf5c4dec2015-05-27 13:33:00 +00004431 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004432 bool
4433 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4434 StringRef CPU,
4435 const std::vector<std::string> &FeaturesVec) const override {
4436
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004437 std::vector<const char*> TargetFeatures;
4438
4439 // get default FPU features
4440 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU);
4441 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4442
4443 // get default Extension features
4444 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU);
4445 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4446
4447 for (const char *Feature : TargetFeatures)
4448 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004449 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004450
Eric Christopher007b0a02015-08-28 22:32:01 +00004451 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004452 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004453
Craig Topper3164f332014-03-11 03:39:26 +00004454 bool handleTargetFeatures(std::vector<std::string> &Features,
4455 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004456 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004457 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004458 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004459 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004460 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004461 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004462 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004463
Ranjeet Singhac08e532015-06-24 23:39:25 +00004464 // This does not diagnose illegal cases like having both
4465 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4466 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004467 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004468 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004469 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004470 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004471 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004472 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004473 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004474 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004475 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004476 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004477 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004478 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004479 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004480 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004481 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004482 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004483 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004484 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004485 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004486 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004487 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004488 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004489 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004490 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004491 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004492 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004493 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004494 Crypto = 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004495 } else if (Feature == "+t2dsp") {
4496 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004497 } else if (Feature == "+fp-only-sp") {
Ranjeet Singhac08e532015-06-24 23:39:25 +00004498 HW_FP_remove |= HW_FP_DP | HW_FP_HP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004499 } else if (Feature == "+strict-align") {
4500 Unaligned = 0;
4501 } else if (Feature == "+fp16") {
4502 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004503 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004504 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004505 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004506
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004507 switch (ArchVersion) {
4508 case 6:
4509 if (ArchProfile == llvm::ARM::PK_M)
4510 LDREX = 0;
4511 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4512 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4513 else
4514 LDREX = LDREX_W;
4515 break;
4516 case 7:
4517 if (ArchProfile == llvm::ARM::PK_M)
4518 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4519 else
4520 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4521 break;
4522 case 8:
4523 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4524 }
4525
Rafael Espindolaeb265472013-08-21 21:59:03 +00004526 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4527 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4528 return false;
4529 }
4530
4531 if (FPMath == FP_Neon)
4532 Features.push_back("+neonfp");
4533 else if (FPMath == FP_VFP)
4534 Features.push_back("-neonfp");
4535
Daniel Dunbar893d4752009-12-19 04:15:38 +00004536 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004537 auto Feature =
4538 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4539 if (Feature != Features.end())
4540 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004541
Rafael Espindolaeb265472013-08-21 21:59:03 +00004542 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004543 }
4544
Craig Topper3164f332014-03-11 03:39:26 +00004545 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004546 return llvm::StringSwitch<bool>(Feature)
4547 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004548 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004549 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004550 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004551 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004552 .Case("hwdiv", HWDiv & HWDivThumb)
4553 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004554 .Default(false);
4555 }
Renato Golin15b86152015-07-03 16:41:13 +00004556
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004557 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004558 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004559 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004560
Renato Golin15b86152015-07-03 16:41:13 +00004561 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004562 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004563 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004564 CPU = Name;
4565 return true;
4566 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004567
Craig Topper3164f332014-03-11 03:39:26 +00004568 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004569
Craig Topper3164f332014-03-11 03:39:26 +00004570 void getTargetDefines(const LangOptions &Opts,
4571 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004572 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004573 Builder.defineMacro("__arm");
4574 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004575
Chris Lattnerecd49032009-03-02 22:27:17 +00004576 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004577 Builder.defineMacro("__REGISTER_PREFIX__", "");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004578 if (!CPUAttr.empty())
4579 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004580
4581 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004582 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004583 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004584
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004585 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004586 // ACLE 6.5.7 Crypto Extension
4587 if (Crypto)
4588 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4589 // ACLE 6.5.8 CRC32 Extension
4590 if (CRC)
4591 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4592 // ACLE 6.5.10 Numeric Maximum and Minimum
4593 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4594 // ACLE 6.5.9 Directed Rounding
4595 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004596 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004597
4598 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4599 // is not defined for the M-profile.
4600 // NOTE that the deffault profile is assumed to be 'A'
4601 if (CPUProfile.empty() || CPUProfile != "M")
4602 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4603
4604 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4605 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4606 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004607 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004608 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004609 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004610 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4611
4612 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4613 // instruction set such as ARM or Thumb.
4614 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4615
4616 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4617
4618 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004619 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004620 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004621
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004622 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004623 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004624 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004625
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004626 // ACLE 6.4.4 LDREX/STREX
4627 if (LDREX)
4628 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4629
4630 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004631 if (ArchVersion == 5 ||
4632 (ArchVersion == 6 && CPUProfile != "M") ||
4633 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004634 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4635
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004636 // ACLE 6.5.1 Hardware Floating Point
4637 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004638 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004639
Yi Konga44c4d72014-06-27 21:25:42 +00004640 // ACLE predefines.
4641 Builder.defineMacro("__ARM_ACLE", "200");
4642
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004643 // FP16 support (we currently only support IEEE format).
4644 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4645 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4646
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004647 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4648 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4649 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4650
Mike Stump9d54bd72009-04-08 02:07:04 +00004651 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004652
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004653 // FIXME: It's more complicated than this and we don't really support
4654 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004655 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004656 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004657 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004658
David Tweed8f676532012-10-25 13:33:01 +00004659 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004660 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004661 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4662 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004663 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004664 Builder.defineMacro("__ARM_PCS", "1");
4665
David Tweed8f676532012-10-25 13:33:01 +00004666 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004667 Builder.defineMacro("__ARM_PCS_VFP", "1");
4668 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004669
Daniel Dunbar893d4752009-12-19 04:15:38 +00004670 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004671 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004672
4673 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004674 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004675
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004676 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004677 Builder.defineMacro("__THUMBEL__");
4678 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004679 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004680 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004681 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004682
4683 // ACLE 6.4.9 32-bit SIMD instructions
4684 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4685 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4686
4687 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004688 if (((HWDiv & HWDivThumb) && isThumb()) ||
4689 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004690 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004691 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004692 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004693
4694 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004695 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004696
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004697 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004698 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004699 if (FPU & VFP2FPU)
4700 Builder.defineMacro("__ARM_VFPV2__");
4701 if (FPU & VFP3FPU)
4702 Builder.defineMacro("__ARM_VFPV3__");
4703 if (FPU & VFP4FPU)
4704 Builder.defineMacro("__ARM_VFPV4__");
4705 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004706
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004707 // This only gets set when Neon instructions are actually available, unlike
4708 // the VFP define, hence the soft float and arch check. This is subtly
4709 // different from gcc, we follow the intent which was that it should be set
4710 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004711 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004712 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004713 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004714 // current AArch32 NEON implementations do not support double-precision
4715 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004716 Builder.defineMacro("__ARM_NEON_FP",
4717 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004718 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004719
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004720 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4721 Opts.ShortWChar ? "2" : "4");
4722
4723 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4724 Opts.ShortEnums ? "1" : "4");
4725
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004726 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004727 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4728 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4729 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4730 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4731 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004732
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004733 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004734 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004735 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004736 }
4737
4738 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004739 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004740 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4741 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004742 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004743 }
4744
4745 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004746 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004747 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004748
4749 if (Opts.UnsafeFPMath)
4750 Builder.defineMacro("__ARM_FP_FAST", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004751 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004752
Craig Topper3164f332014-03-11 03:39:26 +00004753 void getTargetBuiltins(const Builtin::Info *&Records,
4754 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004755 Records = BuiltinInfo;
4756 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004757 }
Craig Topper3164f332014-03-11 03:39:26 +00004758 bool isCLZForZeroUndef() const override { return false; }
4759 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004760 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004761 }
Craig Topper3164f332014-03-11 03:39:26 +00004762 void getGCCRegNames(const char * const *&Names,
4763 unsigned &NumNames) const override;
4764 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4765 unsigned &NumAliases) const override;
4766 bool validateAsmConstraint(const char *&Name,
4767 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004768 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004769 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004770 case 'l': // r0-r7
4771 case 'h': // r8-r15
4772 case 'w': // VFP Floating point register single precision
4773 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004774 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004775 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004776 case 'I':
4777 case 'J':
4778 case 'K':
4779 case 'L':
4780 case 'M':
4781 // FIXME
4782 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004783 case 'Q': // A memory address that is a single base register.
4784 Info.setAllowsMemory();
4785 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004786 case 'U': // a memory reference...
4787 switch (Name[1]) {
4788 case 'q': // ...ARMV4 ldrsb
4789 case 'v': // ...VFP load/store (reg+constant offset)
4790 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004791 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004792 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004793 case 'n': // valid address for Neon doubleword vector load/store
4794 case 'm': // valid address for Neon element and structure load/store
4795 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004796 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004797 Info.setAllowsMemory();
4798 Name++;
4799 return true;
4800 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004801 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004802 return false;
4803 }
Craig Topper3164f332014-03-11 03:39:26 +00004804 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004805 std::string R;
4806 switch (*Constraint) {
4807 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004808 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004809 Constraint++;
4810 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004811 case 'p': // 'p' should be translated to 'r' by default.
4812 R = std::string("r");
4813 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004814 default:
4815 return std::string(1, *Constraint);
4816 }
4817 return R;
4818 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004819 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004820 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004821 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004822 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004823 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004824
Bill Wendling9d1ee112012-10-25 23:28:48 +00004825 // Strip off constraint modifiers.
4826 while (Constraint[0] == '=' ||
4827 Constraint[0] == '+' ||
4828 Constraint[0] == '&')
4829 Constraint = Constraint.substr(1);
4830
4831 switch (Constraint[0]) {
4832 default: break;
4833 case 'r': {
4834 switch (Modifier) {
4835 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004836 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004837 case 'q':
4838 // A register of size 32 cannot fit a vector type.
4839 return false;
4840 }
4841 }
4842 }
4843
4844 return true;
4845 }
Craig Topper3164f332014-03-11 03:39:26 +00004846 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004847 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004848 return "";
4849 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004850
Craig Topper3164f332014-03-11 03:39:26 +00004851 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004852 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4853 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004854
Craig Topper3164f332014-03-11 03:39:26 +00004855 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004856 if (RegNo == 0) return 0;
4857 if (RegNo == 1) return 1;
4858 return -1;
4859 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004860
4861 bool hasSjLjLowering() const override {
4862 return true;
4863 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004864};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004865
Rafael Espindolaeb265472013-08-21 21:59:03 +00004866bool ARMTargetInfo::setFPMath(StringRef Name) {
4867 if (Name == "neon") {
4868 FPMath = FP_Neon;
4869 return true;
4870 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4871 Name == "vfp4") {
4872 FPMath = FP_VFP;
4873 return true;
4874 }
4875 return false;
4876}
4877
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004878const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004879 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004880 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004881 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4882
4883 // Float registers
4884 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4885 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4886 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004887 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004888
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004889 // Double registers
4890 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4891 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004892 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4893 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004894
4895 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004896 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4897 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004898};
4899
4900void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004901 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004902 Names = GCCRegNames;
4903 NumNames = llvm::array_lengthof(GCCRegNames);
4904}
4905
4906const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004907 { { "a1" }, "r0" },
4908 { { "a2" }, "r1" },
4909 { { "a3" }, "r2" },
4910 { { "a4" }, "r3" },
4911 { { "v1" }, "r4" },
4912 { { "v2" }, "r5" },
4913 { { "v3" }, "r6" },
4914 { { "v4" }, "r7" },
4915 { { "v5" }, "r8" },
4916 { { "v6", "rfp" }, "r9" },
4917 { { "sl" }, "r10" },
4918 { { "fp" }, "r11" },
4919 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004920 { { "r13" }, "sp" },
4921 { { "r14" }, "lr" },
4922 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004923 // The S, D and Q registers overlap, but aren't really aliases; we
4924 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004925};
4926
4927void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4928 unsigned &NumAliases) const {
4929 Aliases = GCCRegAliases;
4930 NumAliases = llvm::array_lengthof(GCCRegAliases);
4931}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004932
4933const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00004934#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004935 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004936#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4937 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00004938#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004939
Craig Topper07d3b622015-08-07 05:14:44 +00004940#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004941 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004942#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00004943 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00004944#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4945 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004946#include "clang/Basic/BuiltinsARM.def"
4947};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004948
4949class ARMleTargetInfo : public ARMTargetInfo {
4950public:
4951 ARMleTargetInfo(const llvm::Triple &Triple)
4952 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004953 void getTargetDefines(const LangOptions &Opts,
4954 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004955 Builder.defineMacro("__ARMEL__");
4956 ARMTargetInfo::getTargetDefines(Opts, Builder);
4957 }
4958};
4959
4960class ARMbeTargetInfo : public ARMTargetInfo {
4961public:
4962 ARMbeTargetInfo(const llvm::Triple &Triple)
4963 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004964 void getTargetDefines(const LangOptions &Opts,
4965 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004966 Builder.defineMacro("__ARMEB__");
4967 Builder.defineMacro("__ARM_BIG_ENDIAN");
4968 ARMTargetInfo::getTargetDefines(Opts, Builder);
4969 }
4970};
Chris Lattner17df24e2008-04-21 18:56:49 +00004971
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004972class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4973 const llvm::Triple Triple;
4974public:
4975 WindowsARMTargetInfo(const llvm::Triple &Triple)
4976 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4977 TLSSupported = false;
4978 WCharType = UnsignedShort;
4979 SizeType = UnsignedInt;
4980 UserLabelPrefix = "";
4981 }
4982 void getVisualStudioDefines(const LangOptions &Opts,
4983 MacroBuilder &Builder) const {
4984 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4985
4986 // FIXME: this is invalid for WindowsCE
4987 Builder.defineMacro("_M_ARM_NT", "1");
4988 Builder.defineMacro("_M_ARMT", "_M_ARM");
4989 Builder.defineMacro("_M_THUMB", "_M_ARM");
4990
4991 assert((Triple.getArch() == llvm::Triple::arm ||
4992 Triple.getArch() == llvm::Triple::thumb) &&
4993 "invalid architecture for Windows ARM target info");
4994 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4995 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4996
4997 // TODO map the complete set of values
4998 // 31: VFPv3 40: VFPv4
4999 Builder.defineMacro("_M_ARM_FP", "31");
5000 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005001 BuiltinVaListKind getBuiltinVaListKind() const override {
5002 return TargetInfo::CharPtrBuiltinVaList;
5003 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005004 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5005 switch (CC) {
5006 case CC_X86StdCall:
5007 case CC_X86ThisCall:
5008 case CC_X86FastCall:
5009 case CC_X86VectorCall:
5010 return CCCR_Ignore;
5011 case CC_C:
5012 return CCCR_OK;
5013 default:
5014 return CCCR_Warning;
5015 }
5016 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005017};
5018
5019// Windows ARM + Itanium C++ ABI Target
5020class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5021public:
5022 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5023 : WindowsARMTargetInfo(Triple) {
5024 TheCXXABI.set(TargetCXXABI::GenericARM);
5025 }
5026
5027 void getTargetDefines(const LangOptions &Opts,
5028 MacroBuilder &Builder) const override {
5029 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5030
5031 if (Opts.MSVCCompat)
5032 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5033 }
5034};
5035
5036// Windows ARM, MS (C++) ABI
5037class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5038public:
5039 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5040 : WindowsARMTargetInfo(Triple) {
5041 TheCXXABI.set(TargetCXXABI::Microsoft);
5042 }
5043
5044 void getTargetDefines(const LangOptions &Opts,
5045 MacroBuilder &Builder) const override {
5046 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5047 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5048 }
5049};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005050
Yaron Keren321249c2015-07-15 13:32:23 +00005051// ARM MinGW target
5052class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5053public:
5054 MinGWARMTargetInfo(const llvm::Triple &Triple)
5055 : WindowsARMTargetInfo(Triple) {
5056 TheCXXABI.set(TargetCXXABI::GenericARM);
5057 }
5058
5059 void getTargetDefines(const LangOptions &Opts,
5060 MacroBuilder &Builder) const override {
5061 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5062 DefineStd(Builder, "WIN32", Opts);
5063 DefineStd(Builder, "WINNT", Opts);
5064 Builder.defineMacro("_ARM_");
5065 addMinGWDefines(Opts, Builder);
5066 }
5067};
5068
5069// ARM Cygwin target
5070class CygwinARMTargetInfo : public ARMleTargetInfo {
5071public:
5072 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5073 TLSSupported = false;
5074 WCharType = UnsignedShort;
5075 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005076 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005077 }
5078 void getTargetDefines(const LangOptions &Opts,
5079 MacroBuilder &Builder) const override {
5080 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5081 Builder.defineMacro("_ARM_");
5082 Builder.defineMacro("__CYGWIN__");
5083 Builder.defineMacro("__CYGWIN32__");
5084 DefineStd(Builder, "unix", Opts);
5085 if (Opts.CPlusPlus)
5086 Builder.defineMacro("_GNU_SOURCE");
5087 }
5088};
5089
Mike Stump11289f42009-09-09 15:08:12 +00005090class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005091 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005092protected:
Craig Topper3164f332014-03-11 03:39:26 +00005093 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5094 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005095 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005096 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005097
Torok Edwinb2b37c62009-06-30 17:10:35 +00005098public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005099 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005100 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005101 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005102 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005103 // FIXME: This should be based off of the target features in
5104 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005105 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005106
5107 // Darwin on iOS uses a variant of the ARM C++ ABI.
5108 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005109 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005110};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005111
Tim Northover573cbee2014-05-24 12:52:07 +00005112class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005113 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005114 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5115 static const char *const GCCRegNames[];
5116
James Molloy75f5f9e2014-04-16 15:33:48 +00005117 enum FPUModeEnum {
5118 FPUMode,
5119 NeonMode
5120 };
5121
5122 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005123 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005124 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005125 unsigned Unaligned;
James Molloy75f5f9e2014-04-16 15:33:48 +00005126
Tim Northovera2ee4332014-03-29 15:09:45 +00005127 static const Builtin::Info BuiltinInfo[];
5128
5129 std::string ABI;
5130
5131public:
Tim Northover573cbee2014-05-24 12:52:07 +00005132 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005133 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005134
5135 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5136 WCharType = SignedInt;
5137
5138 // NetBSD apparently prefers consistency across ARM targets to consistency
5139 // across 64-bit targets.
5140 Int64Type = SignedLongLong;
5141 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005142 } else {
5143 WCharType = UnsignedInt;
5144 Int64Type = SignedLong;
5145 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005146 }
5147
Tim Northovera2ee4332014-03-29 15:09:45 +00005148 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005149 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005150 MaxAtomicInlineWidth = 128;
5151 MaxAtomicPromoteWidth = 128;
5152
Tim Northovera6a19f12015-02-06 01:25:07 +00005153 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005154 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5155
Tim Northovera2ee4332014-03-29 15:09:45 +00005156 // {} in inline assembly are neon specifiers, not assembly variant
5157 // specifiers.
5158 NoAsmVariants = true;
5159
Tim Northover7ad87af2015-01-16 18:44:04 +00005160 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5161 // contributes to the alignment of the containing aggregate in the same way
5162 // a plain (non bit-field) member of that type would, without exception for
5163 // zero-sized or anonymous bit-fields."
5164 UseBitFieldTypeAlignment = true;
5165 UseZeroLengthBitfieldAlignment = true;
5166
Tim Northover573cbee2014-05-24 12:52:07 +00005167 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005168 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5169 }
5170
Alp Toker4925ba72014-06-07 23:30:42 +00005171 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005172 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005173 if (Name != "aapcs" && Name != "darwinpcs")
5174 return false;
5175
5176 ABI = Name;
5177 return true;
5178 }
5179
David Blaikie1cbb9712014-11-14 19:09:44 +00005180 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005181 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005182 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005183 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005184 .Case("cyclone", true)
5185 .Default(false);
5186 return CPUKnown;
5187 }
5188
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005189 void getTargetDefines(const LangOptions &Opts,
5190 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005191 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005192 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005193
5194 // Target properties.
5195 Builder.defineMacro("_LP64");
5196 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005197
5198 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5199 Builder.defineMacro("__ARM_ACLE", "200");
5200 Builder.defineMacro("__ARM_ARCH", "8");
5201 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5202
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005203 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005204 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005205 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005206
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005207 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5208 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5209 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5210 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005211 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005212 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5213 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005214
5215 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5216
5217 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005218 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005219
5220 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5221 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005222 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5223 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005224
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005225 if (Opts.UnsafeFPMath)
5226 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005227
5228 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5229
5230 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5231 Opts.ShortEnums ? "1" : "4");
5232
James Molloy75f5f9e2014-04-16 15:33:48 +00005233 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005234 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005235 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005236 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005237 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005238
Bradley Smith418c5932014-05-02 15:17:51 +00005239 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005240 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005241
James Molloy75f5f9e2014-04-16 15:33:48 +00005242 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005243 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5244
5245 if (Unaligned)
5246 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005247
5248 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5249 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5250 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5251 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5252 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005253 }
5254
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005255 void getTargetBuiltins(const Builtin::Info *&Records,
5256 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005257 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00005258 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00005259 }
5260
David Blaikie1cbb9712014-11-14 19:09:44 +00005261 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005262 return Feature == "aarch64" ||
5263 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005264 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005265 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005266 }
5267
James Molloy5e73df52014-04-16 15:06:20 +00005268 bool handleTargetFeatures(std::vector<std::string> &Features,
5269 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005270 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005271 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005272 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005273 Unaligned = 1;
5274
Eric Christopher610fe112015-08-26 08:21:55 +00005275 for (const auto &Feature : Features) {
5276 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005277 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005278 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005279 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005280 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005281 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005282 if (Feature == "+strict-align")
5283 Unaligned = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005284 }
5285
Eric Christopher964a5f32015-08-05 23:48:05 +00005286 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005287
5288 return true;
5289 }
5290
David Blaikie1cbb9712014-11-14 19:09:44 +00005291 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005292
David Blaikie1cbb9712014-11-14 19:09:44 +00005293 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005294 return TargetInfo::AArch64ABIBuiltinVaList;
5295 }
5296
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005297 void getGCCRegNames(const char *const *&Names,
5298 unsigned &NumNames) const override;
5299 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5300 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005301
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005302 bool validateAsmConstraint(const char *&Name,
5303 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005304 switch (*Name) {
5305 default:
5306 return false;
5307 case 'w': // Floating point and SIMD registers (V0-V31)
5308 Info.setAllowsRegister();
5309 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005310 case 'I': // Constant that can be used with an ADD instruction
5311 case 'J': // Constant that can be used with a SUB instruction
5312 case 'K': // Constant that can be used with a 32-bit logical instruction
5313 case 'L': // Constant that can be used with a 64-bit logical instruction
5314 case 'M': // Constant that can be used as a 32-bit MOV immediate
5315 case 'N': // Constant that can be used as a 64-bit MOV immediate
5316 case 'Y': // Floating point constant zero
5317 case 'Z': // Integer constant zero
5318 return true;
5319 case 'Q': // A memory reference with base register and no offset
5320 Info.setAllowsMemory();
5321 return true;
5322 case 'S': // A symbolic address
5323 Info.setAllowsRegister();
5324 return true;
5325 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005326 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5327 // Utf: A memory address suitable for ldp/stp in TF mode.
5328 // Usa: An absolute symbolic address.
5329 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5330 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005331 case 'z': // Zero register, wzr or xzr
5332 Info.setAllowsRegister();
5333 return true;
5334 case 'x': // Floating point and SIMD registers (V0-V15)
5335 Info.setAllowsRegister();
5336 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005337 }
5338 return false;
5339 }
5340
Akira Hatanaka987f1862014-08-22 06:05:21 +00005341 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005342 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005343 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005344 // Strip off constraint modifiers.
5345 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5346 Constraint = Constraint.substr(1);
5347
5348 switch (Constraint[0]) {
5349 default:
5350 return true;
5351 case 'z':
5352 case 'r': {
5353 switch (Modifier) {
5354 case 'x':
5355 case 'w':
5356 // For now assume that the person knows what they're
5357 // doing with the modifier.
5358 return true;
5359 default:
5360 // By default an 'r' constraint will be in the 'x'
5361 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005362 if (Size == 64)
5363 return true;
5364
5365 SuggestedModifier = "w";
5366 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005367 }
5368 }
5369 }
5370 }
5371
David Blaikie1cbb9712014-11-14 19:09:44 +00005372 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005373
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005374 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005375 if (RegNo == 0)
5376 return 0;
5377 if (RegNo == 1)
5378 return 1;
5379 return -1;
5380 }
5381};
5382
Tim Northover573cbee2014-05-24 12:52:07 +00005383const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005384 // 32-bit Integer registers
5385 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5386 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5387 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5388
5389 // 64-bit Integer registers
5390 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5391 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5392 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5393
5394 // 32-bit floating point regsisters
5395 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5396 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5397 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5398
5399 // 64-bit floating point regsisters
5400 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5401 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5402 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5403
5404 // Vector registers
5405 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5406 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5407 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5408};
5409
Tim Northover573cbee2014-05-24 12:52:07 +00005410void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005411 unsigned &NumNames) const {
5412 Names = GCCRegNames;
5413 NumNames = llvm::array_lengthof(GCCRegNames);
5414}
5415
Tim Northover573cbee2014-05-24 12:52:07 +00005416const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005417 { { "w31" }, "wsp" },
5418 { { "x29" }, "fp" },
5419 { { "x30" }, "lr" },
5420 { { "x31" }, "sp" },
5421 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5422 // don't want to substitute one of these for a different-sized one.
5423};
5424
Tim Northover573cbee2014-05-24 12:52:07 +00005425void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005426 unsigned &NumAliases) const {
5427 Aliases = GCCRegAliases;
5428 NumAliases = llvm::array_lengthof(GCCRegAliases);
5429}
5430
Tim Northover573cbee2014-05-24 12:52:07 +00005431const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005432#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005433 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005434#include "clang/Basic/BuiltinsNEON.def"
5435
5436#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005437 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005438#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005439};
James Molloy5e73df52014-04-16 15:06:20 +00005440
Tim Northover573cbee2014-05-24 12:52:07 +00005441class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005442 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005443 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005444 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005445 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005446 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005447 }
5448
5449public:
Tim Northover573cbee2014-05-24 12:52:07 +00005450 AArch64leTargetInfo(const llvm::Triple &Triple)
5451 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005452 BigEndian = false;
5453 }
5454 void getTargetDefines(const LangOptions &Opts,
5455 MacroBuilder &Builder) const override {
5456 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005457 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005458 }
5459};
5460
Tim Northover573cbee2014-05-24 12:52:07 +00005461class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005462 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005463 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005464 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005465 }
5466
5467public:
Tim Northover573cbee2014-05-24 12:52:07 +00005468 AArch64beTargetInfo(const llvm::Triple &Triple)
5469 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005470 void getTargetDefines(const LangOptions &Opts,
5471 MacroBuilder &Builder) const override {
5472 Builder.defineMacro("__AARCH64EB__");
5473 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5474 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005475 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005476 }
5477};
Tim Northovera2ee4332014-03-29 15:09:45 +00005478
Tim Northover573cbee2014-05-24 12:52:07 +00005479class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005480protected:
5481 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5482 MacroBuilder &Builder) const override {
5483 Builder.defineMacro("__AARCH64_SIMD__");
5484 Builder.defineMacro("__ARM64_ARCH_8__");
5485 Builder.defineMacro("__ARM_NEON__");
5486 Builder.defineMacro("__LITTLE_ENDIAN__");
5487 Builder.defineMacro("__REGISTER_PREFIX__", "");
5488 Builder.defineMacro("__arm64", "1");
5489 Builder.defineMacro("__arm64__", "1");
5490
5491 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5492 }
5493
Tim Northovera2ee4332014-03-29 15:09:45 +00005494public:
Tim Northover573cbee2014-05-24 12:52:07 +00005495 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5496 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005497 Int64Type = SignedLongLong;
5498 WCharType = SignedInt;
5499 UseSignedCharForObjCBool = false;
5500
Tim Northovera6a19f12015-02-06 01:25:07 +00005501 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005502 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5503
5504 TheCXXABI.set(TargetCXXABI::iOS64);
5505 }
5506
David Blaikie1cbb9712014-11-14 19:09:44 +00005507 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005508 return TargetInfo::CharPtrBuiltinVaList;
5509 }
5510};
Tim Northovera2ee4332014-03-29 15:09:45 +00005511
Tony Linthicum76329bf2011-12-12 21:14:55 +00005512// Hexagon abstract base class
5513class HexagonTargetInfo : public TargetInfo {
5514 static const Builtin::Info BuiltinInfo[];
5515 static const char * const GCCRegNames[];
5516 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5517 std::string CPU;
5518public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005519 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005520 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00005521 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005522
5523 // {} in inline assembly are packet specifiers, not assembly variant
5524 // specifiers.
5525 NoAsmVariants = true;
5526 }
5527
Craig Topper3164f332014-03-11 03:39:26 +00005528 void getTargetBuiltins(const Builtin::Info *&Records,
5529 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005530 Records = BuiltinInfo;
5531 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5532 }
5533
Craig Topper3164f332014-03-11 03:39:26 +00005534 bool validateAsmConstraint(const char *&Name,
5535 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005536 return true;
5537 }
5538
Craig Topper3164f332014-03-11 03:39:26 +00005539 void getTargetDefines(const LangOptions &Opts,
5540 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005541
Craig Topper3164f332014-03-11 03:39:26 +00005542 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005543 return Feature == "hexagon";
5544 }
Craig Topper3164f332014-03-11 03:39:26 +00005545
5546 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005547 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005548 }
Craig Topper3164f332014-03-11 03:39:26 +00005549 void getGCCRegNames(const char * const *&Names,
5550 unsigned &NumNames) const override;
5551 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5552 unsigned &NumAliases) const override;
5553 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005554 return "";
5555 }
Sebastian Pop86500282012-01-13 20:37:10 +00005556
5557 static const char *getHexagonCPUSuffix(StringRef Name) {
5558 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005559 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005560 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005561 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005562 }
5563
Craig Topper3164f332014-03-11 03:39:26 +00005564 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005565 if (!getHexagonCPUSuffix(Name))
5566 return false;
5567
Tony Linthicum76329bf2011-12-12 21:14:55 +00005568 CPU = Name;
5569 return true;
5570 }
5571};
5572
5573void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5574 MacroBuilder &Builder) const {
5575 Builder.defineMacro("qdsp6");
5576 Builder.defineMacro("__qdsp6", "1");
5577 Builder.defineMacro("__qdsp6__", "1");
5578
5579 Builder.defineMacro("hexagon");
5580 Builder.defineMacro("__hexagon", "1");
5581 Builder.defineMacro("__hexagon__", "1");
5582
5583 if(CPU == "hexagonv1") {
5584 Builder.defineMacro("__HEXAGON_V1__");
5585 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5586 if(Opts.HexagonQdsp6Compat) {
5587 Builder.defineMacro("__QDSP6_V1__");
5588 Builder.defineMacro("__QDSP6_ARCH__", "1");
5589 }
5590 }
5591 else if(CPU == "hexagonv2") {
5592 Builder.defineMacro("__HEXAGON_V2__");
5593 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5594 if(Opts.HexagonQdsp6Compat) {
5595 Builder.defineMacro("__QDSP6_V2__");
5596 Builder.defineMacro("__QDSP6_ARCH__", "2");
5597 }
5598 }
5599 else if(CPU == "hexagonv3") {
5600 Builder.defineMacro("__HEXAGON_V3__");
5601 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5602 if(Opts.HexagonQdsp6Compat) {
5603 Builder.defineMacro("__QDSP6_V3__");
5604 Builder.defineMacro("__QDSP6_ARCH__", "3");
5605 }
5606 }
5607 else if(CPU == "hexagonv4") {
5608 Builder.defineMacro("__HEXAGON_V4__");
5609 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5610 if(Opts.HexagonQdsp6Compat) {
5611 Builder.defineMacro("__QDSP6_V4__");
5612 Builder.defineMacro("__QDSP6_ARCH__", "4");
5613 }
5614 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005615 else if(CPU == "hexagonv5") {
5616 Builder.defineMacro("__HEXAGON_V5__");
5617 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5618 if(Opts.HexagonQdsp6Compat) {
5619 Builder.defineMacro("__QDSP6_V5__");
5620 Builder.defineMacro("__QDSP6_ARCH__", "5");
5621 }
5622 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005623}
5624
5625const char * const HexagonTargetInfo::GCCRegNames[] = {
5626 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5627 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5628 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5629 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5630 "p0", "p1", "p2", "p3",
5631 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5632};
5633
5634void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5635 unsigned &NumNames) const {
5636 Names = GCCRegNames;
5637 NumNames = llvm::array_lengthof(GCCRegNames);
5638}
5639
5640
5641const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5642 { { "sp" }, "r29" },
5643 { { "fp" }, "r30" },
5644 { { "lr" }, "r31" },
5645 };
5646
5647void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5648 unsigned &NumAliases) const {
5649 Aliases = GCCRegAliases;
5650 NumAliases = llvm::array_lengthof(GCCRegAliases);
5651}
5652
5653
5654const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005655#define BUILTIN(ID, TYPE, ATTRS) \
5656 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5657#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5658 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005659#include "clang/Basic/BuiltinsHexagon.def"
5660};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005661
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005662// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5663class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005664 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5665 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005666 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005667public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005668 SparcTargetInfo(const llvm::Triple &Triple)
5669 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005670
Craig Topper3164f332014-03-11 03:39:26 +00005671 bool handleTargetFeatures(std::vector<std::string> &Features,
5672 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005673 // The backend doesn't actually handle soft float yet, but in case someone
5674 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005675 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5676 if (Feature != Features.end()) {
5677 SoftFloat = true;
5678 Features.erase(Feature);
5679 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005680 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005681 }
Craig Topper3164f332014-03-11 03:39:26 +00005682 void getTargetDefines(const LangOptions &Opts,
5683 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005684 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005685 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005686
5687 if (SoftFloat)
5688 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005689 }
Craig Topper3164f332014-03-11 03:39:26 +00005690
5691 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005692 return llvm::StringSwitch<bool>(Feature)
5693 .Case("softfloat", SoftFloat)
5694 .Case("sparc", true)
5695 .Default(false);
5696 }
Craig Topper3164f332014-03-11 03:39:26 +00005697
5698 void getTargetBuiltins(const Builtin::Info *&Records,
5699 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005700 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005701 }
Craig Topper3164f332014-03-11 03:39:26 +00005702 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005703 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005704 }
Craig Topper3164f332014-03-11 03:39:26 +00005705 void getGCCRegNames(const char * const *&Names,
5706 unsigned &NumNames) const override;
5707 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5708 unsigned &NumAliases) const override;
5709 bool validateAsmConstraint(const char *&Name,
5710 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005711 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005712 switch (*Name) {
5713 case 'I': // Signed 13-bit constant
5714 case 'J': // Zero
5715 case 'K': // 32-bit constant with the low 12 bits clear
5716 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5717 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5718 case 'N': // Same as 'K' but zext (required for SIMode)
5719 case 'O': // The constant 4096
5720 return true;
5721 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005722 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005723 }
Craig Topper3164f332014-03-11 03:39:26 +00005724 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005725 // FIXME: Implement!
5726 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005727 }
5728};
5729
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005730const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005731 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5732 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5733 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5734 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5735};
5736
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005737void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5738 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005739 Names = GCCRegNames;
5740 NumNames = llvm::array_lengthof(GCCRegNames);
5741}
5742
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005743const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005744 { { "g0" }, "r0" },
5745 { { "g1" }, "r1" },
5746 { { "g2" }, "r2" },
5747 { { "g3" }, "r3" },
5748 { { "g4" }, "r4" },
5749 { { "g5" }, "r5" },
5750 { { "g6" }, "r6" },
5751 { { "g7" }, "r7" },
5752 { { "o0" }, "r8" },
5753 { { "o1" }, "r9" },
5754 { { "o2" }, "r10" },
5755 { { "o3" }, "r11" },
5756 { { "o4" }, "r12" },
5757 { { "o5" }, "r13" },
5758 { { "o6", "sp" }, "r14" },
5759 { { "o7" }, "r15" },
5760 { { "l0" }, "r16" },
5761 { { "l1" }, "r17" },
5762 { { "l2" }, "r18" },
5763 { { "l3" }, "r19" },
5764 { { "l4" }, "r20" },
5765 { { "l5" }, "r21" },
5766 { { "l6" }, "r22" },
5767 { { "l7" }, "r23" },
5768 { { "i0" }, "r24" },
5769 { { "i1" }, "r25" },
5770 { { "i2" }, "r26" },
5771 { { "i3" }, "r27" },
5772 { { "i4" }, "r28" },
5773 { { "i5" }, "r29" },
5774 { { "i6", "fp" }, "r30" },
5775 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005776};
5777
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005778void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5779 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005780 Aliases = GCCRegAliases;
5781 NumAliases = llvm::array_lengthof(GCCRegAliases);
5782}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005783
5784// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5785class SparcV8TargetInfo : public SparcTargetInfo {
5786public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005787 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005788 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00005789 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
5790 switch (getTriple().getOS()) {
5791 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00005792 SizeType = UnsignedInt;
5793 IntPtrType = SignedInt;
5794 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00005795 break;
5796 case llvm::Triple::NetBSD:
5797 case llvm::Triple::OpenBSD:
5798 SizeType = UnsignedLong;
5799 IntPtrType = SignedLong;
5800 PtrDiffType = SignedLong;
5801 break;
Brad Smith56495d52015-08-13 22:00:53 +00005802 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005803 }
5804
Craig Topper3164f332014-03-11 03:39:26 +00005805 void getTargetDefines(const LangOptions &Opts,
5806 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005807 SparcTargetInfo::getTargetDefines(Opts, Builder);
5808 Builder.defineMacro("__sparcv8");
5809 }
5810};
5811
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005812// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5813class SparcV8elTargetInfo : public SparcV8TargetInfo {
5814 public:
5815 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005816 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005817 BigEndian = false;
5818 }
5819};
5820
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005821// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5822class SparcV9TargetInfo : public SparcTargetInfo {
5823public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005824 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005825 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00005826 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005827 // This is an LP64 platform.
5828 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005829
5830 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005831 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005832 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005833 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005834 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005835 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005836
5837 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5838 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5839 LongDoubleWidth = 128;
5840 LongDoubleAlign = 128;
5841 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005842 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005843 }
5844
Craig Topper3164f332014-03-11 03:39:26 +00005845 void getTargetDefines(const LangOptions &Opts,
5846 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005847 SparcTargetInfo::getTargetDefines(Opts, Builder);
5848 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005849 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005850 // Solaris doesn't need these variants, but the BSDs do.
5851 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005852 Builder.defineMacro("__sparc64__");
5853 Builder.defineMacro("__sparc_v9__");
5854 Builder.defineMacro("__sparcv9__");
5855 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005856 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005857
Craig Topper3164f332014-03-11 03:39:26 +00005858 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005859 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5860 .Case("v9", true)
5861 .Case("ultrasparc", true)
5862 .Case("ultrasparc3", true)
5863 .Case("niagara", true)
5864 .Case("niagara2", true)
5865 .Case("niagara3", true)
5866 .Case("niagara4", true)
5867 .Default(false);
5868
5869 // No need to store the CPU yet. There aren't any CPU-specific
5870 // macros to define.
5871 return CPUKnown;
5872 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005873};
5874
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005875class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005876 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005877 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005878 std::string CPU;
5879 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005880 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005881
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005882public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005883 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00005884 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
5885 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005886 IntMaxType = SignedLong;
5887 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005888 TLSSupported = true;
5889 IntWidth = IntAlign = 32;
5890 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5891 PointerWidth = PointerAlign = 64;
5892 LongDoubleWidth = 128;
5893 LongDoubleAlign = 64;
5894 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005895 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005896 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00005897 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 +00005898 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5899 }
5900 void getTargetDefines(const LangOptions &Opts,
5901 MacroBuilder &Builder) const override {
5902 Builder.defineMacro("__s390__");
5903 Builder.defineMacro("__s390x__");
5904 Builder.defineMacro("__zarch__");
5905 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005906 if (HasTransactionalExecution)
5907 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005908 if (Opts.ZVector)
5909 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005910 }
5911 void getTargetBuiltins(const Builtin::Info *&Records,
5912 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005913 Records = BuiltinInfo;
5914 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005915 }
5916
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005917 void getGCCRegNames(const char *const *&Names,
5918 unsigned &NumNames) const override;
5919 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5920 unsigned &NumAliases) const override {
5921 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005922 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005923 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005924 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005925 bool validateAsmConstraint(const char *&Name,
5926 TargetInfo::ConstraintInfo &info) const override;
5927 const char *getClobbers() const override {
5928 // FIXME: Is this really right?
5929 return "";
5930 }
5931 BuiltinVaListKind getBuiltinVaListKind() const override {
5932 return TargetInfo::SystemZBuiltinVaList;
5933 }
5934 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005935 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005936 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5937 .Case("z10", true)
5938 .Case("z196", true)
5939 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005940 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005941 .Default(false);
5942
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005943 return CPUKnown;
5944 }
Eric Christopher8c47b422015-10-09 18:39:55 +00005945 bool
5946 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5947 StringRef CPU,
5948 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005949 if (CPU == "zEC12")
5950 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005951 if (CPU == "z13") {
5952 Features["transactional-execution"] = true;
5953 Features["vector"] = true;
5954 }
Eric Christopher007b0a02015-08-28 22:32:01 +00005955 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005956 }
5957
5958 bool handleTargetFeatures(std::vector<std::string> &Features,
5959 DiagnosticsEngine &Diags) override {
5960 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00005961 for (const auto &Feature : Features) {
5962 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005963 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00005964 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005965 HasVector = true;
5966 }
5967 // If we use the vector ABI, vector types are 64-bit aligned.
5968 if (HasVector) {
5969 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005970 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5971 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005972 }
5973 return true;
5974 }
5975
5976 bool hasFeature(StringRef Feature) const override {
5977 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005978 .Case("systemz", true)
5979 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005980 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005981 .Default(false);
5982 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005983
5984 StringRef getABI() const override {
5985 if (HasVector)
5986 return "vector";
5987 return "";
5988 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00005989
5990 bool useFloat128ManglingForLongDouble() const override {
5991 return true;
5992 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005993};
5994
5995const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5996#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005997 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005998#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005999};
6000
6001const char *const SystemZTargetInfo::GCCRegNames[] = {
6002 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6003 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6004 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6005 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6006};
6007
6008void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
6009 unsigned &NumNames) const {
6010 Names = GCCRegNames;
6011 NumNames = llvm::array_lengthof(GCCRegNames);
6012}
6013
6014bool SystemZTargetInfo::
6015validateAsmConstraint(const char *&Name,
6016 TargetInfo::ConstraintInfo &Info) const {
6017 switch (*Name) {
6018 default:
6019 return false;
6020
6021 case 'a': // Address register
6022 case 'd': // Data register (equivalent to 'r')
6023 case 'f': // Floating-point register
6024 Info.setAllowsRegister();
6025 return true;
6026
6027 case 'I': // Unsigned 8-bit constant
6028 case 'J': // Unsigned 12-bit constant
6029 case 'K': // Signed 16-bit constant
6030 case 'L': // Signed 20-bit displacement (on all targets we support)
6031 case 'M': // 0x7fffffff
6032 return true;
6033
6034 case 'Q': // Memory with base and unsigned 12-bit displacement
6035 case 'R': // Likewise, plus an index
6036 case 'S': // Memory with base and signed 20-bit displacement
6037 case 'T': // Likewise, plus an index
6038 Info.setAllowsMemory();
6039 return true;
6040 }
6041}
Ulrich Weigand47445072013-05-06 16:26:41 +00006042
Eric Christopherc48497a2015-09-18 21:26:24 +00006043class MSP430TargetInfo : public TargetInfo {
6044 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006045
Eric Christopherc48497a2015-09-18 21:26:24 +00006046public:
6047 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6048 BigEndian = false;
6049 TLSSupported = false;
6050 IntWidth = 16;
6051 IntAlign = 16;
6052 LongWidth = 32;
6053 LongLongWidth = 64;
6054 LongAlign = LongLongAlign = 16;
6055 PointerWidth = 16;
6056 PointerAlign = 16;
6057 SuitableAlign = 16;
6058 SizeType = UnsignedInt;
6059 IntMaxType = SignedLongLong;
6060 IntPtrType = SignedInt;
6061 PtrDiffType = SignedInt;
6062 SigAtomicType = SignedLong;
6063 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006064 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006065 void getTargetDefines(const LangOptions &Opts,
6066 MacroBuilder &Builder) const override {
6067 Builder.defineMacro("MSP430");
6068 Builder.defineMacro("__MSP430__");
6069 // FIXME: defines for different 'flavours' of MCU
6070 }
6071 void getTargetBuiltins(const Builtin::Info *&Records,
6072 unsigned &NumRecords) const override {
6073 // FIXME: Implement.
6074 Records = nullptr;
6075 NumRecords = 0;
6076 }
6077 bool hasFeature(StringRef Feature) const override {
6078 return Feature == "msp430";
6079 }
6080 void getGCCRegNames(const char *const *&Names,
6081 unsigned &NumNames) const override;
6082 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6083 unsigned &NumAliases) const override {
6084 // No aliases.
6085 Aliases = nullptr;
6086 NumAliases = 0;
6087 }
6088 bool validateAsmConstraint(const char *&Name,
6089 TargetInfo::ConstraintInfo &info) const override {
6090 // FIXME: implement
6091 switch (*Name) {
6092 case 'K': // the constant 1
6093 case 'L': // constant -1^20 .. 1^19
6094 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006095 return true;
6096 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006097 // No target constraints for now.
6098 return false;
6099 }
6100 const char *getClobbers() const override {
6101 // FIXME: Is this really right?
6102 return "";
6103 }
6104 BuiltinVaListKind getBuiltinVaListKind() const override {
6105 // FIXME: implement
6106 return TargetInfo::CharPtrBuiltinVaList;
6107 }
6108};
6109
6110const char *const MSP430TargetInfo::GCCRegNames[] = {
6111 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6112 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6113
6114void MSP430TargetInfo::getGCCRegNames(const char *const *&Names,
6115 unsigned &NumNames) const {
6116 Names = GCCRegNames;
6117 NumNames = llvm::array_lengthof(GCCRegNames);
6118}
6119
6120// LLVM and Clang cannot be used directly to output native binaries for
6121// target, but is used to compile C code to llvm bitcode with correct
6122// type and alignment information.
6123//
6124// TCE uses the llvm bitcode as input and uses it for generating customized
6125// target processor and program binary. TCE co-design environment is
6126// publicly available in http://tce.cs.tut.fi
6127
6128static const unsigned TCEOpenCLAddrSpaceMap[] = {
6129 3, // opencl_global
6130 4, // opencl_local
6131 5, // opencl_constant
6132 // FIXME: generic has to be added to the target
6133 0, // opencl_generic
6134 0, // cuda_device
6135 0, // cuda_constant
6136 0 // cuda_shared
6137};
6138
6139class TCETargetInfo : public TargetInfo {
6140public:
6141 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6142 TLSSupported = false;
6143 IntWidth = 32;
6144 LongWidth = LongLongWidth = 32;
6145 PointerWidth = 32;
6146 IntAlign = 32;
6147 LongAlign = LongLongAlign = 32;
6148 PointerAlign = 32;
6149 SuitableAlign = 32;
6150 SizeType = UnsignedInt;
6151 IntMaxType = SignedLong;
6152 IntPtrType = SignedInt;
6153 PtrDiffType = SignedInt;
6154 FloatWidth = 32;
6155 FloatAlign = 32;
6156 DoubleWidth = 32;
6157 DoubleAlign = 32;
6158 LongDoubleWidth = 32;
6159 LongDoubleAlign = 32;
6160 FloatFormat = &llvm::APFloat::IEEEsingle;
6161 DoubleFormat = &llvm::APFloat::IEEEsingle;
6162 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6163 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6164 "-f64:32-v64:32-v128:32-a:0:32-n32";
6165 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6166 UseAddrSpaceMapMangling = true;
6167 }
6168
6169 void getTargetDefines(const LangOptions &Opts,
6170 MacroBuilder &Builder) const override {
6171 DefineStd(Builder, "tce", Opts);
6172 Builder.defineMacro("__TCE__");
6173 Builder.defineMacro("__TCE_V1__");
6174 }
6175 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6176
6177 void getTargetBuiltins(const Builtin::Info *&Records,
6178 unsigned &NumRecords) const override {}
6179 const char *getClobbers() const override { return ""; }
6180 BuiltinVaListKind getBuiltinVaListKind() const override {
6181 return TargetInfo::VoidPtrBuiltinVaList;
6182 }
6183 void getGCCRegNames(const char *const *&Names,
6184 unsigned &NumNames) const override {}
6185 bool validateAsmConstraint(const char *&Name,
6186 TargetInfo::ConstraintInfo &info) const override {
6187 return true;
6188 }
6189 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6190 unsigned &NumAliases) const override {}
6191};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006192
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006193class BPFTargetInfo : public TargetInfo {
6194public:
6195 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6196 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6197 SizeType = UnsignedLong;
6198 PtrDiffType = SignedLong;
6199 IntPtrType = SignedLong;
6200 IntMaxType = SignedLong;
6201 Int64Type = SignedLong;
6202 RegParmMax = 5;
6203 if (Triple.getArch() == llvm::Triple::bpfeb) {
6204 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006205 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006206 } else {
6207 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006208 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006209 }
6210 MaxAtomicPromoteWidth = 64;
6211 MaxAtomicInlineWidth = 64;
6212 TLSSupported = false;
6213 }
6214 void getTargetDefines(const LangOptions &Opts,
6215 MacroBuilder &Builder) const override {
6216 DefineStd(Builder, "bpf", Opts);
6217 Builder.defineMacro("__BPF__");
6218 }
6219 bool hasFeature(StringRef Feature) const override {
6220 return Feature == "bpf";
6221 }
6222
6223 void getTargetBuiltins(const Builtin::Info *&Records,
6224 unsigned &NumRecords) const override {}
6225 const char *getClobbers() const override {
6226 return "";
6227 }
6228 BuiltinVaListKind getBuiltinVaListKind() const override {
6229 return TargetInfo::VoidPtrBuiltinVaList;
6230 }
6231 void getGCCRegNames(const char * const *&Names,
6232 unsigned &NumNames) const override {
6233 Names = nullptr;
6234 NumNames = 0;
6235 }
6236 bool validateAsmConstraint(const char *&Name,
6237 TargetInfo::ConstraintInfo &info) const override {
6238 return true;
6239 }
6240 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6241 unsigned &NumAliases) const override {
6242 Aliases = nullptr;
6243 NumAliases = 0;
6244 }
6245};
6246
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006247class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006248 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006249
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006250 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006251 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006252 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006253 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006254 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006255 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006256 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006257 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006258 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006259 enum DspRevEnum {
6260 NoDSP, DSP1, DSP2
6261 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006262 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006263
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006264protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006265 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006266 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006267
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006268public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006269 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6270 const std::string &CPUStr)
6271 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006272 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006273 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6274 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6275 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006276
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006277 bool isNaN2008Default() const {
6278 return CPU == "mips32r6" || CPU == "mips64r6";
6279 }
6280
6281 bool isFP64Default() const {
6282 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6283 }
6284
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006285 bool isNan2008() const override {
6286 return IsNan2008;
6287 }
6288
Alp Toker4925ba72014-06-07 23:30:42 +00006289 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006290 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006291 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6292 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006293 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006294 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006295 .Case("mips1", IsMips32)
6296 .Case("mips2", IsMips32)
6297 .Case("mips3", true)
6298 .Case("mips4", true)
6299 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006300 .Case("mips32", IsMips32)
6301 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006302 .Case("mips32r3", IsMips32)
6303 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006304 .Case("mips32r6", IsMips32)
6305 .Case("mips64", true)
6306 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006307 .Case("mips64r3", true)
6308 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006309 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006310 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006311 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006312 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006313 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006314 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006315 bool
6316 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6317 StringRef CPU,
6318 const std::vector<std::string> &FeaturesVec) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006319 if (CPU == "octeon")
6320 Features["mips64r2"] = Features["cnmips"] = true;
6321 else
6322 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006323 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006324 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006325
Craig Topper3164f332014-03-11 03:39:26 +00006326 void getTargetDefines(const LangOptions &Opts,
6327 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006328 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006329 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006330 if (Opts.GNUMode)
6331 Builder.defineMacro("mips");
6332
Simon Atanasyan683535b2012-08-29 19:14:58 +00006333 Builder.defineMacro("__REGISTER_PREFIX__", "");
6334
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006335 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006336 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006337 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006338 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006339 case SoftFloat:
6340 Builder.defineMacro("__mips_soft_float", Twine(1));
6341 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006342 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006343
Simon Atanasyan16071912013-04-14 14:07:30 +00006344 if (IsSingleFloat)
6345 Builder.defineMacro("__mips_single_float", Twine(1));
6346
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006347 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6348 Builder.defineMacro("_MIPS_FPSET",
6349 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6350
Simon Atanasyan72244b62012-07-05 16:06:06 +00006351 if (IsMips16)
6352 Builder.defineMacro("__mips16", Twine(1));
6353
Simon Atanasyan60777612013-04-14 14:07:51 +00006354 if (IsMicromips)
6355 Builder.defineMacro("__mips_micromips", Twine(1));
6356
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006357 if (IsNan2008)
6358 Builder.defineMacro("__mips_nan2008", Twine(1));
6359
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006360 switch (DspRev) {
6361 default:
6362 break;
6363 case DSP1:
6364 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6365 Builder.defineMacro("__mips_dsp", Twine(1));
6366 break;
6367 case DSP2:
6368 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6369 Builder.defineMacro("__mips_dspr2", Twine(1));
6370 Builder.defineMacro("__mips_dsp", Twine(1));
6371 break;
6372 }
6373
Jack Carter44ff1e52013-08-12 17:20:29 +00006374 if (HasMSA)
6375 Builder.defineMacro("__mips_msa", Twine(1));
6376
Simon Atanasyan26f19672012-04-05 19:28:31 +00006377 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6378 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6379 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006380
6381 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6382 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006383 }
6384
Craig Topper3164f332014-03-11 03:39:26 +00006385 void getTargetBuiltins(const Builtin::Info *&Records,
6386 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006387 Records = BuiltinInfo;
6388 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006389 }
Craig Topper3164f332014-03-11 03:39:26 +00006390 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006391 return llvm::StringSwitch<bool>(Feature)
6392 .Case("mips", true)
6393 .Case("fp64", HasFP64)
6394 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006395 }
Craig Topper3164f332014-03-11 03:39:26 +00006396 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006397 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006398 }
Craig Topper3164f332014-03-11 03:39:26 +00006399 void getGCCRegNames(const char * const *&Names,
6400 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006401 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006402 // CPU register names
6403 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006404 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6405 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6406 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006407 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6408 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006409 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6410 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6411 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6412 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006413 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006414 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006415 "$fcc5","$fcc6","$fcc7",
6416 // MSA register names
6417 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6418 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6419 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6420 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6421 // MSA control register names
6422 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6423 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006424 };
6425 Names = GCCRegNames;
6426 NumNames = llvm::array_lengthof(GCCRegNames);
6427 }
Craig Topper3164f332014-03-11 03:39:26 +00006428 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6429 unsigned &NumAliases) const override = 0;
6430 bool validateAsmConstraint(const char *&Name,
6431 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006432 switch (*Name) {
6433 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006434 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006435 case 'r': // CPU registers.
6436 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006437 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006438 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006439 case 'c': // $25 for indirect jumps
6440 case 'l': // lo register
6441 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006442 Info.setAllowsRegister();
6443 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006444 case 'I': // Signed 16-bit constant
6445 case 'J': // Integer 0
6446 case 'K': // Unsigned 16-bit constant
6447 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6448 case 'M': // Constants not loadable via lui, addiu, or ori
6449 case 'N': // Constant -1 to -65535
6450 case 'O': // A signed 15-bit constant
6451 case 'P': // A constant between 1 go 65535
6452 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006453 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006454 Info.setAllowsMemory();
6455 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006456 case 'Z':
6457 if (Name[1] == 'C') { // An address usable by ll, and sc.
6458 Info.setAllowsMemory();
6459 Name++; // Skip over 'Z'.
6460 return true;
6461 }
6462 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006463 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006464 }
6465
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006466 std::string convertConstraint(const char *&Constraint) const override {
6467 std::string R;
6468 switch (*Constraint) {
6469 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6470 if (Constraint[1] == 'C') {
6471 R = std::string("^") + std::string(Constraint, 2);
6472 Constraint++;
6473 return R;
6474 }
6475 break;
6476 }
6477 return TargetInfo::convertConstraint(Constraint);
6478 }
6479
Craig Topper3164f332014-03-11 03:39:26 +00006480 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006481 // In GCC, $1 is not widely used in generated code (it's used only in a few
6482 // specific situations), so there is no real need for users to add it to
6483 // the clobbers list if they want to use it in their inline assembly code.
6484 //
6485 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6486 // code generation, so using it in inline assembly without adding it to the
6487 // clobbers list can cause conflicts between the inline assembly code and
6488 // the surrounding generated code.
6489 //
6490 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6491 // operands, which will conflict with the ".set at" assembler option (which
6492 // we use only for inline assembly, in order to maintain compatibility with
6493 // GCC) and will also conflict with the user's usage of $1.
6494 //
6495 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6496 // register for generated code is to automatically clobber $1 for all inline
6497 // assembly code.
6498 //
6499 // FIXME: We should automatically clobber $1 only for inline assembly code
6500 // which actually uses it. This would allow LLVM to use $1 for inline
6501 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006502 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006503 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006504
Craig Topper3164f332014-03-11 03:39:26 +00006505 bool handleTargetFeatures(std::vector<std::string> &Features,
6506 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006507 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006508 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006509 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006510 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006511 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006512 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006513 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006514
Eric Christopher610fe112015-08-26 08:21:55 +00006515 for (const auto &Feature : Features) {
6516 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006517 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006518 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006519 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006520 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006521 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006522 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006523 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006524 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006525 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006526 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006527 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006528 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006529 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006530 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006531 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006532 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006533 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006534 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006535 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006536 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006537 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006538 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006539
Eric Christopher964a5f32015-08-05 23:48:05 +00006540 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006541
Rafael Espindolaeb265472013-08-21 21:59:03 +00006542 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006543 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006544
Craig Topper3164f332014-03-11 03:39:26 +00006545 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006546 if (RegNo == 0) return 4;
6547 if (RegNo == 1) return 5;
6548 return -1;
6549 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006550
6551 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006552};
6553
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006554const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006555#define BUILTIN(ID, TYPE, ATTRS) \
6556 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6557#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6558 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006559#include "clang/Basic/BuiltinsMips.def"
6560};
6561
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006562class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006563public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006564 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006565 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006566 SizeType = UnsignedInt;
6567 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006568 Int64Type = SignedLongLong;
6569 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006570 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006571 }
Craig Topper3164f332014-03-11 03:39:26 +00006572 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006573 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006574 ABI = Name;
6575 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006576 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006577 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006578 }
Craig Topper3164f332014-03-11 03:39:26 +00006579 void getTargetDefines(const LangOptions &Opts,
6580 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006581 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006582
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006583 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006584 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6585
6586 const std::string& CPUStr = getCPU();
6587 if (CPUStr == "mips32")
6588 Builder.defineMacro("__mips_isa_rev", "1");
6589 else if (CPUStr == "mips32r2")
6590 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006591 else if (CPUStr == "mips32r3")
6592 Builder.defineMacro("__mips_isa_rev", "3");
6593 else if (CPUStr == "mips32r5")
6594 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006595 else if (CPUStr == "mips32r6")
6596 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006597
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006598 if (ABI == "o32") {
6599 Builder.defineMacro("__mips_o32");
6600 Builder.defineMacro("_ABIO32", "1");
6601 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6602 }
6603 else if (ABI == "eabi")
6604 Builder.defineMacro("__mips_eabi");
6605 else
David Blaikie83d382b2011-09-23 05:06:16 +00006606 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006607 }
Craig Topper3164f332014-03-11 03:39:26 +00006608 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6609 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006610 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6611 { { "at" }, "$1" },
6612 { { "v0" }, "$2" },
6613 { { "v1" }, "$3" },
6614 { { "a0" }, "$4" },
6615 { { "a1" }, "$5" },
6616 { { "a2" }, "$6" },
6617 { { "a3" }, "$7" },
6618 { { "t0" }, "$8" },
6619 { { "t1" }, "$9" },
6620 { { "t2" }, "$10" },
6621 { { "t3" }, "$11" },
6622 { { "t4" }, "$12" },
6623 { { "t5" }, "$13" },
6624 { { "t6" }, "$14" },
6625 { { "t7" }, "$15" },
6626 { { "s0" }, "$16" },
6627 { { "s1" }, "$17" },
6628 { { "s2" }, "$18" },
6629 { { "s3" }, "$19" },
6630 { { "s4" }, "$20" },
6631 { { "s5" }, "$21" },
6632 { { "s6" }, "$22" },
6633 { { "s7" }, "$23" },
6634 { { "t8" }, "$24" },
6635 { { "t9" }, "$25" },
6636 { { "k0" }, "$26" },
6637 { { "k1" }, "$27" },
6638 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006639 { { "sp","$sp" }, "$29" },
6640 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006641 { { "ra" }, "$31" }
6642 };
6643 Aliases = GCCRegAliases;
6644 NumAliases = llvm::array_lengthof(GCCRegAliases);
6645 }
6646};
6647
6648class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006649 void setDataLayoutString() override {
6650 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006651 }
6652
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006653public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006654 Mips32EBTargetInfo(const llvm::Triple &Triple)
6655 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006656 }
Craig Topper3164f332014-03-11 03:39:26 +00006657 void getTargetDefines(const LangOptions &Opts,
6658 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006659 DefineStd(Builder, "MIPSEB", Opts);
6660 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006661 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006662 }
6663};
6664
6665class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006666 void setDataLayoutString() override {
6667 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006668 }
6669
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006670public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006671 Mips32ELTargetInfo(const llvm::Triple &Triple)
6672 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006673 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006674 }
Craig Topper3164f332014-03-11 03:39:26 +00006675 void getTargetDefines(const LangOptions &Opts,
6676 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006677 DefineStd(Builder, "MIPSEL", Opts);
6678 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006679 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006680 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006681};
Akira Hatanakabef17452011-09-20 19:21:49 +00006682
6683class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006684public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006685 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006686 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006687 LongDoubleWidth = LongDoubleAlign = 128;
6688 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006689 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6690 LongDoubleWidth = LongDoubleAlign = 64;
6691 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6692 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006693 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006694 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006695 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006696 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006697
6698 void setN64ABITypes() {
6699 LongWidth = LongAlign = 64;
6700 PointerWidth = PointerAlign = 64;
6701 SizeType = UnsignedLong;
6702 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006703 Int64Type = SignedLong;
6704 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006705 }
6706
6707 void setN32ABITypes() {
6708 LongWidth = LongAlign = 32;
6709 PointerWidth = PointerAlign = 32;
6710 SizeType = UnsignedInt;
6711 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006712 Int64Type = SignedLongLong;
6713 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006714 }
6715
Craig Topper3164f332014-03-11 03:39:26 +00006716 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006717 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006718 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006719 ABI = Name;
6720 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006721 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006722 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006723 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006724 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006725 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006726 }
6727 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006728 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006729
Craig Topper3164f332014-03-11 03:39:26 +00006730 void getTargetDefines(const LangOptions &Opts,
6731 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006732 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006733
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006734 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006735 Builder.defineMacro("__mips64");
6736 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006737 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6738
6739 const std::string& CPUStr = getCPU();
6740 if (CPUStr == "mips64")
6741 Builder.defineMacro("__mips_isa_rev", "1");
6742 else if (CPUStr == "mips64r2")
6743 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006744 else if (CPUStr == "mips64r3")
6745 Builder.defineMacro("__mips_isa_rev", "3");
6746 else if (CPUStr == "mips64r5")
6747 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006748 else if (CPUStr == "mips64r6")
6749 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006750
Akira Hatanakabef17452011-09-20 19:21:49 +00006751 if (ABI == "n32") {
6752 Builder.defineMacro("__mips_n32");
6753 Builder.defineMacro("_ABIN32", "2");
6754 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6755 }
6756 else if (ABI == "n64") {
6757 Builder.defineMacro("__mips_n64");
6758 Builder.defineMacro("_ABI64", "3");
6759 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6760 }
6761 else
David Blaikie83d382b2011-09-23 05:06:16 +00006762 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006763 }
Craig Topper3164f332014-03-11 03:39:26 +00006764 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6765 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006766 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6767 { { "at" }, "$1" },
6768 { { "v0" }, "$2" },
6769 { { "v1" }, "$3" },
6770 { { "a0" }, "$4" },
6771 { { "a1" }, "$5" },
6772 { { "a2" }, "$6" },
6773 { { "a3" }, "$7" },
6774 { { "a4" }, "$8" },
6775 { { "a5" }, "$9" },
6776 { { "a6" }, "$10" },
6777 { { "a7" }, "$11" },
6778 { { "t0" }, "$12" },
6779 { { "t1" }, "$13" },
6780 { { "t2" }, "$14" },
6781 { { "t3" }, "$15" },
6782 { { "s0" }, "$16" },
6783 { { "s1" }, "$17" },
6784 { { "s2" }, "$18" },
6785 { { "s3" }, "$19" },
6786 { { "s4" }, "$20" },
6787 { { "s5" }, "$21" },
6788 { { "s6" }, "$22" },
6789 { { "s7" }, "$23" },
6790 { { "t8" }, "$24" },
6791 { { "t9" }, "$25" },
6792 { { "k0" }, "$26" },
6793 { { "k1" }, "$27" },
6794 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006795 { { "sp","$sp" }, "$29" },
6796 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006797 { { "ra" }, "$31" }
6798 };
6799 Aliases = GCCRegAliases;
6800 NumAliases = llvm::array_lengthof(GCCRegAliases);
6801 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006802
6803 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006804};
6805
6806class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006807 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006808 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006809 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 +00006810 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006811 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006812
Akira Hatanakabef17452011-09-20 19:21:49 +00006813 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006814
Akira Hatanakabef17452011-09-20 19:21:49 +00006815public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006816 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006817 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006818 void getTargetDefines(const LangOptions &Opts,
6819 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006820 DefineStd(Builder, "MIPSEB", Opts);
6821 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006822 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006823 }
6824};
6825
6826class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006827 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006828 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006829 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 +00006830 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006831 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006832 }
6833public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006834 Mips64ELTargetInfo(const llvm::Triple &Triple)
6835 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006836 // Default ABI is n64.
6837 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006838 }
Craig Topper3164f332014-03-11 03:39:26 +00006839 void getTargetDefines(const LangOptions &Opts,
6840 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006841 DefineStd(Builder, "MIPSEL", Opts);
6842 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006843 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006844 }
6845};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006846
Ivan Krasindd7403e2011-08-24 20:22:22 +00006847class PNaClTargetInfo : public TargetInfo {
6848public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006849 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006850 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006851 this->UserLabelPrefix = "";
6852 this->LongAlign = 32;
6853 this->LongWidth = 32;
6854 this->PointerAlign = 32;
6855 this->PointerWidth = 32;
6856 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006857 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006858 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006859 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006860 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006861 this->SizeType = TargetInfo::UnsignedInt;
6862 this->PtrDiffType = TargetInfo::SignedInt;
6863 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006864 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006865 }
6866
Craig Toppere6f17d02014-03-11 04:07:52 +00006867 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006868 Builder.defineMacro("__le32__");
6869 Builder.defineMacro("__pnacl__");
6870 }
Craig Topper3164f332014-03-11 03:39:26 +00006871 void getTargetDefines(const LangOptions &Opts,
6872 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006873 getArchDefines(Opts, Builder);
6874 }
Craig Topper3164f332014-03-11 03:39:26 +00006875 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006876 return Feature == "pnacl";
6877 }
Craig Topper3164f332014-03-11 03:39:26 +00006878 void getTargetBuiltins(const Builtin::Info *&Records,
6879 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006880 }
Craig Topper3164f332014-03-11 03:39:26 +00006881 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006882 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006883 }
Craig Topper3164f332014-03-11 03:39:26 +00006884 void getGCCRegNames(const char * const *&Names,
6885 unsigned &NumNames) const override;
6886 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6887 unsigned &NumAliases) const override;
6888 bool validateAsmConstraint(const char *&Name,
6889 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006890 return false;
6891 }
6892
Craig Topper3164f332014-03-11 03:39:26 +00006893 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006894 return "";
6895 }
6896};
6897
6898void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6899 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006900 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006901 NumNames = 0;
6902}
6903
6904void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6905 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006906 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006907 NumAliases = 0;
6908}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006909
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006910// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6911class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6912public:
6913 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00006914 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006915 }
6916
6917 BuiltinVaListKind getBuiltinVaListKind() const override {
6918 return TargetInfo::PNaClABIBuiltinVaList;
6919 }
6920};
6921
JF Bastien643817d2014-09-12 17:52:47 +00006922class Le64TargetInfo : public TargetInfo {
6923 static const Builtin::Info BuiltinInfo[];
6924
6925public:
6926 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6927 BigEndian = false;
6928 NoAsmVariants = true;
6929 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6930 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006931 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006932 }
6933
6934 void getTargetDefines(const LangOptions &Opts,
6935 MacroBuilder &Builder) const override {
6936 DefineStd(Builder, "unix", Opts);
6937 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6938 Builder.defineMacro("__ELF__");
6939 }
6940 void getTargetBuiltins(const Builtin::Info *&Records,
6941 unsigned &NumRecords) const override {
6942 Records = BuiltinInfo;
6943 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6944 }
6945 BuiltinVaListKind getBuiltinVaListKind() const override {
6946 return TargetInfo::PNaClABIBuiltinVaList;
6947 }
6948 const char *getClobbers() const override { return ""; }
6949 void getGCCRegNames(const char *const *&Names,
6950 unsigned &NumNames) const override {
6951 Names = nullptr;
6952 NumNames = 0;
6953 }
6954 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6955 unsigned &NumAliases) const override {
6956 Aliases = nullptr;
6957 NumAliases = 0;
6958 }
6959 bool validateAsmConstraint(const char *&Name,
6960 TargetInfo::ConstraintInfo &Info) const override {
6961 return false;
6962 }
6963
6964 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006965};
Dan Gohmanc2853072015-09-03 22:51:53 +00006966
6967class WebAssemblyTargetInfo : public TargetInfo {
6968 static const Builtin::Info BuiltinInfo[];
6969
6970 enum SIMDEnum {
6971 NoSIMD,
6972 SIMD128,
6973 } SIMDLevel;
6974
6975public:
6976 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
6977 : TargetInfo(T), SIMDLevel(NoSIMD) {
6978 BigEndian = false;
6979 NoAsmVariants = true;
6980 SuitableAlign = 128;
6981 LargeArrayMinWidth = 128;
6982 LargeArrayAlign = 128;
6983 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00006984 SigAtomicType = SignedLong;
Dan Gohmanc2853072015-09-03 22:51:53 +00006985 }
6986
6987protected:
6988 void getTargetDefines(const LangOptions &Opts,
6989 MacroBuilder &Builder) const override {
6990 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
6991 if (SIMDLevel >= SIMD128)
6992 Builder.defineMacro("__wasm_simd128__");
6993 }
6994
6995private:
Eric Christopher8c47b422015-10-09 18:39:55 +00006996 bool
6997 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6998 StringRef CPU,
6999 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007000 if (CPU == "bleeding-edge")
7001 Features["simd128"] = true;
7002 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7003 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007004 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007005 return llvm::StringSwitch<bool>(Feature)
7006 .Case("simd128", SIMDLevel >= SIMD128)
7007 .Default(false);
7008 }
7009 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007010 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007011 for (const auto &Feature : Features) {
7012 if (Feature == "+simd128") {
7013 SIMDLevel = std::max(SIMDLevel, SIMD128);
7014 continue;
7015 }
7016 if (Feature == "-simd128") {
7017 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7018 continue;
7019 }
7020
7021 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7022 << "-target-feature";
7023 return false;
7024 }
7025 return true;
7026 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007027 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007028 return llvm::StringSwitch<bool>(Name)
7029 .Case("mvp", true)
7030 .Case("bleeding-edge", true)
7031 .Case("generic", true)
7032 .Default(false);
7033 }
7034 void getTargetBuiltins(const Builtin::Info *&Records,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007035 unsigned &NumRecords) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007036 Records = BuiltinInfo;
7037 NumRecords = clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin;
7038 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007039 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007040 // TODO: Implement va_list properly.
7041 return VoidPtrBuiltinVaList;
7042 }
7043 void getGCCRegNames(const char *const *&Names,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007044 unsigned &NumNames) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007045 Names = nullptr;
7046 NumNames = 0;
7047 }
7048 void getGCCRegAliases(const GCCRegAlias *&Aliases,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007049 unsigned &NumAliases) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007050 Aliases = nullptr;
7051 NumAliases = 0;
7052 }
7053 bool
7054 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007055 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007056 return false;
7057 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007058 const char *getClobbers() const final { return ""; }
7059 bool isCLZForZeroUndef() const final { return false; }
7060 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007061 IntType getIntTypeByWidth(unsigned BitWidth,
7062 bool IsSigned) const final {
7063 // WebAssembly prefers long long for explicitly 64-bit integers.
7064 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7065 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7066 }
7067 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7068 bool IsSigned) const final {
7069 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7070 return BitWidth == 64
7071 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7072 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7073 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007074};
7075
7076const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7077#define BUILTIN(ID, TYPE, ATTRS) \
7078 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7079#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7080 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7081#include "clang/Basic/BuiltinsWebAssembly.def"
7082};
7083
7084class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7085public:
7086 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7087 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007088 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohmanc2853072015-09-03 22:51:53 +00007089 DataLayoutString = "e-p:32:32-i64:64-n32:64-S128";
7090 }
7091
7092protected:
7093 void getTargetDefines(const LangOptions &Opts,
7094 MacroBuilder &Builder) const override {
7095 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7096 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7097 }
7098};
7099
7100class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7101public:
7102 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7103 : WebAssemblyTargetInfo(T) {
7104 LongAlign = LongWidth = 64;
7105 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007106 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohmanc2853072015-09-03 22:51:53 +00007107 DataLayoutString = "e-p:64:64-i64:64-n32:64-S128";
7108 }
7109
7110protected:
7111 void getTargetDefines(const LangOptions &Opts,
7112 MacroBuilder &Builder) const override {
7113 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7114 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7115 }
7116};
7117
JF Bastien643817d2014-09-12 17:52:47 +00007118const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7119#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007120 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007121#include "clang/Basic/BuiltinsLe64.def"
7122};
7123
Eric Christopherc48497a2015-09-18 21:26:24 +00007124static const unsigned SPIRAddrSpaceMap[] = {
7125 1, // opencl_global
7126 3, // opencl_local
7127 2, // opencl_constant
7128 4, // opencl_generic
7129 0, // cuda_device
7130 0, // cuda_constant
7131 0 // cuda_shared
7132};
7133class SPIRTargetInfo : public TargetInfo {
7134public:
7135 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7136 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7137 "SPIR target must use unknown OS");
7138 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7139 "SPIR target must use unknown environment type");
7140 BigEndian = false;
7141 TLSSupported = false;
7142 LongWidth = LongAlign = 64;
7143 AddrSpaceMap = &SPIRAddrSpaceMap;
7144 UseAddrSpaceMapMangling = true;
7145 // Define available target features
7146 // These must be defined in sorted order!
7147 NoAsmVariants = true;
7148 }
7149 void getTargetDefines(const LangOptions &Opts,
7150 MacroBuilder &Builder) const override {
7151 DefineStd(Builder, "SPIR", Opts);
7152 }
7153 bool hasFeature(StringRef Feature) const override {
7154 return Feature == "spir";
7155 }
Craig Topper3164f332014-03-11 03:39:26 +00007156
Eric Christopherc48497a2015-09-18 21:26:24 +00007157 void getTargetBuiltins(const Builtin::Info *&Records,
7158 unsigned &NumRecords) const override {}
7159 const char *getClobbers() const override { return ""; }
7160 void getGCCRegNames(const char *const *&Names,
7161 unsigned &NumNames) const override {}
7162 bool validateAsmConstraint(const char *&Name,
7163 TargetInfo::ConstraintInfo &info) const override {
7164 return true;
7165 }
7166 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7167 unsigned &NumAliases) const override {}
7168 BuiltinVaListKind getBuiltinVaListKind() const override {
7169 return TargetInfo::VoidPtrBuiltinVaList;
7170 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007171
Eric Christopherc48497a2015-09-18 21:26:24 +00007172 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7173 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7174 : CCCR_Warning;
7175 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007176
Eric Christopherc48497a2015-09-18 21:26:24 +00007177 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7178 return CC_SpirFunction;
7179 }
7180};
Guy Benyeib798fc92012-12-11 21:38:14 +00007181
Eric Christopherc48497a2015-09-18 21:26:24 +00007182class SPIR32TargetInfo : public SPIRTargetInfo {
7183public:
7184 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7185 PointerWidth = PointerAlign = 32;
7186 SizeType = TargetInfo::UnsignedInt;
7187 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7188 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7189 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7190 }
7191 void getTargetDefines(const LangOptions &Opts,
7192 MacroBuilder &Builder) const override {
7193 DefineStd(Builder, "SPIR32", Opts);
7194 }
7195};
Guy Benyeib798fc92012-12-11 21:38:14 +00007196
Eric Christopherc48497a2015-09-18 21:26:24 +00007197class SPIR64TargetInfo : public SPIRTargetInfo {
7198public:
7199 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7200 PointerWidth = PointerAlign = 64;
7201 SizeType = TargetInfo::UnsignedLong;
7202 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7203 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7204 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7205 }
7206 void getTargetDefines(const LangOptions &Opts,
7207 MacroBuilder &Builder) const override {
7208 DefineStd(Builder, "SPIR64", Opts);
7209 }
7210};
Guy Benyeib798fc92012-12-11 21:38:14 +00007211
Robert Lytton0e076492013-08-13 09:43:10 +00007212class XCoreTargetInfo : public TargetInfo {
7213 static const Builtin::Info BuiltinInfo[];
7214public:
7215 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7216 BigEndian = false;
7217 NoAsmVariants = true;
7218 LongLongAlign = 32;
7219 SuitableAlign = 32;
7220 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007221 SizeType = UnsignedInt;
7222 PtrDiffType = SignedInt;
7223 IntPtrType = SignedInt;
7224 WCharType = UnsignedChar;
7225 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007226 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007227 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7228 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007229 }
Craig Topper3164f332014-03-11 03:39:26 +00007230 void getTargetDefines(const LangOptions &Opts,
7231 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007232 Builder.defineMacro("__XS1B__");
7233 }
Craig Topper3164f332014-03-11 03:39:26 +00007234 void getTargetBuiltins(const Builtin::Info *&Records,
7235 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007236 Records = BuiltinInfo;
7237 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
7238 }
Craig Topper3164f332014-03-11 03:39:26 +00007239 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007240 return TargetInfo::VoidPtrBuiltinVaList;
7241 }
Craig Topper3164f332014-03-11 03:39:26 +00007242 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007243 return "";
7244 }
Craig Topper3164f332014-03-11 03:39:26 +00007245 void getGCCRegNames(const char * const *&Names,
7246 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007247 static const char * const GCCRegNames[] = {
7248 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7249 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7250 };
7251 Names = GCCRegNames;
7252 NumNames = llvm::array_lengthof(GCCRegNames);
7253 }
Craig Topper3164f332014-03-11 03:39:26 +00007254 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7255 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00007256 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00007257 NumAliases = 0;
7258 }
Craig Topper3164f332014-03-11 03:39:26 +00007259 bool validateAsmConstraint(const char *&Name,
7260 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007261 return false;
7262 }
Craig Topper3164f332014-03-11 03:39:26 +00007263 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007264 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7265 return (RegNo < 2)? RegNo : -1;
7266 }
Robert Lytton0e076492013-08-13 09:43:10 +00007267};
7268
7269const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007270#define BUILTIN(ID, TYPE, ATTRS) \
7271 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7272#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7273 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007274#include "clang/Basic/BuiltinsXCore.def"
7275};
Robert Lytton0e076492013-08-13 09:43:10 +00007276
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007277// x86_32 Android target
7278class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7279public:
7280 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7281 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7282 SuitableAlign = 32;
7283 LongDoubleWidth = 64;
7284 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7285 }
7286};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007287
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007288// x86_64 Android target
7289class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7290public:
7291 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7292 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7293 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7294 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007295
7296 bool useFloat128ManglingForLongDouble() const override {
7297 return true;
7298 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007299};
7300} // end anonymous namespace
7301
Chris Lattner5ba61f02006-10-14 07:39:34 +00007302//===----------------------------------------------------------------------===//
7303// Driver code
7304//===----------------------------------------------------------------------===//
7305
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007306static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007307 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007308
Daniel Dunbar52322032009-08-18 05:47:58 +00007309 switch (Triple.getArch()) {
7310 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007311 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007312
Tim Northover2a0783d2014-05-30 14:14:07 +00007313 case llvm::Triple::xcore:
7314 return new XCoreTargetInfo(Triple);
7315
7316 case llvm::Triple::hexagon:
7317 return new HexagonTargetInfo(Triple);
7318
7319 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007320 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007321 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007322
7323 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007324 case llvm::Triple::FreeBSD:
7325 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007326 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007327 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007328 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007329 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007330 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007331 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007332 }
7333
Christian Pirker9b019ae2014-02-25 13:51:00 +00007334 case llvm::Triple::aarch64_be:
7335 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007336 case llvm::Triple::FreeBSD:
7337 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007338 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007339 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007340 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007341 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007342 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007343 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007344 }
7345
Daniel Dunbar52322032009-08-18 05:47:58 +00007346 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007347 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007348 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007349 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007350
Daniel Dunbar52322032009-08-18 05:47:58 +00007351 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007352 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007353 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007354 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007355 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007356 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007357 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007358 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007359 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007360 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007361 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007362 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007363 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007364 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007365 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007366 case llvm::Triple::Win32:
7367 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007368 case llvm::Triple::Cygnus:
7369 return new CygwinARMTargetInfo(Triple);
7370 case llvm::Triple::GNU:
7371 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007372 case llvm::Triple::Itanium:
7373 return new ItaniumWindowsARMleTargetInfo(Triple);
7374 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007375 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007376 return new MicrosoftARMleTargetInfo(Triple);
7377 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007378 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007379 return new ARMleTargetInfo(Triple);
7380 }
7381
7382 case llvm::Triple::armeb:
7383 case llvm::Triple::thumbeb:
7384 if (Triple.isOSDarwin())
7385 return new DarwinARMTargetInfo(Triple);
7386
7387 switch (os) {
7388 case llvm::Triple::Linux:
7389 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7390 case llvm::Triple::FreeBSD:
7391 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7392 case llvm::Triple::NetBSD:
7393 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7394 case llvm::Triple::OpenBSD:
7395 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7396 case llvm::Triple::Bitrig:
7397 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7398 case llvm::Triple::RTEMS:
7399 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7400 case llvm::Triple::NaCl:
7401 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7402 default:
7403 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007404 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007405
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007406 case llvm::Triple::bpfeb:
7407 case llvm::Triple::bpfel:
7408 return new BPFTargetInfo(Triple);
7409
Daniel Dunbar52322032009-08-18 05:47:58 +00007410 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007411 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007412
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007413 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007414 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007415 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007416 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007417 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007418 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007419 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007420 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007421 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007422 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007423 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007424 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007425 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007426
7427 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007428 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007429 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007430 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007431 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007432 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007433 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007434 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007435 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007436 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007437 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007438 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007439 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007440 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007441 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007442
Akira Hatanakabef17452011-09-20 19:21:49 +00007443 case llvm::Triple::mips64:
7444 switch (os) {
7445 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007446 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007447 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007448 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007449 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007450 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007451 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007452 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007453 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007454 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007455 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007456 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007457 }
7458
7459 case llvm::Triple::mips64el:
7460 switch (os) {
7461 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007462 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007463 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007464 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007465 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007466 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007467 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007468 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007469 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007470 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007471 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007472 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007473 }
7474
Ivan Krasindd7403e2011-08-24 20:22:22 +00007475 case llvm::Triple::le32:
7476 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007477 case llvm::Triple::NaCl:
7478 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7479 default:
7480 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007481 }
7482
JF Bastien643817d2014-09-12 17:52:47 +00007483 case llvm::Triple::le64:
7484 return new Le64TargetInfo(Triple);
7485
Daniel Dunbar52322032009-08-18 05:47:58 +00007486 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007487 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007488 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007489 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007490 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007491 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007492 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007493 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007494 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007495 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007496 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007497 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007498 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007499 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007500 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007501 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007502 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007503
7504 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007505 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007506 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007507 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007508 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007509 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007510 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007511 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007512 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007513 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007514 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007515 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007516 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007517 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007518 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007519
Bill Schmidt778d3872013-07-26 01:36:11 +00007520 case llvm::Triple::ppc64le:
7521 switch (os) {
7522 case llvm::Triple::Linux:
7523 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007524 case llvm::Triple::NetBSD:
7525 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007526 default:
7527 return new PPC64TargetInfo(Triple);
7528 }
7529
Peter Collingbournec947aae2012-05-20 23:28:41 +00007530 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007531 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007532 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007533 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007534
Tom Stellardd8e38a32015-01-06 20:34:47 +00007535 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007536 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007537 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007538
Daniel Dunbar52322032009-08-18 05:47:58 +00007539 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007540 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007541 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007542 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007543 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007544 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007545 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007546 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007547 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007548 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007549 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007550 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007551 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007552 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007553 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007554
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007555 // The 'sparcel' architecture copies all the above cases except for Solaris.
7556 case llvm::Triple::sparcel:
7557 switch (os) {
7558 case llvm::Triple::Linux:
7559 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7560 case llvm::Triple::NetBSD:
7561 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7562 case llvm::Triple::OpenBSD:
7563 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7564 case llvm::Triple::RTEMS:
7565 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7566 default:
7567 return new SparcV8elTargetInfo(Triple);
7568 }
7569
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007570 case llvm::Triple::sparcv9:
7571 switch (os) {
7572 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007573 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007574 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007575 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007576 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007577 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007578 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007579 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007580 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007581 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007582 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007583 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007584 }
7585
Ulrich Weigand47445072013-05-06 16:26:41 +00007586 case llvm::Triple::systemz:
7587 switch (os) {
7588 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007589 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007590 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007591 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007592 }
7593
Eli Friedmana9c3d712009-08-19 20:47:07 +00007594 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007595 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007596
Daniel Dunbar52322032009-08-18 05:47:58 +00007597 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007598 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007599 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007600
Daniel Dunbar52322032009-08-18 05:47:58 +00007601 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007602 case llvm::Triple::CloudABI:
7603 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007604 case llvm::Triple::Linux: {
7605 switch (Triple.getEnvironment()) {
7606 default:
7607 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7608 case llvm::Triple::Android:
7609 return new AndroidX86_32TargetInfo(Triple);
7610 }
7611 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007612 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007613 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007614 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007615 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007616 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007617 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007618 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007619 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007620 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007621 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007622 case llvm::Triple::KFreeBSD:
7623 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007624 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007625 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007626 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007627 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007628 case llvm::Triple::Win32: {
7629 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007630 case llvm::Triple::Cygnus:
7631 return new CygwinX86_32TargetInfo(Triple);
7632 case llvm::Triple::GNU:
7633 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007634 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007635 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007636 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007637 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007638 }
7639 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007640 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007641 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007642 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007643 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007644 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007645 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007646 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007647 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007648 }
7649
7650 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007651 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007652 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007653
Daniel Dunbar52322032009-08-18 05:47:58 +00007654 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007655 case llvm::Triple::CloudABI:
7656 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007657 case llvm::Triple::Linux: {
7658 switch (Triple.getEnvironment()) {
7659 default:
7660 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7661 case llvm::Triple::Android:
7662 return new AndroidX86_64TargetInfo(Triple);
7663 }
7664 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007665 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007666 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007667 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007668 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007669 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007670 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007671 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007672 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007673 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007674 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007675 case llvm::Triple::KFreeBSD:
7676 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007677 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007678 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007679 case llvm::Triple::Win32: {
7680 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007681 case llvm::Triple::Cygnus:
7682 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007683 case llvm::Triple::GNU:
7684 return new MinGWX86_64TargetInfo(Triple);
7685 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007686 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007687 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007688 }
7689 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007690 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007691 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007692 case llvm::Triple::PS4:
7693 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007694 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007695 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007696 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007697
Douglas Katzman78d7c542015-05-12 21:18:10 +00007698 case llvm::Triple::spir: {
7699 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7700 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7701 return nullptr;
7702 return new SPIR32TargetInfo(Triple);
7703 }
7704 case llvm::Triple::spir64: {
7705 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7706 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7707 return nullptr;
7708 return new SPIR64TargetInfo(Triple);
7709 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007710 case llvm::Triple::wasm32:
7711 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7712 return nullptr;
7713 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7714 case llvm::Triple::wasm64:
7715 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7716 return nullptr;
7717 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007718 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007719}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007720
7721/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007722/// options.
Alp Toker80758082014-07-06 05:26:44 +00007723TargetInfo *
7724TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7725 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007726 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007727
7728 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007729 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007730 if (!Target) {
7731 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007732 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007733 }
Alp Toker80758082014-07-06 05:26:44 +00007734 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007735
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007736 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007737 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7738 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007739 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007740 }
7741
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007742 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007743 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7744 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007745 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007746 }
7747
Rafael Espindolaeb265472013-08-21 21:59:03 +00007748 // Set the fp math unit.
7749 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7750 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007751 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007752 }
7753
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007754 // Compute the default target features, we need the target to handle this
7755 // because features may have dependencies on one another.
7756 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00007757 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
7758 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00007759 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007760
7761 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007762 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007763 for (const auto &F : Features)
7764 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7765
Eric Christopher3ff21b32013-10-16 21:26:26 +00007766 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007767 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007768
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007769 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007770}