blob: 8d1966e8f3d6c215a85e713825eee2850975f4ce [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
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>
Chris Lattner5ba61f02006-10-14 07:39:34 +000033using namespace clang;
34
Chris Lattner5ba61f02006-10-14 07:39:34 +000035//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000036// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
38
Chris Lattner1e1c0b92009-03-20 16:06:38 +000039/// DefineStd - Define a macro name and standard variants. For example if
40/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
41/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000042static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043 const LangOptions &Opts) {
44 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000045
Chris Lattner1e1c0b92009-03-20 16:06:38 +000046 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
47 // in the user's namespace.
48 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000049 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000050
Chris Lattner1e1c0b92009-03-20 16:06:38 +000051 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000052 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000053
Chris Lattner1e1c0b92009-03-20 16:06:38 +000054 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000055 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056}
57
Benjamin Kramere3b442d2012-01-10 11:50:09 +000058static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
59 bool Tuning = true) {
60 Builder.defineMacro("__" + CPUName);
61 Builder.defineMacro("__" + CPUName + "__");
62 if (Tuning)
63 Builder.defineMacro("__tune_" + CPUName + "__");
64}
65
Chris Lattner09d98f52008-10-05 21:50:58 +000066//===----------------------------------------------------------------------===//
67// Defines specific to certain operating systems.
68//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000069
Torok Edwinb2b37c62009-06-30 17:10:35 +000070namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000071template<typename TgtInfo>
72class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000073protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000074 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000075 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000076public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000077 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000078 void getTargetDefines(const LangOptions &Opts,
79 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 TgtInfo::getTargetDefines(Opts, Builder);
81 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000082 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000083
84};
Chris Lattner859c37a2009-08-12 06:24:27 +000085} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000086
Chris Lattner30ba6742009-08-10 19:03:04 +000087
Daniel Dunbard86666f2010-01-26 01:44:04 +000088static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000089 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000090 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000091 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000092 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000094 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000095 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +000097 if (Opts.Sanitize.has(SanitizerKind::Address))
98 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000099
John McCall5d36a8c2011-06-16 00:03:19 +0000100 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000101 // __weak is always defined, for use in blocks and with objc pointers.
102 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000103
John McCall31168b02011-06-15 23:02:42 +0000104 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000105 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000106 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
107 else
108 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000109
John McCall31168b02011-06-15 23:02:42 +0000110 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
111 // allow this in C, since one might have block pointers in structs that
112 // are used in pure C code and in Objective-C ARC.
113 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000114 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000115
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000116 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000118 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000120
121 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000122 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000123
Daniel Dunbarecf13562011-04-19 21:40:34 +0000124 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000125 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000126 if (Triple.isMacOSX()) {
127 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000129 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000130 Triple.getOSVersion(Maj, Min, Rev);
131 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000132 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000133
Sebastian Pop422377c2012-01-20 22:01:23 +0000134 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000135 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000136 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
137 if (PlatformName == "win32") {
138 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
139 return;
140 }
141
Evan Cheng31dd9a62014-01-26 23:12:43 +0000142 // Set the appropriate OS version define.
143 if (Triple.isiOS()) {
144 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
145 char Str[6];
146 Str[0] = '0' + Maj;
147 Str[1] = '0' + (Min / 10);
148 Str[2] = '0' + (Min % 10);
149 Str[3] = '0' + (Rev / 10);
150 Str[4] = '0' + (Rev % 10);
151 Str[5] = '\0';
152 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
153 Str);
154 } else if (Triple.isMacOSX()) {
155 // Note that the Driver allows versions which aren't representable in the
156 // define (because we only get a single digit for the minor and micro
157 // revision numbers). So, we limit them to the maximum representable
158 // version.
159 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000160 char Str[7];
161 if (Maj < 10 || (Maj == 10 && Min < 10)) {
162 Str[0] = '0' + (Maj / 10);
163 Str[1] = '0' + (Maj % 10);
164 Str[2] = '0' + std::min(Min, 9U);
165 Str[3] = '0' + std::min(Rev, 9U);
166 Str[4] = '\0';
167 } else {
168 // Handle versions > 10.9.
169 Str[0] = '0' + (Maj / 10);
170 Str[1] = '0' + (Maj % 10);
171 Str[2] = '0' + (Min / 10);
172 Str[3] = '0' + (Min % 10);
173 Str[4] = '0' + (Rev / 10);
174 Str[5] = '0' + (Rev % 10);
175 Str[6] = '\0';
176 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000177 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000178 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000179
Tim Northover157d9112014-01-16 08:48:16 +0000180 // Tell users about the kernel if there is one.
181 if (Triple.isOSDarwin())
182 Builder.defineMacro("__MACH__");
183
Daniel Dunbarecf13562011-04-19 21:40:34 +0000184 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000185}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000186
Benjamin Kramerd5748c72015-03-23 12:31:05 +0000187namespace {
Ed Schoutenf33c6072015-03-11 08:42:46 +0000188// CloudABI Target
189template <typename Target>
190class CloudABITargetInfo : public OSTargetInfo<Target> {
191protected:
192 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
193 MacroBuilder &Builder) const override {
194 Builder.defineMacro("__CloudABI__");
195 Builder.defineMacro("__ELF__");
196
197 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
198 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
199 Builder.defineMacro("__STDC_UTF_16__");
200 Builder.defineMacro("__STDC_UTF_32__");
201 }
202
203public:
204 CloudABITargetInfo(const llvm::Triple &Triple)
205 : OSTargetInfo<Target>(Triple) {
206 this->UserLabelPrefix = "";
207 }
208};
209
Torok Edwinb2b37c62009-06-30 17:10:35 +0000210template<typename Target>
211class DarwinTargetInfo : public OSTargetInfo<Target> {
212protected:
Craig Topper3164f332014-03-11 03:39:26 +0000213 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
214 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000215 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000216 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000217 }
Mike Stump11289f42009-09-09 15:08:12 +0000218
Torok Edwinb2b37c62009-06-30 17:10:35 +0000219public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000220 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
221 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
222 this->MCountName = "\01mcount";
223 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000224
Craig Topper3164f332014-03-11 03:39:26 +0000225 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000226 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000227 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000228 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000229 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000230 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000231 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000232 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000233
Craig Topper3164f332014-03-11 03:39:26 +0000234 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000235 // FIXME: We should return 0 when building kexts.
236 return "__TEXT,__StaticInit,regular,pure_instructions";
237 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000238
John McCalleed64c72012-01-29 01:20:30 +0000239 /// Darwin does not support protected visibility. Darwin's "default"
240 /// is very similar to ELF's "protected"; Darwin requires a "weak"
241 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000242 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000243 return false;
244 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000245};
246
Chris Lattner30ba6742009-08-10 19:03:04 +0000247
Torok Edwinb2b37c62009-06-30 17:10:35 +0000248// DragonFlyBSD Target
249template<typename Target>
250class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
251protected:
Craig Topper3164f332014-03-11 03:39:26 +0000252 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
253 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000254 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000255 Builder.defineMacro("__DragonFly__");
256 Builder.defineMacro("__DragonFly_cc_version", "100001");
257 Builder.defineMacro("__ELF__");
258 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
259 Builder.defineMacro("__tune_i386__");
260 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000261 }
262public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000263 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
264 : OSTargetInfo<Target>(Triple) {
265 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000266
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000267 switch (Triple.getArch()) {
268 default:
269 case llvm::Triple::x86:
270 case llvm::Triple::x86_64:
271 this->MCountName = ".mcount";
272 break;
273 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000274 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000275};
276
277// FreeBSD Target
278template<typename Target>
279class FreeBSDTargetInfo : public OSTargetInfo<Target> {
280protected:
Craig Topper3164f332014-03-11 03:39:26 +0000281 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
282 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000283 // FreeBSD defines; list based off of gcc output
284
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000285 unsigned Release = Triple.getOSMajorVersion();
286 if (Release == 0U)
287 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000288
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000289 Builder.defineMacro("__FreeBSD__", Twine(Release));
290 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000291 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
292 DefineStd(Builder, "unix", Opts);
293 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000294
295 // On FreeBSD, wchar_t contains the number of the code point as
296 // used by the character set of the locale. These character sets are
297 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000298 //
299 // FIXME: This is wrong; the macro refers to the numerical values
300 // of wchar_t *literals*, which are not locale-dependent. However,
301 // FreeBSD systems apparently depend on us getting this wrong, and
302 // setting this to 1 is conforming even if all the basic source
303 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000304 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000305 }
306public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000307 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
308 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000309
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000310 switch (Triple.getArch()) {
311 default:
312 case llvm::Triple::x86:
313 case llvm::Triple::x86_64:
314 this->MCountName = ".mcount";
315 break;
316 case llvm::Triple::mips:
317 case llvm::Triple::mipsel:
318 case llvm::Triple::ppc:
319 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000320 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000321 this->MCountName = "_mcount";
322 break;
323 case llvm::Triple::arm:
324 this->MCountName = "__mcount";
325 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000326 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000327 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328};
329
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000330// GNU/kFreeBSD Target
331template<typename Target>
332class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
333protected:
Craig Topper3164f332014-03-11 03:39:26 +0000334 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
335 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000336 // GNU/kFreeBSD defines; list based off of gcc output
337
338 DefineStd(Builder, "unix", Opts);
339 Builder.defineMacro("__FreeBSD_kernel__");
340 Builder.defineMacro("__GLIBC__");
341 Builder.defineMacro("__ELF__");
342 if (Opts.POSIXThreads)
343 Builder.defineMacro("_REENTRANT");
344 if (Opts.CPlusPlus)
345 Builder.defineMacro("_GNU_SOURCE");
346 }
347public:
Eric Christopher917e9522014-11-18 22:36:15 +0000348 KFreeBSDTargetInfo(const llvm::Triple &Triple)
349 : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000350 this->UserLabelPrefix = "";
351 }
352};
353
Chris Lattner3e2ee142010-07-07 16:01:42 +0000354// Minix Target
355template<typename Target>
356class MinixTargetInfo : public OSTargetInfo<Target> {
357protected:
Craig Topper3164f332014-03-11 03:39:26 +0000358 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
359 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000360 // Minix defines
361
362 Builder.defineMacro("__minix", "3");
363 Builder.defineMacro("_EM_WSIZE", "4");
364 Builder.defineMacro("_EM_PSIZE", "4");
365 Builder.defineMacro("_EM_SSIZE", "2");
366 Builder.defineMacro("_EM_LSIZE", "4");
367 Builder.defineMacro("_EM_FSIZE", "4");
368 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000369 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000370 DefineStd(Builder, "unix", Opts);
371 }
372public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000373 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
374 this->UserLabelPrefix = "";
375 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000376};
377
Torok Edwinb2b37c62009-06-30 17:10:35 +0000378// Linux target
379template<typename Target>
380class LinuxTargetInfo : public OSTargetInfo<Target> {
381protected:
Craig Topper3164f332014-03-11 03:39:26 +0000382 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
383 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000384 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000385 DefineStd(Builder, "unix", Opts);
386 DefineStd(Builder, "linux", Opts);
387 Builder.defineMacro("__gnu_linux__");
388 Builder.defineMacro("__ELF__");
Dan Albert84aee012015-03-03 18:28:38 +0000389 if (Triple.getEnvironment() == llvm::Triple::Android) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000390 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000391 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000392 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000393 this->PlatformName = "android";
394 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
395 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000396 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000397 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000398 if (Opts.CPlusPlus)
399 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000400 }
401public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000402 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000403 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000404 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000405
406 switch (Triple.getArch()) {
407 default:
408 break;
409 case llvm::Triple::ppc:
410 case llvm::Triple::ppc64:
411 case llvm::Triple::ppc64le:
412 this->MCountName = "_mcount";
413 break;
414 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000415 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000416
Craig Topper3164f332014-03-11 03:39:26 +0000417 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000418 return ".text.startup";
419 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000420};
421
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000422// NetBSD Target
423template<typename Target>
424class NetBSDTargetInfo : public OSTargetInfo<Target> {
425protected:
Craig Topper3164f332014-03-11 03:39:26 +0000426 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
427 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000428 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000429 Builder.defineMacro("__NetBSD__");
430 Builder.defineMacro("__unix__");
431 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000432 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000433 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000434
435 switch (Triple.getArch()) {
436 default:
437 break;
438 case llvm::Triple::arm:
439 case llvm::Triple::armeb:
440 case llvm::Triple::thumb:
441 case llvm::Triple::thumbeb:
442 Builder.defineMacro("__ARM_DWARF_EH__");
443 break;
444 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000445 }
446public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000447 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
448 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000449 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000450 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000451};
452
Torok Edwinb2b37c62009-06-30 17:10:35 +0000453// OpenBSD Target
454template<typename Target>
455class OpenBSDTargetInfo : public OSTargetInfo<Target> {
456protected:
Craig Topper3164f332014-03-11 03:39:26 +0000457 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
458 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000459 // OpenBSD defines; list based off of gcc output
460
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000461 Builder.defineMacro("__OpenBSD__");
462 DefineStd(Builder, "unix", Opts);
463 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000464 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000465 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000466 }
467public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000468 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
469 this->UserLabelPrefix = "";
470 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000471
Eli Friedman3715d1f2011-12-15 02:15:56 +0000472 switch (Triple.getArch()) {
473 default:
474 case llvm::Triple::x86:
475 case llvm::Triple::x86_64:
476 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000477 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000478 this->MCountName = "__mcount";
479 break;
480 case llvm::Triple::mips64:
481 case llvm::Triple::mips64el:
482 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000483 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000484 this->MCountName = "_mcount";
485 break;
486 }
487 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000488};
489
Eli Friedman9fa28852012-08-08 23:57:20 +0000490// Bitrig Target
491template<typename Target>
492class BitrigTargetInfo : public OSTargetInfo<Target> {
493protected:
Craig Topper3164f332014-03-11 03:39:26 +0000494 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
495 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000496 // Bitrig defines; list based off of gcc output
497
498 Builder.defineMacro("__Bitrig__");
499 DefineStd(Builder, "unix", Opts);
500 Builder.defineMacro("__ELF__");
501 if (Opts.POSIXThreads)
502 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000503
504 switch (Triple.getArch()) {
505 default:
506 break;
507 case llvm::Triple::arm:
508 case llvm::Triple::armeb:
509 case llvm::Triple::thumb:
510 case llvm::Triple::thumbeb:
511 Builder.defineMacro("__ARM_DWARF_EH__");
512 break;
513 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000514 }
515public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000516 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
517 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000518 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000519 }
520};
521
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000522// PSP Target
523template<typename Target>
524class PSPTargetInfo : public OSTargetInfo<Target> {
525protected:
Craig Topper3164f332014-03-11 03:39:26 +0000526 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
527 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000528 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000529 Builder.defineMacro("PSP");
530 Builder.defineMacro("_PSP");
531 Builder.defineMacro("__psp__");
532 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000533 }
534public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000535 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000536 this->UserLabelPrefix = "";
537 }
538};
539
John Thompsone467e192009-11-19 17:18:50 +0000540// PS3 PPU Target
541template<typename Target>
542class PS3PPUTargetInfo : public OSTargetInfo<Target> {
543protected:
Craig Topper3164f332014-03-11 03:39:26 +0000544 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
545 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000546 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000547 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000548 Builder.defineMacro("__PPU__");
549 Builder.defineMacro("__CELLOS_LV2__");
550 Builder.defineMacro("__ELF__");
551 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000552 Builder.defineMacro("_ARCH_PPC64");
553 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000554 }
555public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000556 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000557 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000558 this->LongWidth = this->LongAlign = 32;
559 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000560 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000561 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000562 this->SizeType = TargetInfo::UnsignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +0000563 this->DataLayoutString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000564 }
565};
566
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000567template <typename Target>
568class PS4OSTargetInfo : public OSTargetInfo<Target> {
569protected:
570 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
571 MacroBuilder &Builder) const override {
572 Builder.defineMacro("__FreeBSD__", "9");
573 Builder.defineMacro("__FreeBSD_cc_version", "900001");
574 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
575 DefineStd(Builder, "unix", Opts);
576 Builder.defineMacro("__ELF__");
577 Builder.defineMacro("__PS4__");
578 }
579public:
580 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
581 this->WCharType = this->UnsignedShort;
582
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000583 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
584 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000585 this->UserLabelPrefix = "";
586
587 switch (Triple.getArch()) {
588 default:
589 case llvm::Triple::x86_64:
590 this->MCountName = ".mcount";
591 break;
592 }
593 }
594};
595
Torok Edwinb2b37c62009-06-30 17:10:35 +0000596// Solaris target
597template<typename Target>
598class SolarisTargetInfo : public OSTargetInfo<Target> {
599protected:
Craig Topper3164f332014-03-11 03:39:26 +0000600 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
601 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000602 DefineStd(Builder, "sun", Opts);
603 DefineStd(Builder, "unix", Opts);
604 Builder.defineMacro("__ELF__");
605 Builder.defineMacro("__svr4__");
606 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000607 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
608 // newer, but to 500 for everything else. feature_test.h has a check to
609 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000610 // with a new version.
611 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000612 Builder.defineMacro("_XOPEN_SOURCE", "600");
613 else
614 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000615 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000616 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000617 Builder.defineMacro("_LARGEFILE_SOURCE");
618 Builder.defineMacro("_LARGEFILE64_SOURCE");
619 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000620 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000621 }
622public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000623 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000624 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000625 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000626 // FIXME: WIntType should be SignedLong
627 }
628};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000629
630// Windows target
631template<typename Target>
632class WindowsTargetInfo : public OSTargetInfo<Target> {
633protected:
Craig Topper3164f332014-03-11 03:39:26 +0000634 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
635 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000636 Builder.defineMacro("_WIN32");
637 }
638 void getVisualStudioDefines(const LangOptions &Opts,
639 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000640 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000641 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000642 Builder.defineMacro("_CPPRTTI");
643
Reid Kleckner16514352015-01-30 21:42:55 +0000644 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000645 Builder.defineMacro("_CPPUNWIND");
646 }
647
David Majnemer6a658902015-07-22 22:36:26 +0000648 if (Opts.Bool)
649 Builder.defineMacro("__BOOL_DEFINED");
650
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000651 if (!Opts.CharIsSigned)
652 Builder.defineMacro("_CHAR_UNSIGNED");
653
654 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
655 // but it works for now.
656 if (Opts.POSIXThreads)
657 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000658
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000659 if (Opts.MSCompatibilityVersion) {
660 Builder.defineMacro("_MSC_VER",
661 Twine(Opts.MSCompatibilityVersion / 100000));
662 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000663 // FIXME We cannot encode the revision information into 32-bits
664 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000665
David Majnemerb710a932015-05-11 03:57:49 +0000666 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000667 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000668 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000669
670 if (Opts.MicrosoftExt) {
671 Builder.defineMacro("_MSC_EXTENSIONS");
672
673 if (Opts.CPlusPlus11) {
674 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
675 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
676 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
677 }
678 }
679
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000680 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000681 }
682
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000683public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000684 WindowsTargetInfo(const llvm::Triple &Triple)
685 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000686};
687
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000688template <typename Target>
689class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000690protected:
Craig Topper3164f332014-03-11 03:39:26 +0000691 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
692 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000693 if (Opts.POSIXThreads)
694 Builder.defineMacro("_REENTRANT");
695 if (Opts.CPlusPlus)
696 Builder.defineMacro("_GNU_SOURCE");
697
698 DefineStd(Builder, "unix", Opts);
699 Builder.defineMacro("__ELF__");
700 Builder.defineMacro("__native_client__");
701 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000702
703public:
704 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000705 this->UserLabelPrefix = "";
706 this->LongAlign = 32;
707 this->LongWidth = 32;
708 this->PointerAlign = 32;
709 this->PointerWidth = 32;
710 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000711 this->Int64Type = TargetInfo::SignedLongLong;
712 this->DoubleAlign = 64;
713 this->LongDoubleWidth = 64;
714 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000715 this->LongLongWidth = 64;
716 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000717 this->SizeType = TargetInfo::UnsignedInt;
718 this->PtrDiffType = TargetInfo::SignedInt;
719 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000720 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000721 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000722 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000723 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000724 } else if (Triple.getArch() == llvm::Triple::x86) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000725 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000726 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000727 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000728 } else if (Triple.getArch() == llvm::Triple::mipsel) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000729 // Handled on mips' setDataLayoutString.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000730 } else {
731 assert(Triple.getArch() == llvm::Triple::le32);
Eric Christopher964a5f32015-08-05 23:48:05 +0000732 this->DataLayoutString = "e-p:32:32-i64:64";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000733 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000734 }
735};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000736
Chris Lattner09d98f52008-10-05 21:50:58 +0000737//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000738// Specific target implementations.
739//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000740
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000741// PPC abstract base class
742class PPCTargetInfo : public TargetInfo {
743 static const Builtin::Info BuiltinInfo[];
744 static const char * const GCCRegNames[];
745 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000746 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000747
748 // Target cpu features.
749 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000750 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000751 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000752 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000753 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000754 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000755 bool HasBPERMD;
756 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000757
Ulrich Weigand8afad612014-07-28 13:17:52 +0000758protected:
759 std::string ABI;
760
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000761public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000762 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000763 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000764 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000765 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000766 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000767 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000768 LongDoubleWidth = LongDoubleAlign = 128;
769 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
770 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000771
Hal Finkel6b984f02012-07-03 16:51:04 +0000772 /// \brief Flags for architecture specific defines.
773 typedef enum {
774 ArchDefineNone = 0,
775 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
776 ArchDefinePpcgr = 1 << 1,
777 ArchDefinePpcsq = 1 << 2,
778 ArchDefine440 = 1 << 3,
779 ArchDefine603 = 1 << 4,
780 ArchDefine604 = 1 << 5,
781 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000782 ArchDefinePwr5 = 1 << 7,
783 ArchDefinePwr5x = 1 << 8,
784 ArchDefinePwr6 = 1 << 9,
785 ArchDefinePwr6x = 1 << 10,
786 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000787 ArchDefinePwr8 = 1 << 12,
788 ArchDefineA2 = 1 << 13,
789 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000790 } ArchDefineTypes;
791
Bill Schmidt38378a02013-02-01 20:23:10 +0000792 // Note: GCC recognizes the following additional cpus:
793 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
794 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
795 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000796 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000797 bool CPUKnown = llvm::StringSwitch<bool>(Name)
798 .Case("generic", true)
799 .Case("440", true)
800 .Case("450", true)
801 .Case("601", true)
802 .Case("602", true)
803 .Case("603", true)
804 .Case("603e", true)
805 .Case("603ev", true)
806 .Case("604", true)
807 .Case("604e", true)
808 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000809 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000810 .Case("g3", true)
811 .Case("7400", true)
812 .Case("g4", true)
813 .Case("7450", true)
814 .Case("g4+", true)
815 .Case("750", true)
816 .Case("970", true)
817 .Case("g5", true)
818 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000819 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000820 .Case("e500mc", true)
821 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000822 .Case("power3", true)
823 .Case("pwr3", true)
824 .Case("power4", true)
825 .Case("pwr4", true)
826 .Case("power5", true)
827 .Case("pwr5", true)
828 .Case("power5x", true)
829 .Case("pwr5x", true)
830 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000831 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000832 .Case("power6x", true)
833 .Case("pwr6x", true)
834 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000835 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000836 .Case("power8", true)
837 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000838 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000839 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000840 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000841 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000842 .Case("powerpc64le", true)
843 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000844 .Default(false);
845
846 if (CPUKnown)
847 CPU = Name;
848
849 return CPUKnown;
850 }
851
Ulrich Weigand8afad612014-07-28 13:17:52 +0000852
853 StringRef getABI() const override { return ABI; }
854
Craig Topper3164f332014-03-11 03:39:26 +0000855 void getTargetBuiltins(const Builtin::Info *&Records,
856 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000857 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000858 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000859 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000860
Craig Topper3164f332014-03-11 03:39:26 +0000861 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000862
Craig Topper3164f332014-03-11 03:39:26 +0000863 void getTargetDefines(const LangOptions &Opts,
864 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000865
Craig Topper3164f332014-03-11 03:39:26 +0000866 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000867
Craig Topper3164f332014-03-11 03:39:26 +0000868 bool handleTargetFeatures(std::vector<std::string> &Features,
869 DiagnosticsEngine &Diags) override;
870 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000871 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
872 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000873
874 void getGCCRegNames(const char * const *&Names,
875 unsigned &NumNames) const override;
876 void getGCCRegAliases(const GCCRegAlias *&Aliases,
877 unsigned &NumAliases) const override;
878 bool validateAsmConstraint(const char *&Name,
879 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000880 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000881 default: return false;
882 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000883 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000884 case 'b': // Base register
885 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000886 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000887 break;
888 // FIXME: The following are added to allow parsing.
889 // I just took a guess at what the actions should be.
890 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000891 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000892 case 'v': // Altivec vector register
893 Info.setAllowsRegister();
894 break;
895 case 'w':
896 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000897 case 'd':// VSX vector register to hold vector double data
898 case 'f':// VSX vector register to hold vector float data
899 case 's':// VSX vector register to hold scalar float data
900 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000901 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000902 break;
903 default:
904 return false;
905 }
906 Info.setAllowsRegister();
907 Name++; // Skip over 'w'.
908 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000909 case 'h': // `MQ', `CTR', or `LINK' register
910 case 'q': // `MQ' register
911 case 'c': // `CTR' register
912 case 'l': // `LINK' register
913 case 'x': // `CR' register (condition register) number 0
914 case 'y': // `CR' register (condition register)
915 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000916 Info.setAllowsRegister();
917 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000918 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000919 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000920 // (use `L' instead for SImode constants)
921 case 'K': // Unsigned 16-bit constant
922 case 'L': // Signed 16-bit constant shifted left 16 bits
923 case 'M': // Constant larger than 31
924 case 'N': // Exact power of 2
925 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000926 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000927 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000928 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000929 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000930 break;
931 case 'm': // Memory operand. Note that on PowerPC targets, m can
932 // include addresses that update the base register. It
933 // is therefore only safe to use `m' in an asm statement
934 // if that asm statement accesses the operand exactly once.
935 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000936 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000937 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000938 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000939 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000940 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
941 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000942 // register to be updated.
943 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000944 if (Name[1] != 's')
945 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000946 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000947 // include any automodification of the base register. Unlike
948 // `m', this constraint can be used in asm statements that
949 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000950 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000951 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000952 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000953 break;
954 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000955 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000956 case 'Z': // Memory operand that is an indexed or indirect from a
957 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000958 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000959 Info.setAllowsMemory();
960 Info.setAllowsRegister();
961 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000962 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000963 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000964 // register (`p' is preferable for asm statements)
965 case 'S': // Constant suitable as a 64-bit mask operand
966 case 'T': // Constant suitable as a 32-bit mask operand
967 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000968 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000969 // instructions
970 case 'W': // Vector constant that does not require memory
971 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000972 break;
973 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000974 }
John Thompson07a61a42010-06-24 22:44:13 +0000975 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000976 }
Craig Topper3164f332014-03-11 03:39:26 +0000977 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000978 std::string R;
979 switch (*Constraint) {
980 case 'e':
981 case 'w':
982 // Two-character constraint; add "^" hint for later parsing.
983 R = std::string("^") + std::string(Constraint, 2);
984 Constraint++;
985 break;
986 default:
987 return TargetInfo::convertConstraint(Constraint);
988 }
989 return R;
990 }
Craig Topper3164f332014-03-11 03:39:26 +0000991 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000992 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000993 }
Craig Topper3164f332014-03-11 03:39:26 +0000994 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000995 if (RegNo == 0) return 3;
996 if (RegNo == 1) return 4;
997 return -1;
998 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +0000999
1000 bool hasSjLjLowering() const override {
1001 return true;
1002 }
David Majnemer2617ea62015-06-09 18:05:33 +00001003
1004 bool useFloat128ManglingForLongDouble() const override {
1005 return LongDoubleWidth == 128 &&
1006 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1007 getTriple().isOSBinFormatELF();
1008 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001009};
Anders Carlssonf511f642007-11-27 04:11:28 +00001010
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001011const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001012#define BUILTIN(ID, TYPE, ATTRS) \
1013 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1014#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1015 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001016#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001017};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001018
Eric Christopher917e9522014-11-18 22:36:15 +00001019/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001020/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001021bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001022 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001023 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1024 // Ignore disabled features.
1025 if (Features[i][0] == '-')
1026 continue;
1027
1028 StringRef Feature = StringRef(Features[i]).substr(1);
1029
1030 if (Feature == "vsx") {
1031 HasVSX = true;
1032 continue;
1033 }
1034
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001035 if (Feature == "bpermd") {
1036 HasBPERMD = true;
1037 continue;
1038 }
1039
1040 if (Feature == "extdiv") {
1041 HasExtDiv = true;
1042 continue;
1043 }
1044
Bill Schmidt59eb7672014-10-10 15:09:43 +00001045 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001046 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +00001047 continue;
1048 }
1049
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001050 if (Feature == "crypto") {
1051 HasP8Crypto = true;
1052 continue;
1053 }
1054
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001055 if (Feature == "direct-move") {
1056 HasDirectMove = true;
1057 continue;
1058 }
1059
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001060 if (Feature == "qpx") {
1061 HasQPX = true;
1062 continue;
1063 }
1064
Kit Barton8246f282015-03-25 19:41:41 +00001065 if (Feature == "htm") {
1066 HasHTM = true;
1067 continue;
1068 }
1069
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001070 // TODO: Finish this list and add an assert that we've handled them
1071 // all.
1072 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001073 if (!HasVSX && (HasP8Vector || HasDirectMove)) {
1074 if (HasP8Vector)
1075 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector" <<
1076 "-mno-vsx";
1077 else if (HasDirectMove)
1078 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move" <<
1079 "-mno-vsx";
1080 return false;
1081 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001082
1083 return true;
1084}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001085
Chris Lattnerecd49032009-03-02 22:27:17 +00001086/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1087/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001088void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001089 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001090 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001091 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001092 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001093 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001094 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001095 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001096 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001097 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001098 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001099 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001100 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001101 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001102
Chris Lattnerecd49032009-03-02 22:27:17 +00001103 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001104 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1105 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001106 } else {
1107 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1108 getTriple().getOS() != llvm::Triple::OpenBSD)
1109 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001110 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001111
Ulrich Weigand8afad612014-07-28 13:17:52 +00001112 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001113 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001114 Builder.defineMacro("_CALL_ELF", "1");
1115 if (ABI == "elfv2")
1116 Builder.defineMacro("_CALL_ELF", "2");
1117
Chris Lattnerecd49032009-03-02 22:27:17 +00001118 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001119 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1120 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001121
Chris Lattnerecd49032009-03-02 22:27:17 +00001122 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001123 if (LongDoubleWidth == 128)
1124 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001125
John Thompsone467e192009-11-19 17:18:50 +00001126 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001127 Builder.defineMacro("__VEC__", "10206");
1128 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001129 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001130
1131 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001132 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1133 .Case("440", ArchDefineName)
1134 .Case("450", ArchDefineName | ArchDefine440)
1135 .Case("601", ArchDefineName)
1136 .Case("602", ArchDefineName | ArchDefinePpcgr)
1137 .Case("603", ArchDefineName | ArchDefinePpcgr)
1138 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1139 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1140 .Case("604", ArchDefineName | ArchDefinePpcgr)
1141 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1142 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001143 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001144 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1145 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1146 .Case("750", ArchDefineName | ArchDefinePpcgr)
1147 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1148 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001149 .Case("a2", ArchDefineA2)
1150 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001151 .Case("pwr3", ArchDefinePpcgr)
1152 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1153 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1154 | ArchDefinePpcsq)
1155 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1156 | ArchDefinePpcgr | ArchDefinePpcsq)
1157 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1158 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1159 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1160 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1161 | ArchDefinePpcsq)
1162 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1163 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001164 | ArchDefinePpcgr | ArchDefinePpcsq)
1165 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1166 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1167 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001168 .Case("power3", ArchDefinePpcgr)
1169 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1170 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1171 | ArchDefinePpcsq)
1172 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1173 | ArchDefinePpcgr | ArchDefinePpcsq)
1174 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1175 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1176 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1177 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1178 | ArchDefinePpcsq)
1179 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1180 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001181 | ArchDefinePpcgr | ArchDefinePpcsq)
1182 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1183 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1184 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001185 .Default(ArchDefineNone);
1186
1187 if (defs & ArchDefineName)
1188 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1189 if (defs & ArchDefinePpcgr)
1190 Builder.defineMacro("_ARCH_PPCGR");
1191 if (defs & ArchDefinePpcsq)
1192 Builder.defineMacro("_ARCH_PPCSQ");
1193 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001194 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001195 if (defs & ArchDefine603)
1196 Builder.defineMacro("_ARCH_603");
1197 if (defs & ArchDefine604)
1198 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001199 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001200 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001201 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001202 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001203 if (defs & ArchDefinePwr5x)
1204 Builder.defineMacro("_ARCH_PWR5X");
1205 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001206 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001207 if (defs & ArchDefinePwr6x)
1208 Builder.defineMacro("_ARCH_PWR6X");
1209 if (defs & ArchDefinePwr7)
1210 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001211 if (defs & ArchDefinePwr8)
1212 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001213 if (defs & ArchDefineA2)
1214 Builder.defineMacro("_ARCH_A2");
1215 if (defs & ArchDefineA2q) {
1216 Builder.defineMacro("_ARCH_A2Q");
1217 Builder.defineMacro("_ARCH_QP");
1218 }
1219
1220 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1221 Builder.defineMacro("__bg__");
1222 Builder.defineMacro("__THW_BLUEGENE__");
1223 Builder.defineMacro("__bgq__");
1224 Builder.defineMacro("__TOS_BGQ__");
1225 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001226
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001227 if (HasVSX)
1228 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001229 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001230 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001231 if (HasP8Crypto)
1232 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001233 if (HasHTM)
1234 Builder.defineMacro("__HTM__");
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001235 if (getTriple().getArch() == llvm::Triple::ppc64le ||
Nemanja Ivanovice97e1112015-05-14 20:02:24 +00001236 (defs & ArchDefinePwr8) || (CPU == "pwr8")) {
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001237 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1238 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1239 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1240 if (PointerWidth == 64)
1241 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1242 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001243
Bill Schmidt38378a02013-02-01 20:23:10 +00001244 // FIXME: The following are not yet generated here by Clang, but are
1245 // generated by GCC:
1246 //
1247 // _SOFT_FLOAT_
1248 // __RECIP_PRECISION__
1249 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001250 // __RECIP__
1251 // __RECIPF__
1252 // __RSQRTE__
1253 // __RSQRTEF__
1254 // _SOFT_DOUBLE_
1255 // __NO_LWSYNC__
1256 // __HAVE_BSWAP__
1257 // __LONGDOUBLE128
1258 // __CMODEL_MEDIUM__
1259 // __CMODEL_LARGE__
1260 // _CALL_SYSV
1261 // _CALL_DARWIN
1262 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001263}
1264
1265void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1266 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1267 .Case("7400", true)
1268 .Case("g4", true)
1269 .Case("7450", true)
1270 .Case("g4+", true)
1271 .Case("970", true)
1272 .Case("g5", true)
1273 .Case("pwr6", true)
1274 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001275 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001276 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001277 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001278 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001279
1280 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001281 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1282 .Case("ppc64le", true)
1283 .Case("pwr8", true)
1284 .Default(false);
1285 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1286 .Case("ppc64le", true)
1287 .Case("pwr8", true)
1288 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001289 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1290 .Case("ppc64le", true)
1291 .Case("pwr8", true)
1292 .Case("pwr7", true)
1293 .Default(false);
1294 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1295 .Case("ppc64le", true)
1296 .Case("pwr8", true)
1297 .Case("pwr7", true)
1298 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001299 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1300 .Case("ppc64le", true)
1301 .Case("pwr8", true)
1302 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001303 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1304 .Case("ppc64le", true)
1305 .Case("pwr8", true)
1306 .Case("pwr7", true)
1307 .Default(false);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001308}
1309
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001310bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001311 return llvm::StringSwitch<bool>(Feature)
1312 .Case("powerpc", true)
1313 .Case("vsx", HasVSX)
1314 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001315 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001316 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001317 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001318 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001319 .Case("bpermd", HasBPERMD)
1320 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001321 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001322}
Chris Lattner17df24e2008-04-21 18:56:49 +00001323
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001324/* There is no clear way for the target to know which of the features in the
1325 final feature vector came from defaults and which are actually specified by
1326 the user. To that end, we use the fact that this function is not called on
1327 default features - only user specified ones. By the first time this
1328 function is called, the default features are populated.
1329 We then keep track of the features that the user specified so that we
1330 can ensure we do not override a user's request (only defaults).
1331 For example:
1332 -mcpu=pwr8 -mno-vsx (should disable vsx and everything that depends on it)
1333 -mcpu=pwr8 -mdirect-move -mno-vsx (should actually be diagnosed)
1334
1335NOTE: Do not call this from PPCTargetInfo::getDefaultFeatures
1336*/
1337void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1338 StringRef Name, bool Enabled) const {
1339 static llvm::StringMap<bool> ExplicitFeatures;
1340 ExplicitFeatures[Name] = Enabled;
1341
1342 // At this point, -mno-vsx turns off the dependent features but we respect
1343 // the user's requests.
1344 if (!Enabled && Name == "vsx") {
1345 Features["direct-move"] = ExplicitFeatures["direct-move"];
1346 Features["power8-vector"] = ExplicitFeatures["power8-vector"];
1347 }
1348 if ((Enabled && Name == "power8-vector") ||
1349 (Enabled && Name == "direct-move")) {
1350 if (ExplicitFeatures.find("vsx") == ExplicitFeatures.end()) {
1351 Features["vsx"] = true;
1352 }
1353 }
1354 Features[Name] = Enabled;
1355}
1356
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001357const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001358 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1359 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1360 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1361 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1362 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1363 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1364 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1365 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001366 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001367 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001368 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001369 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1370 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1371 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1372 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001373 "vrsave", "vscr",
1374 "spe_acc", "spefscr",
1375 "sfp"
1376};
Chris Lattner10a5b382007-01-29 05:24:35 +00001377
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001378void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001379 unsigned &NumNames) const {
1380 Names = GCCRegNames;
1381 NumNames = llvm::array_lengthof(GCCRegNames);
1382}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001383
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001384const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1385 // While some of these aliases do map to different registers
1386 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001387 { { "0" }, "r0" },
1388 { { "1"}, "r1" },
1389 { { "2" }, "r2" },
1390 { { "3" }, "r3" },
1391 { { "4" }, "r4" },
1392 { { "5" }, "r5" },
1393 { { "6" }, "r6" },
1394 { { "7" }, "r7" },
1395 { { "8" }, "r8" },
1396 { { "9" }, "r9" },
1397 { { "10" }, "r10" },
1398 { { "11" }, "r11" },
1399 { { "12" }, "r12" },
1400 { { "13" }, "r13" },
1401 { { "14" }, "r14" },
1402 { { "15" }, "r15" },
1403 { { "16" }, "r16" },
1404 { { "17" }, "r17" },
1405 { { "18" }, "r18" },
1406 { { "19" }, "r19" },
1407 { { "20" }, "r20" },
1408 { { "21" }, "r21" },
1409 { { "22" }, "r22" },
1410 { { "23" }, "r23" },
1411 { { "24" }, "r24" },
1412 { { "25" }, "r25" },
1413 { { "26" }, "r26" },
1414 { { "27" }, "r27" },
1415 { { "28" }, "r28" },
1416 { { "29" }, "r29" },
1417 { { "30" }, "r30" },
1418 { { "31" }, "r31" },
1419 { { "fr0" }, "f0" },
1420 { { "fr1" }, "f1" },
1421 { { "fr2" }, "f2" },
1422 { { "fr3" }, "f3" },
1423 { { "fr4" }, "f4" },
1424 { { "fr5" }, "f5" },
1425 { { "fr6" }, "f6" },
1426 { { "fr7" }, "f7" },
1427 { { "fr8" }, "f8" },
1428 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001429 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001430 { { "fr11" }, "f11" },
1431 { { "fr12" }, "f12" },
1432 { { "fr13" }, "f13" },
1433 { { "fr14" }, "f14" },
1434 { { "fr15" }, "f15" },
1435 { { "fr16" }, "f16" },
1436 { { "fr17" }, "f17" },
1437 { { "fr18" }, "f18" },
1438 { { "fr19" }, "f19" },
1439 { { "fr20" }, "f20" },
1440 { { "fr21" }, "f21" },
1441 { { "fr22" }, "f22" },
1442 { { "fr23" }, "f23" },
1443 { { "fr24" }, "f24" },
1444 { { "fr25" }, "f25" },
1445 { { "fr26" }, "f26" },
1446 { { "fr27" }, "f27" },
1447 { { "fr28" }, "f28" },
1448 { { "fr29" }, "f29" },
1449 { { "fr30" }, "f30" },
1450 { { "fr31" }, "f31" },
1451 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001452};
1453
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001454void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001455 unsigned &NumAliases) const {
1456 Aliases = GCCRegAliases;
1457 NumAliases = llvm::array_lengthof(GCCRegAliases);
1458}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001459
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001460class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001461public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001462 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001463 DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001464
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001465 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001466 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001467 case llvm::Triple::FreeBSD:
1468 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001469 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001470 PtrDiffType = SignedInt;
1471 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001472 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001473 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001474 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001475 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001476
Roman Divacky3ffe7462012-03-13 19:20:17 +00001477 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1478 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001479 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001480 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001481
1482 // PPC32 supports atomics up to 4 bytes.
1483 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001484 }
1485
Craig Topper3164f332014-03-11 03:39:26 +00001486 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001487 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001488 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001489 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001490};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001491
Bill Schmidt778d3872013-07-26 01:36:11 +00001492// Note: ABI differences may eventually require us to have a separate
1493// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001494class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001495public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001496 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001497 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001498 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001499 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001500
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001501 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001502 DataLayoutString = "e-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001503 ABI = "elfv2";
1504 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001505 DataLayoutString = "E-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001506 ABI = "elfv1";
1507 }
1508
1509 switch (getTriple().getOS()) {
1510 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001511 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001512 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001513 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001514 case llvm::Triple::NetBSD:
1515 IntMaxType = SignedLongLong;
1516 Int64Type = SignedLongLong;
1517 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001518 default:
1519 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001520 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001521
1522 // PPC64 supports atomics up to 8 bytes.
1523 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001524 }
Craig Topper3164f332014-03-11 03:39:26 +00001525 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001526 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001527 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001528 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001529 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001530 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001531 ABI = Name;
1532 return true;
1533 }
1534 return false;
1535 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001536};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001537
Roman Divacky965b0b72011-01-06 08:27:10 +00001538class DarwinPPC32TargetInfo :
1539 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001540public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001541 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1542 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001543 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001544 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001545 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001546 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001547 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001548 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001549 }
Craig Topper3164f332014-03-11 03:39:26 +00001550 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001551 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001552 }
1553};
1554
1555class DarwinPPC64TargetInfo :
1556 public DarwinTargetInfo<PPC64TargetInfo> {
1557public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001558 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1559 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001560 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001561 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001562 DataLayoutString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001563 }
1564};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001565
Peter Collingbournec947aae2012-05-20 23:28:41 +00001566 static const unsigned NVPTXAddrSpaceMap[] = {
1567 1, // opencl_global
1568 3, // opencl_local
1569 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001570 // FIXME: generic has to be added to the target
1571 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001572 1, // cuda_device
1573 4, // cuda_constant
1574 3, // cuda_shared
1575 };
1576 class NVPTXTargetInfo : public TargetInfo {
1577 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001578 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001579
1580 // The GPU profiles supported by the NVPTX backend
1581 enum GPUKind {
1582 GK_NONE,
1583 GK_SM20,
1584 GK_SM21,
1585 GK_SM30,
1586 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001587 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001588 } GPU;
1589
Peter Collingbournec947aae2012-05-20 23:28:41 +00001590 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001591 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001592 BigEndian = false;
1593 TLSSupported = false;
1594 LongWidth = LongAlign = 64;
1595 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001596 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001597 // Define available target features
1598 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001599 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001600 // Set the default GPU to sm20
1601 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001602 }
Craig Topper3164f332014-03-11 03:39:26 +00001603 void getTargetDefines(const LangOptions &Opts,
1604 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001605 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001606 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001607 if (Opts.CUDAIsDevice) {
1608 // Set __CUDA_ARCH__ for the GPU specified.
1609 std::string CUDAArchCode;
1610 switch (GPU) {
1611 case GK_SM20:
1612 CUDAArchCode = "200";
1613 break;
1614 case GK_SM21:
1615 CUDAArchCode = "210";
1616 break;
1617 case GK_SM30:
1618 CUDAArchCode = "300";
1619 break;
1620 case GK_SM35:
1621 CUDAArchCode = "350";
1622 break;
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001623 case GK_SM37:
1624 CUDAArchCode = "370";
1625 break;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001626 default:
1627 llvm_unreachable("Unhandled target CPU");
1628 }
1629 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1630 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001631 }
Craig Topper3164f332014-03-11 03:39:26 +00001632 void getTargetBuiltins(const Builtin::Info *&Records,
1633 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001634 Records = BuiltinInfo;
1635 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001636 }
Craig Topper3164f332014-03-11 03:39:26 +00001637 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001638 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001639 }
Craig Topper3164f332014-03-11 03:39:26 +00001640
1641 void getGCCRegNames(const char * const *&Names,
1642 unsigned &NumNames) const override;
1643 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1644 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001645 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001646 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001647 NumAliases = 0;
1648 }
Eric Christopher917e9522014-11-18 22:36:15 +00001649 bool
1650 validateAsmConstraint(const char *&Name,
1651 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001652 switch (*Name) {
1653 default: return false;
1654 case 'c':
1655 case 'h':
1656 case 'r':
1657 case 'l':
1658 case 'f':
1659 case 'd':
1660 Info.setAllowsRegister();
1661 return true;
1662 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001663 }
Craig Topper3164f332014-03-11 03:39:26 +00001664 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001665 // FIXME: Is this really right?
1666 return "";
1667 }
Craig Topper3164f332014-03-11 03:39:26 +00001668 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001669 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001670 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001671 }
Craig Topper3164f332014-03-11 03:39:26 +00001672 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001673 GPU = llvm::StringSwitch<GPUKind>(Name)
1674 .Case("sm_20", GK_SM20)
1675 .Case("sm_21", GK_SM21)
1676 .Case("sm_30", GK_SM30)
1677 .Case("sm_35", GK_SM35)
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001678 .Case("sm_37", GK_SM37)
Reid Klecknerbbc01782014-12-03 21:53:36 +00001679 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001680
Reid Klecknerbbc01782014-12-03 21:53:36 +00001681 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001682 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001683 };
1684
1685 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001686#define BUILTIN(ID, TYPE, ATTRS) \
1687 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1688#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1689 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Justin Holewinski83e96682012-05-24 17:43:12 +00001690#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001691 };
1692
1693 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1694 "r0"
1695 };
1696
1697 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1698 unsigned &NumNames) const {
1699 Names = GCCRegNames;
1700 NumNames = llvm::array_lengthof(GCCRegNames);
1701 }
1702
1703 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1704 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001705 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001706 PointerWidth = PointerAlign = 32;
Eli Bendersky13467172015-04-01 20:29:18 +00001707 SizeType = TargetInfo::UnsignedInt;
1708 PtrDiffType = TargetInfo::SignedInt;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001709 IntPtrType = TargetInfo::SignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +00001710 DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001711 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001712 };
1713
1714 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1715 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001716 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001717 PointerWidth = PointerAlign = 64;
Eli Bendersky13467172015-04-01 20:29:18 +00001718 SizeType = TargetInfo::UnsignedLong;
1719 PtrDiffType = TargetInfo::SignedLong;
Eli Bendersky15f63422015-04-01 18:29:27 +00001720 IntPtrType = TargetInfo::SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00001721 DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001722 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001723 };
Eli Friedmand13b41e2012-10-12 23:32:00 +00001724
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001725static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001726 1, // opencl_global
1727 3, // opencl_local
1728 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001729 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001730 1, // cuda_device
1731 2, // cuda_constant
1732 3 // cuda_shared
1733};
1734
Tom Stellarda96344b2014-08-21 13:58:40 +00001735// If you edit the description strings, make sure you update
1736// getPointerWidthV().
1737
Eric Christopher964a5f32015-08-05 23:48:05 +00001738static const char *DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001739 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1740 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001741
Eric Christopher964a5f32015-08-05 23:48:05 +00001742static const char *DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001743 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1744 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001745
Eric Christopher964a5f32015-08-05 23:48:05 +00001746static const char *DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001747 "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 +00001748 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1749 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001750
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001751class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001752 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001753 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001754
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001755 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001756 enum GPUKind {
1757 GK_NONE,
1758 GK_R600,
1759 GK_R600_DOUBLE_OPS,
1760 GK_R700,
1761 GK_R700_DOUBLE_OPS,
1762 GK_EVERGREEN,
1763 GK_EVERGREEN_DOUBLE_OPS,
1764 GK_NORTHERN_ISLANDS,
1765 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001766 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001767 GK_SEA_ISLANDS,
1768 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001769 } GPU;
1770
Jan Veselyeebeaea2015-05-04 19:53:36 +00001771 bool hasFP64:1;
1772 bool hasFMAF:1;
1773 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001774
Eli Friedmand13b41e2012-10-12 23:32:00 +00001775public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001776 AMDGPUTargetInfo(const llvm::Triple &Triple)
1777 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001778
1779 if (Triple.getArch() == llvm::Triple::amdgcn) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001780 DataLayoutString = DataLayoutStringSI;
Tom Stellardd99fb952015-01-28 15:38:44 +00001781 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001782 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001783 hasFMAF = true;
1784 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001785 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001786 DataLayoutString = DataLayoutStringR600;
Tom Stellardd99fb952015-01-28 15:38:44 +00001787 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001788 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001789 hasFMAF = false;
1790 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001791 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001792 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001793 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001794 }
1795
Tom Stellarda96344b2014-08-21 13:58:40 +00001796 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1797 if (GPU <= GK_CAYMAN)
1798 return 32;
1799
1800 switch(AddrSpace) {
1801 default:
1802 return 64;
1803 case 0:
1804 case 3:
1805 case 5:
1806 return 32;
1807 }
1808 }
1809
Craig Topper3164f332014-03-11 03:39:26 +00001810 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001811 return "";
1812 }
1813
Craig Topper3164f332014-03-11 03:39:26 +00001814 void getGCCRegNames(const char * const *&Names,
Tom Stellard7b1059b2015-04-14 14:36:56 +00001815 unsigned &NumNames) const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001816
Craig Topper3164f332014-03-11 03:39:26 +00001817 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1818 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001819 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001820 NumAliases = 0;
1821 }
1822
Craig Topper3164f332014-03-11 03:39:26 +00001823 bool validateAsmConstraint(const char *&Name,
1824 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001825 return true;
1826 }
1827
Craig Topper3164f332014-03-11 03:39:26 +00001828 void getTargetBuiltins(const Builtin::Info *&Records,
1829 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001830 Records = BuiltinInfo;
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001831 NumRecords = clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001832 }
1833
Craig Topper3164f332014-03-11 03:39:26 +00001834 void getTargetDefines(const LangOptions &Opts,
1835 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001836 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001837 if (hasFMAF)
1838 Builder.defineMacro("__HAS_FMAF__");
1839 if (hasLDEXPF)
1840 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001841 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001842 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001843 if (Opts.OpenCL) {
1844 if (GPU >= GK_NORTHERN_ISLANDS) {
1845 Builder.defineMacro("cl_khr_byte_addressable_store");
1846 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1847 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1848 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1849 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1850 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001851 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001852 }
1853
Craig Topper3164f332014-03-11 03:39:26 +00001854 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001855 return TargetInfo::CharPtrBuiltinVaList;
1856 }
1857
Craig Topper3164f332014-03-11 03:39:26 +00001858 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001859 GPU = llvm::StringSwitch<GPUKind>(Name)
1860 .Case("r600" , GK_R600)
1861 .Case("rv610", GK_R600)
1862 .Case("rv620", GK_R600)
1863 .Case("rv630", GK_R600)
1864 .Case("rv635", GK_R600)
1865 .Case("rs780", GK_R600)
1866 .Case("rs880", GK_R600)
1867 .Case("rv670", GK_R600_DOUBLE_OPS)
1868 .Case("rv710", GK_R700)
1869 .Case("rv730", GK_R700)
1870 .Case("rv740", GK_R700_DOUBLE_OPS)
1871 .Case("rv770", GK_R700_DOUBLE_OPS)
1872 .Case("palm", GK_EVERGREEN)
1873 .Case("cedar", GK_EVERGREEN)
1874 .Case("sumo", GK_EVERGREEN)
1875 .Case("sumo2", GK_EVERGREEN)
1876 .Case("redwood", GK_EVERGREEN)
1877 .Case("juniper", GK_EVERGREEN)
1878 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1879 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1880 .Case("barts", GK_NORTHERN_ISLANDS)
1881 .Case("turks", GK_NORTHERN_ISLANDS)
1882 .Case("caicos", GK_NORTHERN_ISLANDS)
1883 .Case("cayman", GK_CAYMAN)
1884 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001885 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001886 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1887 .Case("verde", GK_SOUTHERN_ISLANDS)
1888 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001889 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001890 .Case("bonaire", GK_SEA_ISLANDS)
1891 .Case("kabini", GK_SEA_ISLANDS)
1892 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001893 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001894 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001895 .Case("tonga", GK_VOLCANIC_ISLANDS)
1896 .Case("iceland", GK_VOLCANIC_ISLANDS)
1897 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001898 .Default(GK_NONE);
1899
1900 if (GPU == GK_NONE) {
1901 return false;
1902 }
1903
1904 // Set the correct data layout
1905 switch (GPU) {
1906 case GK_NONE:
1907 case GK_R600:
1908 case GK_R700:
1909 case GK_EVERGREEN:
1910 case GK_NORTHERN_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001911 DataLayoutString = DataLayoutStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001912 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001913 hasFMAF = false;
1914 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001915 break;
1916 case GK_R600_DOUBLE_OPS:
1917 case GK_R700_DOUBLE_OPS:
1918 case GK_EVERGREEN_DOUBLE_OPS:
1919 case GK_CAYMAN:
Eric Christopher964a5f32015-08-05 23:48:05 +00001920 DataLayoutString = DataLayoutStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001921 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001922 hasFMAF = true;
1923 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001924 break;
1925 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001926 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001927 case GK_VOLCANIC_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001928 DataLayoutString = DataLayoutStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001929 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001930 hasFMAF = true;
1931 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001932 break;
1933 }
1934
1935 return true;
1936 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001937};
1938
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001939const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001940#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001941 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001942#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001943};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001944const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001945 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1946 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1947 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1948 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1949 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1950 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1951 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1952 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1953 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1954 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1955 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1956 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1957 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1958 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1959 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1960 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1961 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1962 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1963 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1964 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1965 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1966 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1967 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1968 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1969 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1970 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1971 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1972 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1973 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1974 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1975 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1976 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1977 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1978 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1979 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1980 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1981 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1982 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1983 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1984 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1985 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1986 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
1987 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
1988 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
1989 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
1990 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
1991 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
1992 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
1993 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
1994 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
1995};
1996
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001997void AMDGPUTargetInfo::getGCCRegNames(const char * const *&Names,
1998 unsigned &NumNames) const {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001999 Names = GCCRegNames;
2000 NumNames = llvm::array_lengthof(GCCRegNames);
2001}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002002
Eli Friedman3fd920a2008-08-20 02:34:37 +00002003// Namespace for x86 abstract base class
2004const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002005#define BUILTIN(ID, TYPE, ATTRS) \
2006 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002007#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002008 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002009#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002010 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002011#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002012};
Eli Friedmanb5366062008-05-20 14:21:01 +00002013
Nuno Lopescfca1f02009-12-23 17:49:57 +00002014static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002015 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2016 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002017 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002018 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2019 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2020 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002021 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002022 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2023 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002024};
2025
Eric Christophercdd36352011-06-21 00:05:20 +00002026const TargetInfo::AddlRegName AddlRegNames[] = {
2027 { { "al", "ah", "eax", "rax" }, 0 },
2028 { { "bl", "bh", "ebx", "rbx" }, 3 },
2029 { { "cl", "ch", "ecx", "rcx" }, 2 },
2030 { { "dl", "dh", "edx", "rdx" }, 1 },
2031 { { "esi", "rsi" }, 4 },
2032 { { "edi", "rdi" }, 5 },
2033 { { "esp", "rsp" }, 7 },
2034 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002035};
2036
2037// X86 target abstract base class; x86-32 and x86-64 are very close, so
2038// most of the implementation can be shared.
2039class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002040 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002041 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00002042 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00002043 enum MMX3DNowEnum {
2044 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
2045 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002046 enum XOPEnum {
2047 NoXOP,
2048 SSE4A,
2049 FMA4,
2050 XOP
2051 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00002052
Eric Christophere1ddaf92010-04-02 23:50:19 +00002053 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00002054 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00002055 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00002056 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00002057 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00002058 bool HasBMI;
2059 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00002060 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00002061 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00002062 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00002063 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00002064 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002065 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00002066 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00002067 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00002068 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
2069 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00002070 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002071 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002072
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002073 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2074 ///
2075 /// Each enumeration represents a particular CPU supported by Clang. These
2076 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2077 enum CPUKind {
2078 CK_Generic,
2079
2080 /// \name i386
2081 /// i386-generation processors.
2082 //@{
2083 CK_i386,
2084 //@}
2085
2086 /// \name i486
2087 /// i486-generation processors.
2088 //@{
2089 CK_i486,
2090 CK_WinChipC6,
2091 CK_WinChip2,
2092 CK_C3,
2093 //@}
2094
2095 /// \name i586
2096 /// i586-generation processors, P5 microarchitecture based.
2097 //@{
2098 CK_i586,
2099 CK_Pentium,
2100 CK_PentiumMMX,
2101 //@}
2102
2103 /// \name i686
2104 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2105 //@{
2106 CK_i686,
2107 CK_PentiumPro,
2108 CK_Pentium2,
2109 CK_Pentium3,
2110 CK_Pentium3M,
2111 CK_PentiumM,
2112 CK_C3_2,
2113
2114 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2115 /// Clang however has some logic to suport this.
2116 // FIXME: Warn, deprecate, and potentially remove this.
2117 CK_Yonah,
2118 //@}
2119
2120 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002121 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002122 //@{
2123 CK_Pentium4,
2124 CK_Pentium4M,
2125 CK_Prescott,
2126 CK_Nocona,
2127 //@}
2128
2129 /// \name Core
2130 /// Core microarchitecture based processors.
2131 //@{
2132 CK_Core2,
2133
2134 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2135 /// codename which GCC no longer accepts as an option to -march, but Clang
2136 /// has some logic for recognizing it.
2137 // FIXME: Warn, deprecate, and potentially remove this.
2138 CK_Penryn,
2139 //@}
2140
2141 /// \name Atom
2142 /// Atom processors
2143 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002144 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002145 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002146 //@}
2147
2148 /// \name Nehalem
2149 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002150 CK_Nehalem,
2151
2152 /// \name Westmere
2153 /// Westmere microarchitecture based processors.
2154 CK_Westmere,
2155
2156 /// \name Sandy Bridge
2157 /// Sandy Bridge microarchitecture based processors.
2158 CK_SandyBridge,
2159
2160 /// \name Ivy Bridge
2161 /// Ivy Bridge microarchitecture based processors.
2162 CK_IvyBridge,
2163
2164 /// \name Haswell
2165 /// Haswell microarchitecture based processors.
2166 CK_Haswell,
2167
2168 /// \name Broadwell
2169 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002170 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002171
2172 /// \name Skylake
2173 /// Skylake microarchitecture based processors.
2174 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002175
Craig Topper449314e2013-08-20 07:09:39 +00002176 /// \name Knights Landing
2177 /// Knights Landing processor.
2178 CK_KNL,
2179
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002180 /// \name K6
2181 /// K6 architecture processors.
2182 //@{
2183 CK_K6,
2184 CK_K6_2,
2185 CK_K6_3,
2186 //@}
2187
2188 /// \name K7
2189 /// K7 architecture processors.
2190 //@{
2191 CK_Athlon,
2192 CK_AthlonThunderbird,
2193 CK_Athlon4,
2194 CK_AthlonXP,
2195 CK_AthlonMP,
2196 //@}
2197
2198 /// \name K8
2199 /// K8 architecture processors.
2200 //@{
2201 CK_Athlon64,
2202 CK_Athlon64SSE3,
2203 CK_AthlonFX,
2204 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002205 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002206 CK_Opteron,
2207 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002208 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002209 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002210
Benjamin Kramer569f2152012-01-10 11:50:18 +00002211 /// \name Bobcat
2212 /// Bobcat architecture processors.
2213 //@{
2214 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002215 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002216 //@}
2217
2218 /// \name Bulldozer
2219 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002220 //@{
2221 CK_BDVER1,
2222 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002223 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002224 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002225 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002226
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002227 /// This specification is deprecated and will be removed in the future.
2228 /// Users should prefer \see CK_K8.
2229 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002230 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002231 CK_x86_64,
2232 //@}
2233
2234 /// \name Geode
2235 /// Geode processors.
2236 //@{
2237 CK_Geode
2238 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002239 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002240
Rafael Espindolaeb265472013-08-21 21:59:03 +00002241 enum FPMathKind {
2242 FP_Default,
2243 FP_SSE,
2244 FP_387
2245 } FPMath;
2246
Eli Friedman3fd920a2008-08-20 02:34:37 +00002247public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002248 X86TargetInfo(const llvm::Triple &Triple)
2249 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002250 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002251 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2252 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2253 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2254 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2255 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2256 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002257 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002258 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002259 }
Craig Topper3164f332014-03-11 03:39:26 +00002260 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002261 // X87 evaluates with 80 bits "long double" precision.
2262 return SSELevel == NoSSE ? 2 : 0;
2263 }
Craig Topper3164f332014-03-11 03:39:26 +00002264 void getTargetBuiltins(const Builtin::Info *&Records,
2265 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002266 Records = BuiltinInfo;
2267 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002268 }
Craig Topper3164f332014-03-11 03:39:26 +00002269 void getGCCRegNames(const char * const *&Names,
2270 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002271 Names = GCCRegNames;
2272 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002273 }
Craig Topper3164f332014-03-11 03:39:26 +00002274 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2275 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002276 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002277 NumAliases = 0;
2278 }
Craig Topper3164f332014-03-11 03:39:26 +00002279 void getGCCAddlRegNames(const AddlRegName *&Names,
2280 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002281 Names = AddlRegNames;
2282 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002283 }
Eric Christopherd9832702015-06-29 21:00:05 +00002284 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002285 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002286 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002287
Akira Hatanaka974131e2014-09-18 18:17:18 +00002288 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2289
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002290 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2291
Akira Hatanaka974131e2014-09-18 18:17:18 +00002292 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2293
Craig Topper3164f332014-03-11 03:39:26 +00002294 std::string convertConstraint(const char *&Constraint) const override;
2295 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002296 return "~{dirflag},~{fpsr},~{flags}";
2297 }
Craig Topper3164f332014-03-11 03:39:26 +00002298 void getTargetDefines(const LangOptions &Opts,
2299 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002300 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2301 bool Enabled);
2302 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2303 bool Enabled);
2304 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2305 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002306 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2307 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002308 setFeatureEnabledImpl(Features, Name, Enabled);
2309 }
2310 // This exists purely to cut down on the number of virtual calls in
2311 // getDefaultFeatures which calls this repeatedly.
2312 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2313 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002314 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2315 bool hasFeature(StringRef Feature) const override;
2316 bool handleTargetFeatures(std::vector<std::string> &Features,
2317 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002318 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002319 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2320 return "avx512";
2321 else if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002322 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002323 else if (getTriple().getArch() == llvm::Triple::x86 &&
2324 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002325 return "no-mmx";
2326 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002327 }
Craig Topper3164f332014-03-11 03:39:26 +00002328 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002329 CPU = llvm::StringSwitch<CPUKind>(Name)
2330 .Case("i386", CK_i386)
2331 .Case("i486", CK_i486)
2332 .Case("winchip-c6", CK_WinChipC6)
2333 .Case("winchip2", CK_WinChip2)
2334 .Case("c3", CK_C3)
2335 .Case("i586", CK_i586)
2336 .Case("pentium", CK_Pentium)
2337 .Case("pentium-mmx", CK_PentiumMMX)
2338 .Case("i686", CK_i686)
2339 .Case("pentiumpro", CK_PentiumPro)
2340 .Case("pentium2", CK_Pentium2)
2341 .Case("pentium3", CK_Pentium3)
2342 .Case("pentium3m", CK_Pentium3M)
2343 .Case("pentium-m", CK_PentiumM)
2344 .Case("c3-2", CK_C3_2)
2345 .Case("yonah", CK_Yonah)
2346 .Case("pentium4", CK_Pentium4)
2347 .Case("pentium4m", CK_Pentium4M)
2348 .Case("prescott", CK_Prescott)
2349 .Case("nocona", CK_Nocona)
2350 .Case("core2", CK_Core2)
2351 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002352 .Case("bonnell", CK_Bonnell)
2353 .Case("atom", CK_Bonnell) // Legacy name.
2354 .Case("silvermont", CK_Silvermont)
2355 .Case("slm", CK_Silvermont) // Legacy name.
2356 .Case("nehalem", CK_Nehalem)
2357 .Case("corei7", CK_Nehalem) // Legacy name.
2358 .Case("westmere", CK_Westmere)
2359 .Case("sandybridge", CK_SandyBridge)
2360 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2361 .Case("ivybridge", CK_IvyBridge)
2362 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2363 .Case("haswell", CK_Haswell)
2364 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002365 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002366 .Case("skylake", CK_Skylake)
2367 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002368 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002369 .Case("k6", CK_K6)
2370 .Case("k6-2", CK_K6_2)
2371 .Case("k6-3", CK_K6_3)
2372 .Case("athlon", CK_Athlon)
2373 .Case("athlon-tbird", CK_AthlonThunderbird)
2374 .Case("athlon-4", CK_Athlon4)
2375 .Case("athlon-xp", CK_AthlonXP)
2376 .Case("athlon-mp", CK_AthlonMP)
2377 .Case("athlon64", CK_Athlon64)
2378 .Case("athlon64-sse3", CK_Athlon64SSE3)
2379 .Case("athlon-fx", CK_AthlonFX)
2380 .Case("k8", CK_K8)
2381 .Case("k8-sse3", CK_K8SSE3)
2382 .Case("opteron", CK_Opteron)
2383 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002384 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002385 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002386 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002387 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002388 .Case("bdver1", CK_BDVER1)
2389 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002390 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002391 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002392 .Case("x86-64", CK_x86_64)
2393 .Case("geode", CK_Geode)
2394 .Default(CK_Generic);
2395
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002396 // Perform any per-CPU checks necessary to determine if this CPU is
2397 // acceptable.
2398 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2399 // invalid without explaining *why*.
2400 switch (CPU) {
2401 case CK_Generic:
2402 // No processor selected!
2403 return false;
2404
2405 case CK_i386:
2406 case CK_i486:
2407 case CK_WinChipC6:
2408 case CK_WinChip2:
2409 case CK_C3:
2410 case CK_i586:
2411 case CK_Pentium:
2412 case CK_PentiumMMX:
2413 case CK_i686:
2414 case CK_PentiumPro:
2415 case CK_Pentium2:
2416 case CK_Pentium3:
2417 case CK_Pentium3M:
2418 case CK_PentiumM:
2419 case CK_Yonah:
2420 case CK_C3_2:
2421 case CK_Pentium4:
2422 case CK_Pentium4M:
2423 case CK_Prescott:
2424 case CK_K6:
2425 case CK_K6_2:
2426 case CK_K6_3:
2427 case CK_Athlon:
2428 case CK_AthlonThunderbird:
2429 case CK_Athlon4:
2430 case CK_AthlonXP:
2431 case CK_AthlonMP:
2432 case CK_Geode:
2433 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002434 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002435 return false;
2436
2437 // Fallthrough
2438 case CK_Nocona:
2439 case CK_Core2:
2440 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002441 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002442 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002443 case CK_Nehalem:
2444 case CK_Westmere:
2445 case CK_SandyBridge:
2446 case CK_IvyBridge:
2447 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002448 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002449 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002450 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002451 case CK_Athlon64:
2452 case CK_Athlon64SSE3:
2453 case CK_AthlonFX:
2454 case CK_K8:
2455 case CK_K8SSE3:
2456 case CK_Opteron:
2457 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002458 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002459 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002460 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002461 case CK_BDVER1:
2462 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002463 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002464 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002465 case CK_x86_64:
2466 return true;
2467 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002468 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002469 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002470
Craig Topper3164f332014-03-11 03:39:26 +00002471 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002472
Craig Topper3164f332014-03-11 03:39:26 +00002473 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002474 // We accept all non-ARM calling conventions
2475 return (CC == CC_X86ThisCall ||
2476 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002477 CC == CC_X86StdCall ||
2478 CC == CC_X86VectorCall ||
2479 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002480 CC == CC_X86Pascal ||
2481 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002482 }
2483
Craig Topper3164f332014-03-11 03:39:26 +00002484 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002485 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002486 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002487
2488 bool hasSjLjLowering() const override {
2489 return true;
2490 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002491};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002492
Rafael Espindolaeb265472013-08-21 21:59:03 +00002493bool X86TargetInfo::setFPMath(StringRef Name) {
2494 if (Name == "387") {
2495 FPMath = FP_387;
2496 return true;
2497 }
2498 if (Name == "sse") {
2499 FPMath = FP_SSE;
2500 return true;
2501 }
2502 return false;
2503}
2504
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002505void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002506 // FIXME: This *really* should not be here.
2507
2508 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002509 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002510 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002511
Chandler Carruth212334f2011-09-28 08:55:37 +00002512 switch (CPU) {
2513 case CK_Generic:
2514 case CK_i386:
2515 case CK_i486:
2516 case CK_i586:
2517 case CK_Pentium:
2518 case CK_i686:
2519 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002520 break;
2521 case CK_PentiumMMX:
2522 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002523 case CK_K6:
2524 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002525 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002526 break;
2527 case CK_Pentium3:
2528 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002529 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002530 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002531 break;
2532 case CK_PentiumM:
2533 case CK_Pentium4:
2534 case CK_Pentium4M:
2535 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002536 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002537 break;
2538 case CK_Yonah:
2539 case CK_Prescott:
2540 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002541 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002542 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002543 break;
2544 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002545 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002546 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002547 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002548 break;
2549 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002550 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002551 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002552 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002553 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002554 setFeatureEnabledImpl(Features, "avx512f", true);
2555 setFeatureEnabledImpl(Features, "avx512cd", true);
2556 setFeatureEnabledImpl(Features, "avx512dq", true);
2557 setFeatureEnabledImpl(Features, "avx512bw", true);
2558 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002559 // FALLTHROUGH
2560 case CK_Broadwell:
2561 setFeatureEnabledImpl(Features, "rdseed", true);
2562 setFeatureEnabledImpl(Features, "adx", true);
2563 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002564 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002565 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002566 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002567 setFeatureEnabledImpl(Features, "bmi", true);
2568 setFeatureEnabledImpl(Features, "bmi2", true);
2569 setFeatureEnabledImpl(Features, "rtm", true);
2570 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002571 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002572 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002573 setFeatureEnabledImpl(Features, "rdrnd", true);
2574 setFeatureEnabledImpl(Features, "f16c", true);
2575 setFeatureEnabledImpl(Features, "fsgsbase", true);
2576 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002577 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002578 setFeatureEnabledImpl(Features, "avx", true);
2579 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002580 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002581 case CK_Silvermont:
2582 setFeatureEnabledImpl(Features, "aes", true);
2583 setFeatureEnabledImpl(Features, "pclmul", true);
2584 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002585 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002586 setFeatureEnabledImpl(Features, "sse4.2", true);
2587 setFeatureEnabledImpl(Features, "cx16", true);
2588 break;
2589 case CK_KNL:
2590 setFeatureEnabledImpl(Features, "avx512f", true);
2591 setFeatureEnabledImpl(Features, "avx512cd", true);
2592 setFeatureEnabledImpl(Features, "avx512er", true);
2593 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002594 setFeatureEnabledImpl(Features, "rdseed", true);
2595 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002596 setFeatureEnabledImpl(Features, "lzcnt", true);
2597 setFeatureEnabledImpl(Features, "bmi", true);
2598 setFeatureEnabledImpl(Features, "bmi2", true);
2599 setFeatureEnabledImpl(Features, "rtm", true);
2600 setFeatureEnabledImpl(Features, "fma", true);
2601 setFeatureEnabledImpl(Features, "rdrnd", true);
2602 setFeatureEnabledImpl(Features, "f16c", true);
2603 setFeatureEnabledImpl(Features, "fsgsbase", true);
2604 setFeatureEnabledImpl(Features, "aes", true);
2605 setFeatureEnabledImpl(Features, "pclmul", true);
2606 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002607 break;
2608 case CK_K6_2:
2609 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002610 case CK_WinChip2:
2611 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002612 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002613 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002614 case CK_Athlon:
2615 case CK_AthlonThunderbird:
2616 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002617 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002618 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002619 case CK_Athlon4:
2620 case CK_AthlonXP:
2621 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002622 setFeatureEnabledImpl(Features, "sse", true);
2623 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002624 break;
2625 case CK_K8:
2626 case CK_Opteron:
2627 case CK_Athlon64:
2628 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002629 setFeatureEnabledImpl(Features, "sse2", true);
2630 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002631 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002632 case CK_AMDFAM10:
2633 setFeatureEnabledImpl(Features, "sse4a", true);
2634 setFeatureEnabledImpl(Features, "lzcnt", true);
2635 setFeatureEnabledImpl(Features, "popcnt", true);
2636 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002637 case CK_K8SSE3:
2638 case CK_OpteronSSE3:
2639 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002640 setFeatureEnabledImpl(Features, "sse3", true);
2641 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002642 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002643 case CK_BTVER2:
2644 setFeatureEnabledImpl(Features, "avx", true);
2645 setFeatureEnabledImpl(Features, "aes", true);
2646 setFeatureEnabledImpl(Features, "pclmul", true);
2647 setFeatureEnabledImpl(Features, "bmi", true);
2648 setFeatureEnabledImpl(Features, "f16c", true);
2649 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002650 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002651 setFeatureEnabledImpl(Features, "ssse3", true);
2652 setFeatureEnabledImpl(Features, "sse4a", true);
2653 setFeatureEnabledImpl(Features, "lzcnt", true);
2654 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002655 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002656 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002657 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002658 case CK_BDVER4:
2659 setFeatureEnabledImpl(Features, "avx2", true);
2660 setFeatureEnabledImpl(Features, "bmi2", true);
2661 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002662 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002663 setFeatureEnabledImpl(Features, "fsgsbase", true);
2664 // FALLTHROUGH
2665 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002666 setFeatureEnabledImpl(Features, "bmi", true);
2667 setFeatureEnabledImpl(Features, "fma", true);
2668 setFeatureEnabledImpl(Features, "f16c", true);
2669 setFeatureEnabledImpl(Features, "tbm", true);
2670 // FALLTHROUGH
2671 case CK_BDVER1:
2672 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002673 setFeatureEnabledImpl(Features, "xop", true);
2674 setFeatureEnabledImpl(Features, "lzcnt", true);
2675 setFeatureEnabledImpl(Features, "aes", true);
2676 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002677 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002678 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002679 break;
Eli Friedman33465822011-07-08 23:31:17 +00002680 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002681}
2682
Rafael Espindolae62e2792013-08-20 13:44:29 +00002683void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002684 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002685 if (Enabled) {
2686 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002687 case AVX512F:
2688 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002689 case AVX2:
2690 Features["avx2"] = true;
2691 case AVX:
2692 Features["avx"] = true;
2693 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002694 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002695 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002696 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002697 case SSSE3:
2698 Features["ssse3"] = true;
2699 case SSE3:
2700 Features["sse3"] = true;
2701 case SSE2:
2702 Features["sse2"] = true;
2703 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002704 Features["sse"] = true;
2705 case NoSSE:
2706 break;
2707 }
2708 return;
2709 }
2710
2711 switch (Level) {
2712 case NoSSE:
2713 case SSE1:
2714 Features["sse"] = false;
2715 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002716 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2717 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002718 case SSE3:
2719 Features["sse3"] = false;
2720 setXOPLevel(Features, NoXOP, false);
2721 case SSSE3:
2722 Features["ssse3"] = false;
2723 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002724 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002725 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002726 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002727 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002728 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002729 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002730 case AVX2:
2731 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002732 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002733 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002734 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2735 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002736 }
2737}
2738
2739void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002740 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002741 if (Enabled) {
2742 switch (Level) {
2743 case AMD3DNowAthlon:
2744 Features["3dnowa"] = true;
2745 case AMD3DNow:
2746 Features["3dnow"] = true;
2747 case MMX:
2748 Features["mmx"] = true;
2749 case NoMMX3DNow:
2750 break;
2751 }
2752 return;
2753 }
2754
2755 switch (Level) {
2756 case NoMMX3DNow:
2757 case MMX:
2758 Features["mmx"] = false;
2759 case AMD3DNow:
2760 Features["3dnow"] = false;
2761 case AMD3DNowAthlon:
2762 Features["3dnowa"] = false;
2763 }
2764}
2765
2766void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002767 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002768 if (Enabled) {
2769 switch (Level) {
2770 case XOP:
2771 Features["xop"] = true;
2772 case FMA4:
2773 Features["fma4"] = true;
2774 setSSELevel(Features, AVX, true);
2775 case SSE4A:
2776 Features["sse4a"] = true;
2777 setSSELevel(Features, SSE3, true);
2778 case NoXOP:
2779 break;
2780 }
2781 return;
2782 }
2783
2784 switch (Level) {
2785 case NoXOP:
2786 case SSE4A:
2787 Features["sse4a"] = false;
2788 case FMA4:
2789 Features["fma4"] = false;
2790 case XOP:
2791 Features["xop"] = false;
2792 }
2793}
2794
Craig Topper86d79ef2013-09-17 04:51:29 +00002795void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2796 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002797 // This is a bit of a hack to deal with the sse4 target feature when used
2798 // as part of the target attribute. We handle sse4 correctly everywhere
2799 // else. See below for more information on how we handle the sse4 options.
2800 if (Name != "sse4")
2801 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002802
Craig Topper29561122013-09-19 01:13:07 +00002803 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002804 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002805 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002806 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002807 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002808 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002809 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002810 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002811 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002812 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002813 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002814 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002815 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002816 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002817 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002818 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002819 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002820 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002821 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002822 if (Enabled)
2823 setSSELevel(Features, SSE2, Enabled);
2824 } else if (Name == "pclmul") {
2825 if (Enabled)
2826 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002827 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002828 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002829 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002830 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002831 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002832 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002833 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2834 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002835 if (Enabled)
2836 setSSELevel(Features, AVX512F, Enabled);
2837 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002838 if (Enabled)
2839 setSSELevel(Features, AVX, Enabled);
2840 } else if (Name == "fma4") {
2841 setXOPLevel(Features, FMA4, Enabled);
2842 } else if (Name == "xop") {
2843 setXOPLevel(Features, XOP, Enabled);
2844 } else if (Name == "sse4a") {
2845 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002846 } else if (Name == "f16c") {
2847 if (Enabled)
2848 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002849 } else if (Name == "sha") {
2850 if (Enabled)
2851 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002852 } else if (Name == "sse4") {
2853 // We can get here via the __target__ attribute since that's not controlled
2854 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2855 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2856 // disabled.
2857 if (Enabled)
2858 setSSELevel(Features, SSE42, Enabled);
2859 else
2860 setSSELevel(Features, SSE41, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002861 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002862}
2863
Eric Christopher3ff21b32013-10-16 21:26:26 +00002864/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002865/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002866bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002867 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002868 // Remember the maximum enabled sselevel.
2869 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2870 // Ignore disabled features.
2871 if (Features[i][0] == '-')
2872 continue;
2873
Benjamin Kramer27402c62012-03-05 15:10:44 +00002874 StringRef Feature = StringRef(Features[i]).substr(1);
2875
2876 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002877 HasAES = true;
2878 continue;
2879 }
2880
Craig Topper3f122a72012-05-31 05:18:48 +00002881 if (Feature == "pclmul") {
2882 HasPCLMUL = true;
2883 continue;
2884 }
2885
Benjamin Kramer27402c62012-03-05 15:10:44 +00002886 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002887 HasLZCNT = true;
2888 continue;
2889 }
2890
Rafael Espindola89049822013-08-23 20:21:37 +00002891 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002892 HasRDRND = true;
2893 continue;
2894 }
2895
Craig Topper8c7f2512014-11-03 06:51:41 +00002896 if (Feature == "fsgsbase") {
2897 HasFSGSBASE = true;
2898 continue;
2899 }
2900
Benjamin Kramer27402c62012-03-05 15:10:44 +00002901 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002902 HasBMI = true;
2903 continue;
2904 }
2905
Benjamin Kramer27402c62012-03-05 15:10:44 +00002906 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002907 HasBMI2 = true;
2908 continue;
2909 }
2910
Benjamin Kramer27402c62012-03-05 15:10:44 +00002911 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002912 HasPOPCNT = true;
2913 continue;
2914 }
2915
Michael Liao625a8752012-11-10 05:17:46 +00002916 if (Feature == "rtm") {
2917 HasRTM = true;
2918 continue;
2919 }
2920
Michael Liao74f4eaf2013-03-26 17:52:08 +00002921 if (Feature == "prfchw") {
2922 HasPRFCHW = true;
2923 continue;
2924 }
2925
Michael Liaoffaae352013-03-29 05:17:55 +00002926 if (Feature == "rdseed") {
2927 HasRDSEED = true;
2928 continue;
2929 }
2930
Robert Khasanov50e6f582014-09-19 09:53:48 +00002931 if (Feature == "adx") {
2932 HasADX = true;
2933 continue;
2934 }
2935
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002936 if (Feature == "tbm") {
2937 HasTBM = true;
2938 continue;
2939 }
2940
Craig Topperbba778b2012-06-03 21:46:30 +00002941 if (Feature == "fma") {
2942 HasFMA = true;
2943 continue;
2944 }
2945
Manman Rena45358c2012-10-11 00:59:55 +00002946 if (Feature == "f16c") {
2947 HasF16C = true;
2948 continue;
2949 }
2950
Craig Topper679b53a2013-08-21 05:29:10 +00002951 if (Feature == "avx512cd") {
2952 HasAVX512CD = true;
2953 continue;
2954 }
2955
2956 if (Feature == "avx512er") {
2957 HasAVX512ER = true;
2958 continue;
2959 }
2960
2961 if (Feature == "avx512pf") {
2962 HasAVX512PF = true;
2963 continue;
2964 }
2965
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002966 if (Feature == "avx512dq") {
2967 HasAVX512DQ = true;
2968 continue;
2969 }
2970
2971 if (Feature == "avx512bw") {
2972 HasAVX512BW = true;
2973 continue;
2974 }
2975
2976 if (Feature == "avx512vl") {
2977 HasAVX512VL = true;
2978 continue;
2979 }
2980
Ben Langmuir58078d02013-09-19 13:22:04 +00002981 if (Feature == "sha") {
2982 HasSHA = true;
2983 continue;
2984 }
2985
Nick Lewycky50e8f482013-10-05 20:14:27 +00002986 if (Feature == "cx16") {
2987 HasCX16 = true;
2988 continue;
2989 }
2990
Daniel Dunbar979586e2009-11-11 09:38:56 +00002991 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002992 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002993 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002994 .Case("avx2", AVX2)
2995 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002996 .Case("sse4.2", SSE42)
2997 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002998 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002999 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00003000 .Case("sse2", SSE2)
3001 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003002 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003003 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003004
Eli Friedman33465822011-07-08 23:31:17 +00003005 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003006 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00003007 .Case("3dnowa", AMD3DNowAthlon)
3008 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00003009 .Case("mmx", MMX)
3010 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003011 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003012
3013 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
3014 .Case("xop", XOP)
3015 .Case("fma4", FMA4)
3016 .Case("sse4a", SSE4A)
3017 .Default(NoXOP);
3018 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003019 }
Eli Friedman33465822011-07-08 23:31:17 +00003020
Craig Topper7481d8a2013-09-10 06:55:47 +00003021 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3022 // Can't do this earlier because we need to be able to explicitly enable
3023 // popcnt and still disable sse4.2.
3024 if (!HasPOPCNT && SSELevel >= SSE42 &&
3025 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
3026 HasPOPCNT = true;
3027 Features.push_back("+popcnt");
3028 }
3029
Yunzhong Gao61089362013-10-16 19:07:02 +00003030 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3031 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
3032 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
3033 HasPRFCHW = true;
3034 Features.push_back("+prfchw");
3035 }
3036
Rafael Espindolaeb265472013-08-21 21:59:03 +00003037 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3038 // matches the selected sse level.
3039 if (FPMath == FP_SSE && SSELevel < SSE1) {
3040 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
3041 return false;
3042 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
3043 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
3044 return false;
3045 }
3046
Eli Friedman33465822011-07-08 23:31:17 +00003047 // Don't tell the backend if we're turning off mmx; it will end up disabling
3048 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00003049 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3050 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00003051 std::vector<std::string>::iterator it;
3052 it = std::find(Features.begin(), Features.end(), "-mmx");
3053 if (it != Features.end())
3054 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00003055 else if (SSELevel > NoSSE)
3056 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Alexey Bataev00396512015-07-02 03:40:19 +00003057
3058 SimdDefaultAlign =
3059 (getABI() == "avx512") ? 512 : (getABI() == "avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003060 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003061}
Chris Lattnerecd49032009-03-02 22:27:17 +00003062
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003063/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3064/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003065void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003066 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003067 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003068 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003069 Builder.defineMacro("__amd64__");
3070 Builder.defineMacro("__amd64");
3071 Builder.defineMacro("__x86_64");
3072 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003073 if (getTriple().getArchName() == "x86_64h") {
3074 Builder.defineMacro("__x86_64h");
3075 Builder.defineMacro("__x86_64h__");
3076 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003077 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003078 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003079 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003080
Chris Lattnerecd49032009-03-02 22:27:17 +00003081 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003082 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3083 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003084 switch (CPU) {
3085 case CK_Generic:
3086 break;
3087 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003088 // The rest are coming from the i386 define above.
3089 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003090 break;
3091 case CK_i486:
3092 case CK_WinChipC6:
3093 case CK_WinChip2:
3094 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003095 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003096 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003097 case CK_PentiumMMX:
3098 Builder.defineMacro("__pentium_mmx__");
3099 Builder.defineMacro("__tune_pentium_mmx__");
3100 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003101 case CK_i586:
3102 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003103 defineCPUMacros(Builder, "i586");
3104 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003105 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003106 case CK_Pentium3:
3107 case CK_Pentium3M:
3108 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003109 Builder.defineMacro("__tune_pentium3__");
3110 // Fallthrough
3111 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003112 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003113 Builder.defineMacro("__tune_pentium2__");
3114 // Fallthrough
3115 case CK_PentiumPro:
3116 Builder.defineMacro("__tune_i686__");
3117 Builder.defineMacro("__tune_pentiumpro__");
3118 // Fallthrough
3119 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003120 Builder.defineMacro("__i686");
3121 Builder.defineMacro("__i686__");
3122 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3123 Builder.defineMacro("__pentiumpro");
3124 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003125 break;
3126 case CK_Pentium4:
3127 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003128 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003129 break;
3130 case CK_Yonah:
3131 case CK_Prescott:
3132 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003133 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003134 break;
3135 case CK_Core2:
3136 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003137 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003138 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003139 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003140 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003141 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003142 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003143 defineCPUMacros(Builder, "slm");
3144 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003145 case CK_Nehalem:
3146 case CK_Westmere:
3147 case CK_SandyBridge:
3148 case CK_IvyBridge:
3149 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003150 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003151 // FIXME: Historically, we defined this legacy name, it would be nice to
3152 // remove it at some point. We've never exposed fine-grained names for
3153 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003154 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003155 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003156 case CK_Skylake:
3157 // FIXME: Historically, we defined this legacy name, it would be nice to
3158 // remove it at some point. This is the only fine-grained CPU macro in the
3159 // main intel CPU line, and it would be better to not have these and force
3160 // people to use ISA macros.
3161 defineCPUMacros(Builder, "skx");
3162 break;
Craig Topper449314e2013-08-20 07:09:39 +00003163 case CK_KNL:
3164 defineCPUMacros(Builder, "knl");
3165 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003166 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003167 Builder.defineMacro("__k6_2__");
3168 Builder.defineMacro("__tune_k6_2__");
3169 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003170 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003171 if (CPU != CK_K6_2) { // In case of fallthrough
3172 // FIXME: GCC may be enabling these in cases where some other k6
3173 // architecture is specified but -m3dnow is explicitly provided. The
3174 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003175 Builder.defineMacro("__k6_3__");
3176 Builder.defineMacro("__tune_k6_3__");
3177 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003178 // Fallthrough
3179 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003180 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003181 break;
3182 case CK_Athlon:
3183 case CK_AthlonThunderbird:
3184 case CK_Athlon4:
3185 case CK_AthlonXP:
3186 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003187 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003188 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003189 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003190 Builder.defineMacro("__tune_athlon_sse__");
3191 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003192 break;
3193 case CK_K8:
3194 case CK_K8SSE3:
3195 case CK_x86_64:
3196 case CK_Opteron:
3197 case CK_OpteronSSE3:
3198 case CK_Athlon64:
3199 case CK_Athlon64SSE3:
3200 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003201 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003202 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003203 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003204 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003205 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003206 case CK_BTVER1:
3207 defineCPUMacros(Builder, "btver1");
3208 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003209 case CK_BTVER2:
3210 defineCPUMacros(Builder, "btver2");
3211 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003212 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003213 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003214 break;
3215 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003216 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003217 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003218 case CK_BDVER3:
3219 defineCPUMacros(Builder, "bdver3");
3220 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003221 case CK_BDVER4:
3222 defineCPUMacros(Builder, "bdver4");
3223 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003224 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003225 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003226 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003227 }
Chris Lattner96e43572009-03-02 22:40:39 +00003228
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003229 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003230 Builder.defineMacro("__REGISTER_PREFIX__", "");
3231
Chris Lattner6df41af2009-04-19 17:32:33 +00003232 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3233 // functions in glibc header files that use FP Stack inline asm which the
3234 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003235 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003236
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003237 if (HasAES)
3238 Builder.defineMacro("__AES__");
3239
Craig Topper3f122a72012-05-31 05:18:48 +00003240 if (HasPCLMUL)
3241 Builder.defineMacro("__PCLMUL__");
3242
Craig Topper22967d42011-12-25 05:06:45 +00003243 if (HasLZCNT)
3244 Builder.defineMacro("__LZCNT__");
3245
Benjamin Kramer1e250392012-07-07 09:39:18 +00003246 if (HasRDRND)
3247 Builder.defineMacro("__RDRND__");
3248
Craig Topper8c7f2512014-11-03 06:51:41 +00003249 if (HasFSGSBASE)
3250 Builder.defineMacro("__FSGSBASE__");
3251
Craig Topper22967d42011-12-25 05:06:45 +00003252 if (HasBMI)
3253 Builder.defineMacro("__BMI__");
3254
3255 if (HasBMI2)
3256 Builder.defineMacro("__BMI2__");
3257
Craig Topper1de83482011-12-29 16:10:46 +00003258 if (HasPOPCNT)
3259 Builder.defineMacro("__POPCNT__");
3260
Michael Liao625a8752012-11-10 05:17:46 +00003261 if (HasRTM)
3262 Builder.defineMacro("__RTM__");
3263
Michael Liao74f4eaf2013-03-26 17:52:08 +00003264 if (HasPRFCHW)
3265 Builder.defineMacro("__PRFCHW__");
3266
Michael Liaoffaae352013-03-29 05:17:55 +00003267 if (HasRDSEED)
3268 Builder.defineMacro("__RDSEED__");
3269
Robert Khasanov50e6f582014-09-19 09:53:48 +00003270 if (HasADX)
3271 Builder.defineMacro("__ADX__");
3272
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003273 if (HasTBM)
3274 Builder.defineMacro("__TBM__");
3275
Rafael Espindolae62e2792013-08-20 13:44:29 +00003276 switch (XOPLevel) {
3277 case XOP:
3278 Builder.defineMacro("__XOP__");
3279 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003280 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003281 case SSE4A:
3282 Builder.defineMacro("__SSE4A__");
3283 case NoXOP:
3284 break;
3285 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003286
Craig Topperbba778b2012-06-03 21:46:30 +00003287 if (HasFMA)
3288 Builder.defineMacro("__FMA__");
3289
Manman Rena45358c2012-10-11 00:59:55 +00003290 if (HasF16C)
3291 Builder.defineMacro("__F16C__");
3292
Craig Topper679b53a2013-08-21 05:29:10 +00003293 if (HasAVX512CD)
3294 Builder.defineMacro("__AVX512CD__");
3295 if (HasAVX512ER)
3296 Builder.defineMacro("__AVX512ER__");
3297 if (HasAVX512PF)
3298 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003299 if (HasAVX512DQ)
3300 Builder.defineMacro("__AVX512DQ__");
3301 if (HasAVX512BW)
3302 Builder.defineMacro("__AVX512BW__");
3303 if (HasAVX512VL)
3304 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003305
Ben Langmuir58078d02013-09-19 13:22:04 +00003306 if (HasSHA)
3307 Builder.defineMacro("__SHA__");
3308
Nick Lewycky50e8f482013-10-05 20:14:27 +00003309 if (HasCX16)
3310 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3311
Chris Lattner96e43572009-03-02 22:40:39 +00003312 // Each case falls through to the previous one here.
3313 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003314 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003315 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003316 case AVX2:
3317 Builder.defineMacro("__AVX2__");
3318 case AVX:
3319 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003320 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003321 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003322 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003323 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003324 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003325 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003326 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003327 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003328 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003329 Builder.defineMacro("__SSE2__");
3330 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003331 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003332 Builder.defineMacro("__SSE__");
3333 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003334 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003335 break;
3336 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003337
Derek Schuffc7dd7222012-10-11 15:52:22 +00003338 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003339 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003340 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003341 case AVX2:
3342 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003343 case SSE42:
3344 case SSE41:
3345 case SSSE3:
3346 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003347 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003348 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003349 break;
3350 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003351 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003352 break;
3353 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003354 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003355 }
3356 }
3357
Anders Carlssone437c682010-01-27 03:47:49 +00003358 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003359 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003360 case AMD3DNowAthlon:
3361 Builder.defineMacro("__3dNOW_A__");
3362 case AMD3DNow:
3363 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003364 case MMX:
3365 Builder.defineMacro("__MMX__");
3366 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003367 break;
3368 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003369
3370 if (CPU >= CK_i486) {
3371 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3372 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3373 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3374 }
3375 if (CPU >= CK_i586)
3376 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003377}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003378
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003379bool X86TargetInfo::hasFeature(StringRef Feature) const {
3380 return llvm::StringSwitch<bool>(Feature)
3381 .Case("aes", HasAES)
3382 .Case("avx", SSELevel >= AVX)
3383 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003384 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003385 .Case("avx512cd", HasAVX512CD)
3386 .Case("avx512er", HasAVX512ER)
3387 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003388 .Case("avx512dq", HasAVX512DQ)
3389 .Case("avx512bw", HasAVX512BW)
3390 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003391 .Case("bmi", HasBMI)
3392 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003393 .Case("cx16", HasCX16)
3394 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003395 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003396 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003397 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003398 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003399 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3400 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3401 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003402 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003403 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003404 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003405 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003406 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003407 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003408 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003409 .Case("sse", SSELevel >= SSE1)
3410 .Case("sse2", SSELevel >= SSE2)
3411 .Case("sse3", SSELevel >= SSE3)
3412 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003413 .Case("sse4.1", SSELevel >= SSE41)
3414 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003415 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003416 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003417 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003418 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3419 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003420 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003421 .Default(false);
3422}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003423
Eric Christopherd9832702015-06-29 21:00:05 +00003424// We can't use a generic validation scheme for the features accepted here
3425// versus subtarget features accepted in the target attribute because the
3426// bitfield structure that's initialized in the runtime only supports the
3427// below currently rather than the full range of subtarget features. (See
3428// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3429bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3430 return llvm::StringSwitch<bool>(FeatureStr)
3431 .Case("cmov", true)
3432 .Case("mmx", true)
3433 .Case("popcnt", true)
3434 .Case("sse", true)
3435 .Case("sse2", true)
3436 .Case("sse3", true)
3437 .Case("sse4.1", true)
3438 .Case("sse4.2", true)
3439 .Case("avx", true)
3440 .Case("avx2", true)
3441 .Case("sse4a", true)
3442 .Case("fma4", true)
3443 .Case("xop", true)
3444 .Case("fma", true)
3445 .Case("avx512f", true)
3446 .Case("bmi", true)
3447 .Case("bmi2", true)
3448 .Default(false);
3449}
3450
Eli Friedman3fd920a2008-08-20 02:34:37 +00003451bool
Anders Carlsson58436352009-02-28 17:11:49 +00003452X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003453 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003454 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003455 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003456 // Constant constraints.
3457 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3458 // instructions.
3459 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3460 // x86_64 instructions.
3461 case 's':
3462 Info.setRequiresImmediate();
3463 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003464 case 'I':
3465 Info.setRequiresImmediate(0, 31);
3466 return true;
3467 case 'J':
3468 Info.setRequiresImmediate(0, 63);
3469 return true;
3470 case 'K':
3471 Info.setRequiresImmediate(-128, 127);
3472 return true;
3473 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003474 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003475 return true;
3476 case 'M':
3477 Info.setRequiresImmediate(0, 3);
3478 return true;
3479 case 'N':
3480 Info.setRequiresImmediate(0, 255);
3481 return true;
3482 case 'O':
3483 Info.setRequiresImmediate(0, 127);
3484 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003485 // Register constraints.
3486 case 'Y': // 'Y' is the first character for several 2-character constraints.
3487 // Shift the pointer to the second character of the constraint.
3488 Name++;
3489 switch (*Name) {
3490 default:
3491 return false;
3492 case '0': // First SSE register.
3493 case 't': // Any SSE register, when SSE2 is enabled.
3494 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3495 case 'm': // Any MMX register, when inter-unit moves enabled.
3496 Info.setAllowsRegister();
3497 return true;
3498 }
3499 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003500 // Constraint 'f' cannot be used for output operands.
3501 if (Info.ConstraintStr[0] == '=')
3502 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003503 Info.setAllowsRegister();
3504 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003505 case 'a': // eax.
3506 case 'b': // ebx.
3507 case 'c': // ecx.
3508 case 'd': // edx.
3509 case 'S': // esi.
3510 case 'D': // edi.
3511 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003512 case 't': // Top of floating point stack.
3513 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003514 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003515 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003516 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003517 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003518 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3519 case 'l': // "Index" registers: any general register that can be used as an
3520 // index in a base+index memory access.
3521 Info.setAllowsRegister();
3522 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003523 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003524 case 'C': // SSE floating point constant.
3525 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003526 return true;
3527 }
3528}
3529
Akira Hatanaka974131e2014-09-18 18:17:18 +00003530bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3531 unsigned Size) const {
3532 // Strip off constraint modifiers.
3533 while (Constraint[0] == '=' ||
3534 Constraint[0] == '+' ||
3535 Constraint[0] == '&')
3536 Constraint = Constraint.substr(1);
3537
3538 return validateOperandSize(Constraint, Size);
3539}
3540
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003541bool X86TargetInfo::validateInputSize(StringRef Constraint,
3542 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003543 return validateOperandSize(Constraint, Size);
3544}
3545
3546bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3547 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003548 switch (Constraint[0]) {
3549 default: break;
3550 case 'y':
3551 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003552 case 'f':
3553 case 't':
3554 case 'u':
3555 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003556 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003557 if (SSELevel >= AVX512F)
3558 // 512-bit zmm registers can be used if target supports AVX512F.
3559 return Size <= 512U;
3560 else if (SSELevel >= AVX)
3561 // 256-bit ymm registers can be used if target supports AVX.
3562 return Size <= 256U;
3563 return Size <= 128U;
3564 case 'Y':
3565 // 'Y' is the first character for several 2-character constraints.
3566 switch (Constraint[1]) {
3567 default: break;
3568 case 'm':
3569 // 'Ym' is synonymous with 'y'.
3570 return Size <= 64;
3571 case 'i':
3572 case 't':
3573 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3574 if (SSELevel >= AVX512F)
3575 return Size <= 512U;
3576 else if (SSELevel >= AVX)
3577 return Size <= 256U;
3578 return SSELevel >= SSE2 && Size <= 128U;
3579 }
3580
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003581 }
3582
3583 return true;
3584}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003585
Eli Friedman3fd920a2008-08-20 02:34:37 +00003586std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003587X86TargetInfo::convertConstraint(const char *&Constraint) const {
3588 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003589 case 'a': return std::string("{ax}");
3590 case 'b': return std::string("{bx}");
3591 case 'c': return std::string("{cx}");
3592 case 'd': return std::string("{dx}");
3593 case 'S': return std::string("{si}");
3594 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003595 case 'p': // address
3596 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003597 case 't': // top of floating point stack.
3598 return std::string("{st}");
3599 case 'u': // second from top of floating point stack.
3600 return std::string("{st(1)}"); // second from top of floating point stack.
3601 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003602 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003603 }
3604}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003605
Eli Friedman3fd920a2008-08-20 02:34:37 +00003606// X86-32 generic target
3607class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003608public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003609 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003610 DoubleAlign = LongLongAlign = 32;
3611 LongDoubleWidth = 96;
3612 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003613 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003614 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003615 SizeType = UnsignedInt;
3616 PtrDiffType = SignedInt;
3617 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003618 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003619
3620 // Use fpret for all types.
3621 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3622 (1 << TargetInfo::Double) |
3623 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003624
3625 // x86-32 has atomics up to 8 bytes
3626 // FIXME: Check that we actually have cmpxchg8b before setting
3627 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3628 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003629 }
Craig Topper3164f332014-03-11 03:39:26 +00003630 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003631 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003632 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003633
Craig Topper3164f332014-03-11 03:39:26 +00003634 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003635 if (RegNo == 0) return 0;
3636 if (RegNo == 1) return 2;
3637 return -1;
3638 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003639 bool validateOperandSize(StringRef Constraint,
3640 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003641 switch (Constraint[0]) {
3642 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003643 case 'R':
3644 case 'q':
3645 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003646 case 'a':
3647 case 'b':
3648 case 'c':
3649 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003650 case 'S':
3651 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003652 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003653 case 'A':
3654 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003655 }
3656
Akira Hatanaka974131e2014-09-18 18:17:18 +00003657 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003658 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003659};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003660
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003661class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3662public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003663 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3664 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003665
Craig Topper3164f332014-03-11 03:39:26 +00003666 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003667 unsigned Major, Minor, Micro;
3668 getTriple().getOSVersion(Major, Minor, Micro);
3669 // New NetBSD uses the default rounding mode.
3670 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3671 return X86_32TargetInfo::getFloatEvalMethod();
3672 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003673 return 1;
3674 }
3675};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003676
Eli Friedmane3aa4542009-07-05 18:47:56 +00003677class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3678public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003679 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3680 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003681 SizeType = UnsignedLong;
3682 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003683 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003684 }
3685};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003686
Eli Friedman9fa28852012-08-08 23:57:20 +00003687class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3688public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003689 BitrigI386TargetInfo(const llvm::Triple &Triple)
3690 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003691 SizeType = UnsignedLong;
3692 IntPtrType = SignedLong;
3693 PtrDiffType = SignedLong;
3694 }
3695};
Eli Friedman9fa28852012-08-08 23:57:20 +00003696
Torok Edwinb2b37c62009-06-30 17:10:35 +00003697class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003698public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003699 DarwinI386TargetInfo(const llvm::Triple &Triple)
3700 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003701 LongDoubleWidth = 128;
3702 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003703 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003704 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003705 SizeType = UnsignedLong;
3706 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003707 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003708 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003709 }
3710
Eli Friedman3fd920a2008-08-20 02:34:37 +00003711};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003712
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003713// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003714class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003715public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003716 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3717 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003718 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003719 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003720 bool IsWinCOFF =
3721 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003722 DataLayoutString = IsWinCOFF
3723 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3724 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003725 }
Craig Topper3164f332014-03-11 03:39:26 +00003726 void getTargetDefines(const LangOptions &Opts,
3727 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003728 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3729 }
3730};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003731
3732// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003733class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003734public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003735 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003736 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003737 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003738 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3739 }
Craig Topper3164f332014-03-11 03:39:26 +00003740 void getTargetDefines(const LangOptions &Opts,
3741 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003742 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3743 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3744 // The value of the following reflects processor type.
3745 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3746 // We lost the original triple, so we use the default.
3747 Builder.defineMacro("_M_IX86", "600");
3748 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003749};
3750} // end anonymous namespace
3751
David Majnemerae1ed0e2015-05-28 04:36:18 +00003752static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3753 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang supports
Reid Kleckner47606832014-04-21 20:58:00 +00003754 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3755 // macro anyway for pre-processor compatibility.
3756 if (Opts.MicrosoftExt)
3757 Builder.defineMacro("__declspec", "__declspec");
3758 else
3759 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3760
3761 if (!Opts.MicrosoftExt) {
3762 // Provide macros for all the calling convention keywords. Provide both
3763 // single and double underscore prefixed variants. These are available on
3764 // x64 as well as x86, even though they have no effect.
3765 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3766 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003767 std::string GCCSpelling = "__attribute__((__";
3768 GCCSpelling += CC;
3769 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003770 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3771 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3772 }
3773 }
3774}
3775
David Majnemerae1ed0e2015-05-28 04:36:18 +00003776static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3777 Builder.defineMacro("__MSVCRT__");
3778 Builder.defineMacro("__MINGW32__");
3779 addCygMingDefines(Opts, Builder);
3780}
3781
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003782namespace {
3783// x86-32 MinGW target
3784class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3785public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003786 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3787 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003788 void getTargetDefines(const LangOptions &Opts,
3789 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003790 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003791 DefineStd(Builder, "WIN32", Opts);
3792 DefineStd(Builder, "WINNT", Opts);
3793 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003794 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003795 }
3796};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003797
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003798// x86-32 Cygwin target
3799class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3800public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003801 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3802 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003803 TLSSupported = false;
3804 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003805 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003806 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 +00003807 }
Craig Topper3164f332014-03-11 03:39:26 +00003808 void getTargetDefines(const LangOptions &Opts,
3809 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003810 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003811 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003812 Builder.defineMacro("__CYGWIN__");
3813 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003814 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003815 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003816 if (Opts.CPlusPlus)
3817 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003818 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003819};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003820
Chris Lattnerb986aba2010-04-11 19:29:39 +00003821// x86-32 Haiku target
3822class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3823public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003824 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003825 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003826 IntPtrType = SignedLong;
3827 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003828 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003829 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003830 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003831 }
Craig Topper3164f332014-03-11 03:39:26 +00003832 void getTargetDefines(const LangOptions &Opts,
3833 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003834 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3835 Builder.defineMacro("__INTEL__");
3836 Builder.defineMacro("__HAIKU__");
3837 }
3838};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003839
Douglas Gregor9fabd852011-07-01 22:41:14 +00003840// RTEMS Target
3841template<typename Target>
3842class RTEMSTargetInfo : public OSTargetInfo<Target> {
3843protected:
Craig Topper3164f332014-03-11 03:39:26 +00003844 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3845 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003846 // RTEMS defines; list based off of gcc output
3847
Douglas Gregor9fabd852011-07-01 22:41:14 +00003848 Builder.defineMacro("__rtems__");
3849 Builder.defineMacro("__ELF__");
3850 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003851
Douglas Gregor9fabd852011-07-01 22:41:14 +00003852public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003853 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3854 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003855
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003856 switch (Triple.getArch()) {
3857 default:
3858 case llvm::Triple::x86:
3859 // this->MCountName = ".mcount";
3860 break;
3861 case llvm::Triple::mips:
3862 case llvm::Triple::mipsel:
3863 case llvm::Triple::ppc:
3864 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003865 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003866 // this->MCountName = "_mcount";
3867 break;
3868 case llvm::Triple::arm:
3869 // this->MCountName = "__mcount";
3870 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003871 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003872 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003873};
3874
Douglas Gregor9fabd852011-07-01 22:41:14 +00003875// x86-32 RTEMS target
3876class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3877public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003878 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003879 SizeType = UnsignedLong;
3880 IntPtrType = SignedLong;
3881 PtrDiffType = SignedLong;
3882 this->UserLabelPrefix = "";
3883 }
Craig Topper3164f332014-03-11 03:39:26 +00003884 void getTargetDefines(const LangOptions &Opts,
3885 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003886 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3887 Builder.defineMacro("__INTEL__");
3888 Builder.defineMacro("__rtems__");
3889 }
3890};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003891
Eli Friedman3fd920a2008-08-20 02:34:37 +00003892// x86-64 generic target
3893class X86_64TargetInfo : public X86TargetInfo {
3894public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003895 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003896 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003897 bool IsWinCOFF =
3898 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003899 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003900 LongDoubleWidth = 128;
3901 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003902 LargeArrayMinWidth = 128;
3903 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003904 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003905 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3906 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3907 IntPtrType = IsX32 ? SignedInt : SignedLong;
3908 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003909 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003910 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003911
Eric Christopher917e9522014-11-18 22:36:15 +00003912 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003913 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3914 : IsWinCOFF
3915 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3916 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003917
3918 // Use fpret only for long double.
3919 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003920
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003921 // Use fp2ret for _Complex long double.
3922 ComplexLongDoubleUsesFP2Ret = true;
3923
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003924 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003925 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003926 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003927 }
Craig Topper3164f332014-03-11 03:39:26 +00003928 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003929 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003930 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003931
Craig Topper3164f332014-03-11 03:39:26 +00003932 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003933 if (RegNo == 0) return 0;
3934 if (RegNo == 1) return 1;
3935 return -1;
3936 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003937
Craig Topper3164f332014-03-11 03:39:26 +00003938 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003939 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003940 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003941 CC == CC_IntelOclBicc ||
3942 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003943 }
3944
Craig Topper3164f332014-03-11 03:39:26 +00003945 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003946 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003947 }
3948
Pavel Chupinfd223e12014-08-04 12:39:43 +00003949 // for x32 we need it here explicitly
3950 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003951};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003952
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003953// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003954class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003955public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003956 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3957 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003958 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003959 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003960 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003961 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003962 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003963 SizeType = UnsignedLongLong;
3964 PtrDiffType = SignedLongLong;
3965 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003966 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003967 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003968
Craig Topper3164f332014-03-11 03:39:26 +00003969 void getTargetDefines(const LangOptions &Opts,
3970 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003971 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003972 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003973 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003974
Craig Topper3164f332014-03-11 03:39:26 +00003975 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003976 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003977 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003978
Craig Topper3164f332014-03-11 03:39:26 +00003979 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003980 switch (CC) {
3981 case CC_X86StdCall:
3982 case CC_X86ThisCall:
3983 case CC_X86FastCall:
3984 return CCCR_Ignore;
3985 case CC_C:
3986 case CC_X86VectorCall:
3987 case CC_IntelOclBicc:
3988 case CC_X86_64SysV:
3989 return CCCR_OK;
3990 default:
3991 return CCCR_Warning;
3992 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003993 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003994};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003995
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003996// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003997class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003998public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003999 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004000 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00004001 LongDoubleWidth = LongDoubleAlign = 64;
4002 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004003 }
Craig Topper3164f332014-03-11 03:39:26 +00004004 void getTargetDefines(const LangOptions &Opts,
4005 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004006 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4007 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004008 Builder.defineMacro("_M_X64", "100");
4009 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004010 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004011};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004012
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004013// x86-64 MinGW target
4014class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4015public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004016 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
4017 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00004018 void getTargetDefines(const LangOptions &Opts,
4019 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004020 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004021 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004022 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004023 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004024
4025 // GCC defines this macro when it is using __gxx_personality_seh0.
4026 if (!Opts.SjLjExceptions)
4027 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004028 }
4029};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004030
Yaron Kerend030d112015-07-22 17:38:19 +00004031// x86-64 Cygwin target
4032class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4033public:
4034 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4035 : X86_64TargetInfo(Triple) {
4036 TLSSupported = false;
4037 WCharType = UnsignedShort;
4038 }
4039 void getTargetDefines(const LangOptions &Opts,
4040 MacroBuilder &Builder) const override {
4041 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4042 Builder.defineMacro("__x86_64__");
4043 Builder.defineMacro("__CYGWIN__");
4044 Builder.defineMacro("__CYGWIN64__");
4045 addCygMingDefines(Opts, Builder);
4046 DefineStd(Builder, "unix", Opts);
4047 if (Opts.CPlusPlus)
4048 Builder.defineMacro("_GNU_SOURCE");
4049
4050 // GCC defines this macro when it is using __gxx_personality_seh0.
4051 if (!Opts.SjLjExceptions)
4052 Builder.defineMacro("__SEH__");
4053 }
4054};
4055
Eli Friedman2857ccb2009-07-01 03:36:11 +00004056class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4057public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004058 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4059 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004060 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00004061 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00004062 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4063 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004064 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004065 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004066 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004067 }
4068};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004069
Eli Friedman245f2292009-07-05 22:31:18 +00004070class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4071public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004072 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4073 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004074 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004075 Int64Type = SignedLongLong;
4076 }
4077};
Eli Friedman245f2292009-07-05 22:31:18 +00004078
Eli Friedman9fa28852012-08-08 23:57:20 +00004079class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4080public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004081 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4082 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4083 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004084 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004085 }
4086};
Tim Northover9bb857a2013-01-31 12:13:10 +00004087
Eli Friedmanf05b7722008-08-20 07:44:10 +00004088class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004089 // Possible FPU choices.
4090 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004091 VFP2FPU = (1 << 0),
4092 VFP3FPU = (1 << 1),
4093 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004094 NeonFPU = (1 << 3),
4095 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004096 };
4097
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004098 // Possible HWDiv features.
4099 enum HWDivMode {
4100 HWDivThumb = (1 << 0),
4101 HWDivARM = (1 << 1)
4102 };
4103
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004104 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004105 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004106 }
4107
4108 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4109 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004110
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004111 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004112
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004113 StringRef DefaultCPU;
4114 StringRef CPUProfile;
4115 StringRef CPUAttr;
4116
Rafael Espindolaeb265472013-08-21 21:59:03 +00004117 enum {
4118 FP_Default,
4119 FP_VFP,
4120 FP_Neon
4121 } FPMath;
4122
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004123 unsigned ArchISA;
4124 unsigned ArchKind;
4125 unsigned ArchProfile;
4126 unsigned ArchVersion;
4127
Bernard Ogdenda13af32013-10-24 18:32:51 +00004128 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004129
Logan Chien57086ce2012-10-10 06:56:20 +00004130 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004131 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004132
4133 // Initialized via features.
4134 unsigned SoftFloat : 1;
4135 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004136
Bernard Ogden18b57012013-10-29 09:47:51 +00004137 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004138 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00004139
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004140 // ACLE 6.5.1 Hardware floating point
4141 enum {
4142 HW_FP_HP = (1 << 1), /// half (16-bit)
4143 HW_FP_SP = (1 << 2), /// single (32-bit)
4144 HW_FP_DP = (1 << 3), /// double (64-bit)
4145 };
4146 uint32_t HW_FP;
4147
Chris Lattner5cc15e02010-03-03 19:03:45 +00004148 static const Builtin::Info BuiltinInfo[];
4149
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004150 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004151 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004152
4153 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004154 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004155
Renato Golin9ba39232015-02-27 16:35:48 +00004156 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4157 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4158 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004159 SizeType = UnsignedLong;
4160 else
4161 SizeType = UnsignedInt;
4162
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004163 switch (T.getOS()) {
4164 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004165 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004166 break;
4167 case llvm::Triple::Win32:
4168 WCharType = UnsignedShort;
4169 break;
4170 case llvm::Triple::Linux:
4171 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004172 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4173 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004174 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004175 }
4176
4177 UseBitFieldTypeAlignment = true;
4178
4179 ZeroLengthBitfieldBoundary = 0;
4180
Tim Northover147cd2f2014-10-14 22:12:21 +00004181 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4182 // so set preferred for small types to 32.
4183 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004184 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004185 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4186 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4187 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004188 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004189 DataLayoutString = "e"
4190 "-m:w"
4191 "-p:32:32"
4192 "-i64:64"
4193 "-v128:64:128"
4194 "-a:0:32"
4195 "-n32"
4196 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004197 } else if (T.isOSNaCl()) {
4198 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004199 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004200 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004201 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004202 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4203 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004204 }
4205
4206 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004207 }
4208
4209 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004210 const llvm::Triple &T = getTriple();
4211
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004212 IsAAPCS = false;
4213
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004214 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004215
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004216 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004217 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004218 SizeType = UnsignedInt;
4219 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004220 SizeType = UnsignedLong;
4221
4222 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4223 WCharType = SignedInt;
4224
4225 // Do not respect the alignment of bit-field types when laying out
4226 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4227 UseBitFieldTypeAlignment = false;
4228
4229 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4230 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4231 /// gcc.
4232 ZeroLengthBitfieldBoundary = 32;
4233
Tim Northover147cd2f2014-10-14 22:12:21 +00004234 if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004235 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004236 BigEndian
4237 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4238 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4239 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004240 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004241 BigEndian
4242 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4243 : "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 +00004244
4245 // FIXME: Override "preferred align" for double and long long.
4246 }
4247
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004248 void setArchInfo() {
4249 StringRef ArchName = getTriple().getArchName();
4250
4251 ArchISA = llvm::ARMTargetParser::parseArchISA(ArchName);
4252 DefaultCPU = getDefaultCPU(ArchName);
4253
4254 // SubArch is specified by the target triple
4255 if (!DefaultCPU.empty())
4256 setArchInfo(DefaultCPU);
4257 else
4258 // FIXME ArchInfo should be based on ArchName from triple, not on
4259 // a hard-coded CPU name. Doing so currently causes regressions:
4260 // test/Preprocessor/init.c: __ARM_ARCH_6J__ not defined
4261 setArchInfo(CPU);
4262 }
4263
4264 void setArchInfo(StringRef CPU) {
4265 StringRef SubArch;
4266
4267 // cache TargetParser info
4268 ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
4269 SubArch = llvm::ARMTargetParser::getSubArch(ArchKind);
4270 ArchProfile = llvm::ARMTargetParser::parseArchProfile(SubArch);
4271 ArchVersion = llvm::ARMTargetParser::parseArchVersion(SubArch);
4272
4273 // cache CPU related strings
4274 CPUAttr = getCPUAttr();
4275 CPUProfile = getCPUProfile();
4276 }
4277
4278 void setAtomic() {
4279 // when triple does not specify a sub arch,
4280 // then we are not using inline atomics
4281 bool ShouldUseInlineAtomic = DefaultCPU.empty() ?
4282 false :
4283 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4284 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
4285 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4286 if (ArchProfile == llvm::ARM::PK_M) {
4287 MaxAtomicPromoteWidth = 32;
4288 if (ShouldUseInlineAtomic)
4289 MaxAtomicInlineWidth = 32;
4290 }
4291 else {
4292 MaxAtomicPromoteWidth = 64;
4293 if (ShouldUseInlineAtomic)
4294 MaxAtomicInlineWidth = 64;
4295 }
4296 }
4297
4298 bool isThumb() const {
4299 return (ArchISA == llvm::ARM::IK_THUMB);
4300 }
4301
4302 bool supportsThumb() const {
4303 return CPUAttr.count('T') || ArchVersion >= 6;
4304 }
4305
4306 bool supportsThumb2() const {
4307 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4308 }
4309
4310 StringRef getDefaultCPU(StringRef ArchName) const {
4311 const char *DefaultCPU = llvm::ARMTargetParser::getDefaultCPU(ArchName);
4312 return DefaultCPU ? DefaultCPU : "";
4313 }
4314
4315 StringRef getCPUAttr() const {
4316 const char *CPUAttr;
4317 // For most sub-arches, the build attribute CPU name is enough.
4318 // For Cortex variants, it's slightly different.
4319 switch(ArchKind) {
4320 default:
4321 CPUAttr = llvm::ARMTargetParser::getCPUAttr(ArchKind);
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004322 return CPUAttr ? CPUAttr : "";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004323 case llvm::ARM::AK_ARMV6M:
4324 case llvm::ARM::AK_ARMV6SM:
4325 case llvm::ARM::AK_ARMV6HL:
4326 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004327 case llvm::ARM::AK_ARMV7S:
4328 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004329 case llvm::ARM::AK_ARMV7:
4330 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004331 case llvm::ARM::AK_ARMV7L:
4332 case llvm::ARM::AK_ARMV7HL:
4333 return "7A";
4334 case llvm::ARM::AK_ARMV7R:
4335 return "7R";
4336 case llvm::ARM::AK_ARMV7M:
4337 return "7M";
4338 case llvm::ARM::AK_ARMV7EM:
4339 return "7EM";
4340 case llvm::ARM::AK_ARMV8A:
4341 return "8A";
4342 case llvm::ARM::AK_ARMV8_1A:
4343 return "8_1A";
4344 }
4345 }
4346
4347 StringRef getCPUProfile() const {
4348 switch(ArchProfile) {
4349 case llvm::ARM::PK_A:
4350 return "A";
4351 case llvm::ARM::PK_R:
4352 return "R";
4353 case llvm::ARM::PK_M:
4354 return "M";
4355 default:
4356 return "";
4357 }
4358 }
4359
Chris Lattner17df24e2008-04-21 18:56:49 +00004360public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004361 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004362 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004363 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004364 BigEndian = IsBigEndian;
4365
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004366 switch (getTriple().getOS()) {
4367 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004368 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004369 break;
4370 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004371 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004372 break;
4373 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004374
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004375 // cache arch related info
4376 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004377
Chris Lattner1a8f3942010-04-23 16:29:58 +00004378 // {} in inline assembly are neon specifiers, not assembly variant
4379 // specifiers.
4380 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004381
Eric Christopher0e261882014-12-05 01:06:59 +00004382 // FIXME: This duplicates code from the driver that sets the -target-abi
4383 // option - this code is used if -target-abi isn't passed and should
4384 // be unified in some way.
4385 if (Triple.isOSBinFormatMachO()) {
4386 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4387 // the frontend matches that.
4388 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4389 Triple.getOS() == llvm::Triple::UnknownOS ||
4390 StringRef(CPU).startswith("cortex-m")) {
4391 setABI("aapcs");
4392 } else {
4393 setABI("apcs-gnu");
4394 }
4395 } else if (Triple.isOSWindows()) {
4396 // FIXME: this is invalid for WindowsCE
4397 setABI("aapcs");
4398 } else {
4399 // Select the default based on the platform.
4400 switch (Triple.getEnvironment()) {
4401 case llvm::Triple::Android:
4402 case llvm::Triple::GNUEABI:
4403 case llvm::Triple::GNUEABIHF:
4404 setABI("aapcs-linux");
4405 break;
4406 case llvm::Triple::EABIHF:
4407 case llvm::Triple::EABI:
4408 setABI("aapcs");
4409 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004410 case llvm::Triple::GNU:
4411 setABI("apcs-gnu");
4412 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004413 default:
4414 if (Triple.getOS() == llvm::Triple::NetBSD)
4415 setABI("apcs-gnu");
4416 else
4417 setABI("aapcs");
4418 break;
4419 }
4420 }
John McCall86353412010-08-21 22:46:04 +00004421
4422 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004423 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004424
Renato Golin15b86152015-07-03 16:41:13 +00004425 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004426 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004427
James Molloya7139222012-03-12 09:14:10 +00004428 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004429 // the alignment of the zero-length bitfield is greater than the member
4430 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004431 // zero length bitfield.
4432 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004433 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004434
Alp Toker4925ba72014-06-07 23:30:42 +00004435 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004436
Craig Topper3164f332014-03-11 03:39:26 +00004437 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004438 ABI = Name;
4439
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004440 // The defaults (above) are for AAPCS, check if we need to change them.
4441 //
4442 // FIXME: We need support for -meabi... we could just mangle it into the
4443 // name.
4444 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004445 setABIAPCS();
4446 return true;
4447 }
4448 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4449 setABIAAPCS();
4450 return true;
4451 }
4452 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004453 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004454
Renato Golinf5c4dec2015-05-27 13:33:00 +00004455 // FIXME: This should be based on Arch attributes, not CPU names.
Craig Topper3164f332014-03-11 03:39:26 +00004456 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004457 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4458 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004459 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004460 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004461 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004462 }
4463 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004464 Features["vfp4"] = true;
4465 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004466 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4467 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004468 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004469 Features["vfp4"] = true;
4470 Features["neon"] = true;
4471 Features["hwdiv"] = true;
4472 Features["hwdiv-arm"] = true;
Tim Northoverf9b517c2015-05-01 21:17:25 +00004473 } else if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
4474 CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004475 Features["fp-armv8"] = true;
4476 Features["neon"] = true;
4477 Features["hwdiv"] = true;
4478 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004479 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004480 Features["crypto"] = true;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004481 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" || ArchVersion == 8) {
Silviu Barangae5690462013-10-21 10:59:33 +00004482 Features["hwdiv"] = true;
4483 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004484 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
Javed Absar879d18b82015-04-09 14:12:10 +00004485 CPU == "sc300" || CPU == "cortex-r4" || CPU == "cortex-r4f") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004486 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004487 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004488 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004489
Craig Topper3164f332014-03-11 03:39:26 +00004490 bool handleTargetFeatures(std::vector<std::string> &Features,
4491 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004492 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004493 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004494 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004495 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004496 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004497
Ranjeet Singhac08e532015-06-24 23:39:25 +00004498 // This does not diagnose illegal cases like having both
4499 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4500 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004501 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004502 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004503 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004504 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004505 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004506 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004507 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004508 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004509 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004510 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004511 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004512 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004513 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004514 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004515 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004516 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004517 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004518 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004519 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004520 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004521 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004522 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004523 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004524 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004525 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004526 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004527 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004528 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004529 } else if (Feature == "+fp-only-sp") {
Ranjeet Singhac08e532015-06-24 23:39:25 +00004530 HW_FP_remove |= HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004531 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004532 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004533 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004534
Rafael Espindolaeb265472013-08-21 21:59:03 +00004535 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4536 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4537 return false;
4538 }
4539
4540 if (FPMath == FP_Neon)
4541 Features.push_back("+neonfp");
4542 else if (FPMath == FP_VFP)
4543 Features.push_back("-neonfp");
4544
Daniel Dunbar893d4752009-12-19 04:15:38 +00004545 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004546 auto Feature =
4547 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4548 if (Feature != Features.end())
4549 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004550
Rafael Espindolaeb265472013-08-21 21:59:03 +00004551 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004552 }
4553
Craig Topper3164f332014-03-11 03:39:26 +00004554 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004555 return llvm::StringSwitch<bool>(Feature)
4556 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004557 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004558 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004559 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004560 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004561 .Case("hwdiv", HWDiv & HWDivThumb)
4562 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004563 .Default(false);
4564 }
Renato Golin15b86152015-07-03 16:41:13 +00004565
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004566 bool setCPU(const std::string &Name) override {
Renato Golin15b86152015-07-03 16:41:13 +00004567 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(Name);
4568 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004569 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004570 setArchInfo(Name);
4571 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004572 CPU = Name;
4573 return true;
4574 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004575
Craig Topper3164f332014-03-11 03:39:26 +00004576 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004577
Craig Topper3164f332014-03-11 03:39:26 +00004578 void getTargetDefines(const LangOptions &Opts,
4579 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004580 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004581 Builder.defineMacro("__arm");
4582 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004583
Chris Lattnerecd49032009-03-02 22:27:17 +00004584 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004585 Builder.defineMacro("__REGISTER_PREFIX__", "");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004586 if (!CPUAttr.empty())
4587 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004588
4589 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004590 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004591 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004592 if (ArchVersion >= 8) {
Eric Christopher917e9522014-11-18 22:36:15 +00004593 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4594 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004595 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004596
4597 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4598 // is not defined for the M-profile.
4599 // NOTE that the deffault profile is assumed to be 'A'
4600 if (CPUProfile.empty() || CPUProfile != "M")
4601 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4602
4603 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4604 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4605 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004606 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004607 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004608 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004609 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4610
4611 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4612 // instruction set such as ARM or Thumb.
4613 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4614
4615 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4616
4617 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004618 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004619 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004620
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004621 // ACLE 6.5.1 Hardware Floating Point
4622 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004623 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004624
Yi Konga44c4d72014-06-27 21:25:42 +00004625 // ACLE predefines.
4626 Builder.defineMacro("__ARM_ACLE", "200");
4627
Mike Stump9d54bd72009-04-08 02:07:04 +00004628 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004629
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004630 // FIXME: It's more complicated than this and we don't really support
4631 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004632 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004633 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004634 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004635
David Tweed8f676532012-10-25 13:33:01 +00004636 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004637 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004638 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4639 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004640 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004641 Builder.defineMacro("__ARM_PCS", "1");
4642
David Tweed8f676532012-10-25 13:33:01 +00004643 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004644 Builder.defineMacro("__ARM_PCS_VFP", "1");
4645 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004646
Daniel Dunbar893d4752009-12-19 04:15:38 +00004647 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004648 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004649
4650 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004651 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004652
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004653 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004654 Builder.defineMacro("__THUMBEL__");
4655 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004656 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004657 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004658 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004659 if (((HWDiv & HWDivThumb) && isThumb()) || ((HWDiv & HWDivARM) && !isThumb()))
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004660 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004661
4662 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004663 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004664
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004665 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004666 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004667 if (FPU & VFP2FPU)
4668 Builder.defineMacro("__ARM_VFPV2__");
4669 if (FPU & VFP3FPU)
4670 Builder.defineMacro("__ARM_VFPV3__");
4671 if (FPU & VFP4FPU)
4672 Builder.defineMacro("__ARM_VFPV4__");
4673 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004674
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004675 // This only gets set when Neon instructions are actually available, unlike
4676 // the VFP define, hence the soft float and arch check. This is subtly
4677 // different from gcc, we follow the intent which was that it should be set
4678 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004679 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Tim Northover5bb34ca2013-11-21 12:36:34 +00004680 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004681 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004682 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004683
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004684 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4685 Opts.ShortWChar ? "2" : "4");
4686
4687 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4688 Opts.ShortEnums ? "1" : "4");
4689
Bernard Ogden18b57012013-10-29 09:47:51 +00004690 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004691 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004692
Tim Northover02e38602014-02-03 17:28:04 +00004693 if (Crypto)
4694 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4695
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004696 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004697 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4698 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4699 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4700 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4701 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004702
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004703 bool is5EOrAbove = (ArchVersion >= 6 ||
4704 (ArchVersion == 5 && CPUAttr.count('E')));
4705 // FIXME: We are not getting all 32-bit ARM architectures
4706 bool is32Bit = (!isThumb() || supportsThumb2());
4707 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUAttr == "7EM"))
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004708 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004709 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004710
Craig Topper3164f332014-03-11 03:39:26 +00004711 void getTargetBuiltins(const Builtin::Info *&Records,
4712 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004713 Records = BuiltinInfo;
4714 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004715 }
Craig Topper3164f332014-03-11 03:39:26 +00004716 bool isCLZForZeroUndef() const override { return false; }
4717 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004718 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004719 }
Craig Topper3164f332014-03-11 03:39:26 +00004720 void getGCCRegNames(const char * const *&Names,
4721 unsigned &NumNames) const override;
4722 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4723 unsigned &NumAliases) const override;
4724 bool validateAsmConstraint(const char *&Name,
4725 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004726 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004727 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004728 case 'l': // r0-r7
4729 case 'h': // r8-r15
4730 case 'w': // VFP Floating point register single precision
4731 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004732 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004733 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004734 case 'I':
4735 case 'J':
4736 case 'K':
4737 case 'L':
4738 case 'M':
4739 // FIXME
4740 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004741 case 'Q': // A memory address that is a single base register.
4742 Info.setAllowsMemory();
4743 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004744 case 'U': // a memory reference...
4745 switch (Name[1]) {
4746 case 'q': // ...ARMV4 ldrsb
4747 case 'v': // ...VFP load/store (reg+constant offset)
4748 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004749 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004750 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004751 case 'n': // valid address for Neon doubleword vector load/store
4752 case 'm': // valid address for Neon element and structure load/store
4753 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004754 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004755 Info.setAllowsMemory();
4756 Name++;
4757 return true;
4758 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004759 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004760 return false;
4761 }
Craig Topper3164f332014-03-11 03:39:26 +00004762 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004763 std::string R;
4764 switch (*Constraint) {
4765 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004766 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004767 Constraint++;
4768 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004769 case 'p': // 'p' should be translated to 'r' by default.
4770 R = std::string("r");
4771 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004772 default:
4773 return std::string(1, *Constraint);
4774 }
4775 return R;
4776 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004777 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004778 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004779 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004780 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004781 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004782
Bill Wendling9d1ee112012-10-25 23:28:48 +00004783 // Strip off constraint modifiers.
4784 while (Constraint[0] == '=' ||
4785 Constraint[0] == '+' ||
4786 Constraint[0] == '&')
4787 Constraint = Constraint.substr(1);
4788
4789 switch (Constraint[0]) {
4790 default: break;
4791 case 'r': {
4792 switch (Modifier) {
4793 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004794 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004795 case 'q':
4796 // A register of size 32 cannot fit a vector type.
4797 return false;
4798 }
4799 }
4800 }
4801
4802 return true;
4803 }
Craig Topper3164f332014-03-11 03:39:26 +00004804 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004805 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004806 return "";
4807 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004808
Craig Topper3164f332014-03-11 03:39:26 +00004809 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004810 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4811 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004812
Craig Topper3164f332014-03-11 03:39:26 +00004813 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004814 if (RegNo == 0) return 0;
4815 if (RegNo == 1) return 1;
4816 return -1;
4817 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004818
4819 bool hasSjLjLowering() const override {
4820 return true;
4821 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004822};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004823
Rafael Espindolaeb265472013-08-21 21:59:03 +00004824bool ARMTargetInfo::setFPMath(StringRef Name) {
4825 if (Name == "neon") {
4826 FPMath = FP_Neon;
4827 return true;
4828 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4829 Name == "vfp4") {
4830 FPMath = FP_VFP;
4831 return true;
4832 }
4833 return false;
4834}
4835
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004836const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004837 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004838 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004839 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4840
4841 // Float registers
4842 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4843 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4844 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004845 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004846
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004847 // Double registers
4848 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4849 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004850 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4851 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004852
4853 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004854 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4855 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004856};
4857
4858void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004859 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004860 Names = GCCRegNames;
4861 NumNames = llvm::array_lengthof(GCCRegNames);
4862}
4863
4864const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004865 { { "a1" }, "r0" },
4866 { { "a2" }, "r1" },
4867 { { "a3" }, "r2" },
4868 { { "a4" }, "r3" },
4869 { { "v1" }, "r4" },
4870 { { "v2" }, "r5" },
4871 { { "v3" }, "r6" },
4872 { { "v4" }, "r7" },
4873 { { "v5" }, "r8" },
4874 { { "v6", "rfp" }, "r9" },
4875 { { "sl" }, "r10" },
4876 { { "fp" }, "r11" },
4877 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004878 { { "r13" }, "sp" },
4879 { { "r14" }, "lr" },
4880 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004881 // The S, D and Q registers overlap, but aren't really aliases; we
4882 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004883};
4884
4885void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4886 unsigned &NumAliases) const {
4887 Aliases = GCCRegAliases;
4888 NumAliases = llvm::array_lengthof(GCCRegAliases);
4889}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004890
4891const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00004892#define BUILTIN(ID, TYPE, ATTRS) \
4893 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
4894#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4895 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00004896#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004897
Craig Topper07d3b622015-08-07 05:14:44 +00004898#define BUILTIN(ID, TYPE, ATTRS) \
4899 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
4900#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
4901 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr},
4902#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
4903 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004904#include "clang/Basic/BuiltinsARM.def"
4905};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004906
4907class ARMleTargetInfo : public ARMTargetInfo {
4908public:
4909 ARMleTargetInfo(const llvm::Triple &Triple)
4910 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004911 void getTargetDefines(const LangOptions &Opts,
4912 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004913 Builder.defineMacro("__ARMEL__");
4914 ARMTargetInfo::getTargetDefines(Opts, Builder);
4915 }
4916};
4917
4918class ARMbeTargetInfo : public ARMTargetInfo {
4919public:
4920 ARMbeTargetInfo(const llvm::Triple &Triple)
4921 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004922 void getTargetDefines(const LangOptions &Opts,
4923 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004924 Builder.defineMacro("__ARMEB__");
4925 Builder.defineMacro("__ARM_BIG_ENDIAN");
4926 ARMTargetInfo::getTargetDefines(Opts, Builder);
4927 }
4928};
Chris Lattner17df24e2008-04-21 18:56:49 +00004929
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004930class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4931 const llvm::Triple Triple;
4932public:
4933 WindowsARMTargetInfo(const llvm::Triple &Triple)
4934 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4935 TLSSupported = false;
4936 WCharType = UnsignedShort;
4937 SizeType = UnsignedInt;
4938 UserLabelPrefix = "";
4939 }
4940 void getVisualStudioDefines(const LangOptions &Opts,
4941 MacroBuilder &Builder) const {
4942 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4943
4944 // FIXME: this is invalid for WindowsCE
4945 Builder.defineMacro("_M_ARM_NT", "1");
4946 Builder.defineMacro("_M_ARMT", "_M_ARM");
4947 Builder.defineMacro("_M_THUMB", "_M_ARM");
4948
4949 assert((Triple.getArch() == llvm::Triple::arm ||
4950 Triple.getArch() == llvm::Triple::thumb) &&
4951 "invalid architecture for Windows ARM target info");
4952 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4953 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4954
4955 // TODO map the complete set of values
4956 // 31: VFPv3 40: VFPv4
4957 Builder.defineMacro("_M_ARM_FP", "31");
4958 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004959 BuiltinVaListKind getBuiltinVaListKind() const override {
4960 return TargetInfo::CharPtrBuiltinVaList;
4961 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00004962 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4963 switch (CC) {
4964 case CC_X86StdCall:
4965 case CC_X86ThisCall:
4966 case CC_X86FastCall:
4967 case CC_X86VectorCall:
4968 return CCCR_Ignore;
4969 case CC_C:
4970 return CCCR_OK;
4971 default:
4972 return CCCR_Warning;
4973 }
4974 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004975};
4976
4977// Windows ARM + Itanium C++ ABI Target
4978class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4979public:
4980 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4981 : WindowsARMTargetInfo(Triple) {
4982 TheCXXABI.set(TargetCXXABI::GenericARM);
4983 }
4984
4985 void getTargetDefines(const LangOptions &Opts,
4986 MacroBuilder &Builder) const override {
4987 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4988
4989 if (Opts.MSVCCompat)
4990 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4991 }
4992};
4993
4994// Windows ARM, MS (C++) ABI
4995class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4996public:
4997 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4998 : WindowsARMTargetInfo(Triple) {
4999 TheCXXABI.set(TargetCXXABI::Microsoft);
5000 }
5001
5002 void getTargetDefines(const LangOptions &Opts,
5003 MacroBuilder &Builder) const override {
5004 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5005 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5006 }
5007};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005008
Yaron Keren321249c2015-07-15 13:32:23 +00005009// ARM MinGW target
5010class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5011public:
5012 MinGWARMTargetInfo(const llvm::Triple &Triple)
5013 : WindowsARMTargetInfo(Triple) {
5014 TheCXXABI.set(TargetCXXABI::GenericARM);
5015 }
5016
5017 void getTargetDefines(const LangOptions &Opts,
5018 MacroBuilder &Builder) const override {
5019 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5020 DefineStd(Builder, "WIN32", Opts);
5021 DefineStd(Builder, "WINNT", Opts);
5022 Builder.defineMacro("_ARM_");
5023 addMinGWDefines(Opts, Builder);
5024 }
5025};
5026
5027// ARM Cygwin target
5028class CygwinARMTargetInfo : public ARMleTargetInfo {
5029public:
5030 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5031 TLSSupported = false;
5032 WCharType = UnsignedShort;
5033 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005034 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005035 }
5036 void getTargetDefines(const LangOptions &Opts,
5037 MacroBuilder &Builder) const override {
5038 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5039 Builder.defineMacro("_ARM_");
5040 Builder.defineMacro("__CYGWIN__");
5041 Builder.defineMacro("__CYGWIN32__");
5042 DefineStd(Builder, "unix", Opts);
5043 if (Opts.CPlusPlus)
5044 Builder.defineMacro("_GNU_SOURCE");
5045 }
5046};
5047
Mike Stump11289f42009-09-09 15:08:12 +00005048class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005049 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005050protected:
Craig Topper3164f332014-03-11 03:39:26 +00005051 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5052 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005053 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005054 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005055
Torok Edwinb2b37c62009-06-30 17:10:35 +00005056public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005057 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005058 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005059 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005060 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005061 // FIXME: This should be based off of the target features in
5062 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005063 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005064
5065 // Darwin on iOS uses a variant of the ARM C++ ABI.
5066 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005067 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005068};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005069
Tim Northover573cbee2014-05-24 12:52:07 +00005070class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005071 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005072 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5073 static const char *const GCCRegNames[];
5074
James Molloy75f5f9e2014-04-16 15:33:48 +00005075 enum FPUModeEnum {
5076 FPUMode,
5077 NeonMode
5078 };
5079
5080 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005081 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005082 unsigned Crypto;
5083
Tim Northovera2ee4332014-03-29 15:09:45 +00005084 static const Builtin::Info BuiltinInfo[];
5085
5086 std::string ABI;
5087
5088public:
Tim Northover573cbee2014-05-24 12:52:07 +00005089 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005090 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005091
5092 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5093 WCharType = SignedInt;
5094
5095 // NetBSD apparently prefers consistency across ARM targets to consistency
5096 // across 64-bit targets.
5097 Int64Type = SignedLongLong;
5098 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005099 } else {
5100 WCharType = UnsignedInt;
5101 Int64Type = SignedLong;
5102 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005103 }
5104
Tim Northovera2ee4332014-03-29 15:09:45 +00005105 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005106 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005107 MaxAtomicInlineWidth = 128;
5108 MaxAtomicPromoteWidth = 128;
5109
Tim Northovera6a19f12015-02-06 01:25:07 +00005110 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005111 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5112
Tim Northovera2ee4332014-03-29 15:09:45 +00005113 // {} in inline assembly are neon specifiers, not assembly variant
5114 // specifiers.
5115 NoAsmVariants = true;
5116
Tim Northover7ad87af2015-01-16 18:44:04 +00005117 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5118 // contributes to the alignment of the containing aggregate in the same way
5119 // a plain (non bit-field) member of that type would, without exception for
5120 // zero-sized or anonymous bit-fields."
5121 UseBitFieldTypeAlignment = true;
5122 UseZeroLengthBitfieldAlignment = true;
5123
Tim Northover573cbee2014-05-24 12:52:07 +00005124 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005125 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5126 }
5127
Alp Toker4925ba72014-06-07 23:30:42 +00005128 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005129 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005130 if (Name != "aapcs" && Name != "darwinpcs")
5131 return false;
5132
5133 ABI = Name;
5134 return true;
5135 }
5136
David Blaikie1cbb9712014-11-14 19:09:44 +00005137 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005138 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005139 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005140 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005141 .Case("cyclone", true)
5142 .Default(false);
5143 return CPUKnown;
5144 }
5145
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005146 void getTargetDefines(const LangOptions &Opts,
5147 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005148 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005149 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005150
5151 // Target properties.
5152 Builder.defineMacro("_LP64");
5153 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005154
5155 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5156 Builder.defineMacro("__ARM_ACLE", "200");
5157 Builder.defineMacro("__ARM_ARCH", "8");
5158 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5159
5160 Builder.defineMacro("__ARM_64BIT_STATE");
5161 Builder.defineMacro("__ARM_PCS_AAPCS64");
5162 Builder.defineMacro("__ARM_ARCH_ISA_A64");
5163
5164 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
5165 Builder.defineMacro("__ARM_FEATURE_CLZ");
5166 Builder.defineMacro("__ARM_FEATURE_FMA");
5167 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00005168 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
5169 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
5170 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
5171 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00005172
5173 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5174
5175 // 0xe implies support for half, single and double precision operations.
5176 Builder.defineMacro("__ARM_FP", "0xe");
5177
5178 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5179 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
5180 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
5181
5182 if (Opts.FastMath || Opts.FiniteMathOnly)
5183 Builder.defineMacro("__ARM_FP_FAST");
5184
Richard Smithab506ad2014-10-20 23:26:58 +00005185 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00005186 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
5187
5188 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5189
5190 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5191 Opts.ShortEnums ? "1" : "4");
5192
James Molloy75f5f9e2014-04-16 15:33:48 +00005193 if (FPU == NeonMode) {
5194 Builder.defineMacro("__ARM_NEON");
5195 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00005196 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00005197 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005198
Bradley Smith418c5932014-05-02 15:17:51 +00005199 if (CRC)
5200 Builder.defineMacro("__ARM_FEATURE_CRC32");
5201
James Molloy75f5f9e2014-04-16 15:33:48 +00005202 if (Crypto)
5203 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Reid Klecknerd167d422015-05-06 15:31:46 +00005204
5205 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5206 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5207 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5208 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5209 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005210 }
5211
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005212 void getTargetBuiltins(const Builtin::Info *&Records,
5213 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005214 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00005215 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00005216 }
5217
David Blaikie1cbb9712014-11-14 19:09:44 +00005218 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005219 return Feature == "aarch64" ||
5220 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005221 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005222 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005223 }
5224
James Molloy5e73df52014-04-16 15:06:20 +00005225 bool handleTargetFeatures(std::vector<std::string> &Features,
5226 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005227 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005228 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005229 Crypto = 0;
5230 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5231 if (Features[i] == "+neon")
5232 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005233 if (Features[i] == "+crc")
5234 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005235 if (Features[i] == "+crypto")
5236 Crypto = 1;
5237 }
5238
Eric Christopher964a5f32015-08-05 23:48:05 +00005239 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005240
5241 return true;
5242 }
5243
David Blaikie1cbb9712014-11-14 19:09:44 +00005244 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005245
David Blaikie1cbb9712014-11-14 19:09:44 +00005246 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005247 return TargetInfo::AArch64ABIBuiltinVaList;
5248 }
5249
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005250 void getGCCRegNames(const char *const *&Names,
5251 unsigned &NumNames) const override;
5252 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5253 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005254
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005255 bool validateAsmConstraint(const char *&Name,
5256 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005257 switch (*Name) {
5258 default:
5259 return false;
5260 case 'w': // Floating point and SIMD registers (V0-V31)
5261 Info.setAllowsRegister();
5262 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005263 case 'I': // Constant that can be used with an ADD instruction
5264 case 'J': // Constant that can be used with a SUB instruction
5265 case 'K': // Constant that can be used with a 32-bit logical instruction
5266 case 'L': // Constant that can be used with a 64-bit logical instruction
5267 case 'M': // Constant that can be used as a 32-bit MOV immediate
5268 case 'N': // Constant that can be used as a 64-bit MOV immediate
5269 case 'Y': // Floating point constant zero
5270 case 'Z': // Integer constant zero
5271 return true;
5272 case 'Q': // A memory reference with base register and no offset
5273 Info.setAllowsMemory();
5274 return true;
5275 case 'S': // A symbolic address
5276 Info.setAllowsRegister();
5277 return true;
5278 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005279 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5280 // Utf: A memory address suitable for ldp/stp in TF mode.
5281 // Usa: An absolute symbolic address.
5282 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5283 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005284 case 'z': // Zero register, wzr or xzr
5285 Info.setAllowsRegister();
5286 return true;
5287 case 'x': // Floating point and SIMD registers (V0-V15)
5288 Info.setAllowsRegister();
5289 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005290 }
5291 return false;
5292 }
5293
Akira Hatanaka987f1862014-08-22 06:05:21 +00005294 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005295 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005296 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005297 // Strip off constraint modifiers.
5298 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5299 Constraint = Constraint.substr(1);
5300
5301 switch (Constraint[0]) {
5302 default:
5303 return true;
5304 case 'z':
5305 case 'r': {
5306 switch (Modifier) {
5307 case 'x':
5308 case 'w':
5309 // For now assume that the person knows what they're
5310 // doing with the modifier.
5311 return true;
5312 default:
5313 // By default an 'r' constraint will be in the 'x'
5314 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005315 if (Size == 64)
5316 return true;
5317
5318 SuggestedModifier = "w";
5319 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005320 }
5321 }
5322 }
5323 }
5324
David Blaikie1cbb9712014-11-14 19:09:44 +00005325 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005326
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005327 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005328 if (RegNo == 0)
5329 return 0;
5330 if (RegNo == 1)
5331 return 1;
5332 return -1;
5333 }
5334};
5335
Tim Northover573cbee2014-05-24 12:52:07 +00005336const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005337 // 32-bit Integer registers
5338 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5339 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5340 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5341
5342 // 64-bit Integer registers
5343 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5344 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5345 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5346
5347 // 32-bit floating point regsisters
5348 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5349 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5350 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5351
5352 // 64-bit floating point regsisters
5353 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5354 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5355 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5356
5357 // Vector registers
5358 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5359 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5360 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5361};
5362
Tim Northover573cbee2014-05-24 12:52:07 +00005363void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005364 unsigned &NumNames) const {
5365 Names = GCCRegNames;
5366 NumNames = llvm::array_lengthof(GCCRegNames);
5367}
5368
Tim Northover573cbee2014-05-24 12:52:07 +00005369const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005370 { { "w31" }, "wsp" },
5371 { { "x29" }, "fp" },
5372 { { "x30" }, "lr" },
5373 { { "x31" }, "sp" },
5374 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5375 // don't want to substitute one of these for a different-sized one.
5376};
5377
Tim Northover573cbee2014-05-24 12:52:07 +00005378void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005379 unsigned &NumAliases) const {
5380 Aliases = GCCRegAliases;
5381 NumAliases = llvm::array_lengthof(GCCRegAliases);
5382}
5383
Tim Northover573cbee2014-05-24 12:52:07 +00005384const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005385#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005386 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005387#include "clang/Basic/BuiltinsNEON.def"
5388
5389#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005390 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005391#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005392};
James Molloy5e73df52014-04-16 15:06:20 +00005393
Tim Northover573cbee2014-05-24 12:52:07 +00005394class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005395 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005396 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005397 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005398 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005399 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005400 }
5401
5402public:
Tim Northover573cbee2014-05-24 12:52:07 +00005403 AArch64leTargetInfo(const llvm::Triple &Triple)
5404 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005405 BigEndian = false;
5406 }
5407 void getTargetDefines(const LangOptions &Opts,
5408 MacroBuilder &Builder) const override {
5409 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005410 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005411 }
5412};
5413
Tim Northover573cbee2014-05-24 12:52:07 +00005414class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005415 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005416 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005417 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005418 }
5419
5420public:
Tim Northover573cbee2014-05-24 12:52:07 +00005421 AArch64beTargetInfo(const llvm::Triple &Triple)
5422 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005423 void getTargetDefines(const LangOptions &Opts,
5424 MacroBuilder &Builder) const override {
5425 Builder.defineMacro("__AARCH64EB__");
5426 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5427 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005428 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005429 }
5430};
Tim Northovera2ee4332014-03-29 15:09:45 +00005431
Tim Northover573cbee2014-05-24 12:52:07 +00005432class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005433protected:
5434 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5435 MacroBuilder &Builder) const override {
5436 Builder.defineMacro("__AARCH64_SIMD__");
5437 Builder.defineMacro("__ARM64_ARCH_8__");
5438 Builder.defineMacro("__ARM_NEON__");
5439 Builder.defineMacro("__LITTLE_ENDIAN__");
5440 Builder.defineMacro("__REGISTER_PREFIX__", "");
5441 Builder.defineMacro("__arm64", "1");
5442 Builder.defineMacro("__arm64__", "1");
5443
5444 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5445 }
5446
Tim Northovera2ee4332014-03-29 15:09:45 +00005447public:
Tim Northover573cbee2014-05-24 12:52:07 +00005448 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5449 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005450 Int64Type = SignedLongLong;
5451 WCharType = SignedInt;
5452 UseSignedCharForObjCBool = false;
5453
Tim Northovera6a19f12015-02-06 01:25:07 +00005454 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005455 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5456
5457 TheCXXABI.set(TargetCXXABI::iOS64);
5458 }
5459
David Blaikie1cbb9712014-11-14 19:09:44 +00005460 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005461 return TargetInfo::CharPtrBuiltinVaList;
5462 }
5463};
Tim Northovera2ee4332014-03-29 15:09:45 +00005464
Tony Linthicum76329bf2011-12-12 21:14:55 +00005465// Hexagon abstract base class
5466class HexagonTargetInfo : public TargetInfo {
5467 static const Builtin::Info BuiltinInfo[];
5468 static const char * const GCCRegNames[];
5469 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5470 std::string CPU;
5471public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005472 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005473 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00005474 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005475
5476 // {} in inline assembly are packet specifiers, not assembly variant
5477 // specifiers.
5478 NoAsmVariants = true;
5479 }
5480
Craig Topper3164f332014-03-11 03:39:26 +00005481 void getTargetBuiltins(const Builtin::Info *&Records,
5482 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005483 Records = BuiltinInfo;
5484 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5485 }
5486
Craig Topper3164f332014-03-11 03:39:26 +00005487 bool validateAsmConstraint(const char *&Name,
5488 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005489 return true;
5490 }
5491
Craig Topper3164f332014-03-11 03:39:26 +00005492 void getTargetDefines(const LangOptions &Opts,
5493 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005494
Craig Topper3164f332014-03-11 03:39:26 +00005495 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005496 return Feature == "hexagon";
5497 }
Craig Topper3164f332014-03-11 03:39:26 +00005498
5499 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005500 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005501 }
Craig Topper3164f332014-03-11 03:39:26 +00005502 void getGCCRegNames(const char * const *&Names,
5503 unsigned &NumNames) const override;
5504 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5505 unsigned &NumAliases) const override;
5506 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005507 return "";
5508 }
Sebastian Pop86500282012-01-13 20:37:10 +00005509
5510 static const char *getHexagonCPUSuffix(StringRef Name) {
5511 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005512 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005513 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005514 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005515 }
5516
Craig Topper3164f332014-03-11 03:39:26 +00005517 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005518 if (!getHexagonCPUSuffix(Name))
5519 return false;
5520
Tony Linthicum76329bf2011-12-12 21:14:55 +00005521 CPU = Name;
5522 return true;
5523 }
5524};
5525
5526void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5527 MacroBuilder &Builder) const {
5528 Builder.defineMacro("qdsp6");
5529 Builder.defineMacro("__qdsp6", "1");
5530 Builder.defineMacro("__qdsp6__", "1");
5531
5532 Builder.defineMacro("hexagon");
5533 Builder.defineMacro("__hexagon", "1");
5534 Builder.defineMacro("__hexagon__", "1");
5535
5536 if(CPU == "hexagonv1") {
5537 Builder.defineMacro("__HEXAGON_V1__");
5538 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5539 if(Opts.HexagonQdsp6Compat) {
5540 Builder.defineMacro("__QDSP6_V1__");
5541 Builder.defineMacro("__QDSP6_ARCH__", "1");
5542 }
5543 }
5544 else if(CPU == "hexagonv2") {
5545 Builder.defineMacro("__HEXAGON_V2__");
5546 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5547 if(Opts.HexagonQdsp6Compat) {
5548 Builder.defineMacro("__QDSP6_V2__");
5549 Builder.defineMacro("__QDSP6_ARCH__", "2");
5550 }
5551 }
5552 else if(CPU == "hexagonv3") {
5553 Builder.defineMacro("__HEXAGON_V3__");
5554 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5555 if(Opts.HexagonQdsp6Compat) {
5556 Builder.defineMacro("__QDSP6_V3__");
5557 Builder.defineMacro("__QDSP6_ARCH__", "3");
5558 }
5559 }
5560 else if(CPU == "hexagonv4") {
5561 Builder.defineMacro("__HEXAGON_V4__");
5562 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5563 if(Opts.HexagonQdsp6Compat) {
5564 Builder.defineMacro("__QDSP6_V4__");
5565 Builder.defineMacro("__QDSP6_ARCH__", "4");
5566 }
5567 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005568 else if(CPU == "hexagonv5") {
5569 Builder.defineMacro("__HEXAGON_V5__");
5570 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5571 if(Opts.HexagonQdsp6Compat) {
5572 Builder.defineMacro("__QDSP6_V5__");
5573 Builder.defineMacro("__QDSP6_ARCH__", "5");
5574 }
5575 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005576}
5577
5578const char * const HexagonTargetInfo::GCCRegNames[] = {
5579 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5580 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5581 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5582 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5583 "p0", "p1", "p2", "p3",
5584 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5585};
5586
5587void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5588 unsigned &NumNames) const {
5589 Names = GCCRegNames;
5590 NumNames = llvm::array_lengthof(GCCRegNames);
5591}
5592
5593
5594const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5595 { { "sp" }, "r29" },
5596 { { "fp" }, "r30" },
5597 { { "lr" }, "r31" },
5598 };
5599
5600void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5601 unsigned &NumAliases) const {
5602 Aliases = GCCRegAliases;
5603 NumAliases = llvm::array_lengthof(GCCRegAliases);
5604}
5605
5606
5607const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005608#define BUILTIN(ID, TYPE, ATTRS) \
5609 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5610#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5611 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005612#include "clang/Basic/BuiltinsHexagon.def"
5613};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005614
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005615// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5616class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005617 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5618 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005619 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005620public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005621 SparcTargetInfo(const llvm::Triple &Triple)
5622 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005623
Craig Topper3164f332014-03-11 03:39:26 +00005624 bool handleTargetFeatures(std::vector<std::string> &Features,
5625 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005626 // The backend doesn't actually handle soft float yet, but in case someone
5627 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005628 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5629 if (Feature != Features.end()) {
5630 SoftFloat = true;
5631 Features.erase(Feature);
5632 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005633 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005634 }
Craig Topper3164f332014-03-11 03:39:26 +00005635 void getTargetDefines(const LangOptions &Opts,
5636 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005637 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005638 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005639
5640 if (SoftFloat)
5641 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005642 }
Craig Topper3164f332014-03-11 03:39:26 +00005643
5644 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005645 return llvm::StringSwitch<bool>(Feature)
5646 .Case("softfloat", SoftFloat)
5647 .Case("sparc", true)
5648 .Default(false);
5649 }
Craig Topper3164f332014-03-11 03:39:26 +00005650
5651 void getTargetBuiltins(const Builtin::Info *&Records,
5652 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005653 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005654 }
Craig Topper3164f332014-03-11 03:39:26 +00005655 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005656 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005657 }
Craig Topper3164f332014-03-11 03:39:26 +00005658 void getGCCRegNames(const char * const *&Names,
5659 unsigned &NumNames) const override;
5660 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5661 unsigned &NumAliases) const override;
5662 bool validateAsmConstraint(const char *&Name,
5663 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005664 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005665 switch (*Name) {
5666 case 'I': // Signed 13-bit constant
5667 case 'J': // Zero
5668 case 'K': // 32-bit constant with the low 12 bits clear
5669 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5670 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5671 case 'N': // Same as 'K' but zext (required for SIMode)
5672 case 'O': // The constant 4096
5673 return true;
5674 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005675 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005676 }
Craig Topper3164f332014-03-11 03:39:26 +00005677 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005678 // FIXME: Implement!
5679 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005680 }
5681};
5682
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005683const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005684 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5685 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5686 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5687 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5688};
5689
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005690void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5691 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005692 Names = GCCRegNames;
5693 NumNames = llvm::array_lengthof(GCCRegNames);
5694}
5695
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005696const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005697 { { "g0" }, "r0" },
5698 { { "g1" }, "r1" },
5699 { { "g2" }, "r2" },
5700 { { "g3" }, "r3" },
5701 { { "g4" }, "r4" },
5702 { { "g5" }, "r5" },
5703 { { "g6" }, "r6" },
5704 { { "g7" }, "r7" },
5705 { { "o0" }, "r8" },
5706 { { "o1" }, "r9" },
5707 { { "o2" }, "r10" },
5708 { { "o3" }, "r11" },
5709 { { "o4" }, "r12" },
5710 { { "o5" }, "r13" },
5711 { { "o6", "sp" }, "r14" },
5712 { { "o7" }, "r15" },
5713 { { "l0" }, "r16" },
5714 { { "l1" }, "r17" },
5715 { { "l2" }, "r18" },
5716 { { "l3" }, "r19" },
5717 { { "l4" }, "r20" },
5718 { { "l5" }, "r21" },
5719 { { "l6" }, "r22" },
5720 { { "l7" }, "r23" },
5721 { { "i0" }, "r24" },
5722 { { "i1" }, "r25" },
5723 { { "i2" }, "r26" },
5724 { { "i3" }, "r27" },
5725 { { "i4" }, "r28" },
5726 { { "i5" }, "r29" },
5727 { { "i6", "fp" }, "r30" },
5728 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005729};
5730
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005731void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5732 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005733 Aliases = GCCRegAliases;
5734 NumAliases = llvm::array_lengthof(GCCRegAliases);
5735}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005736
5737// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5738class SparcV8TargetInfo : public SparcTargetInfo {
5739public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005740 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005741 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00005742 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
5743 switch (getTriple().getOS()) {
5744 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00005745 SizeType = UnsignedInt;
5746 IntPtrType = SignedInt;
5747 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00005748 break;
5749 case llvm::Triple::NetBSD:
5750 case llvm::Triple::OpenBSD:
5751 SizeType = UnsignedLong;
5752 IntPtrType = SignedLong;
5753 PtrDiffType = SignedLong;
5754 break;
Brad Smith56495d52015-08-13 22:00:53 +00005755 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005756 }
5757
Craig Topper3164f332014-03-11 03:39:26 +00005758 void getTargetDefines(const LangOptions &Opts,
5759 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005760 SparcTargetInfo::getTargetDefines(Opts, Builder);
5761 Builder.defineMacro("__sparcv8");
5762 }
5763};
5764
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005765// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5766class SparcV8elTargetInfo : public SparcV8TargetInfo {
5767 public:
5768 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005769 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005770 BigEndian = false;
5771 }
5772};
5773
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005774// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5775class SparcV9TargetInfo : public SparcTargetInfo {
5776public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005777 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005778 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00005779 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005780 // This is an LP64 platform.
5781 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005782
5783 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005784 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005785 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005786 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005787 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005788 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005789
5790 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5791 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5792 LongDoubleWidth = 128;
5793 LongDoubleAlign = 128;
5794 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005795 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005796 }
5797
Craig Topper3164f332014-03-11 03:39:26 +00005798 void getTargetDefines(const LangOptions &Opts,
5799 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005800 SparcTargetInfo::getTargetDefines(Opts, Builder);
5801 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005802 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005803 // Solaris doesn't need these variants, but the BSDs do.
5804 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005805 Builder.defineMacro("__sparc64__");
5806 Builder.defineMacro("__sparc_v9__");
5807 Builder.defineMacro("__sparcv9__");
5808 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005809 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005810
Craig Topper3164f332014-03-11 03:39:26 +00005811 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005812 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5813 .Case("v9", true)
5814 .Case("ultrasparc", true)
5815 .Case("ultrasparc3", true)
5816 .Case("niagara", true)
5817 .Case("niagara2", true)
5818 .Case("niagara3", true)
5819 .Case("niagara4", true)
5820 .Default(false);
5821
5822 // No need to store the CPU yet. There aren't any CPU-specific
5823 // macros to define.
5824 return CPUKnown;
5825 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005826};
5827
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005828class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005829 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005830 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005831 std::string CPU;
5832 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005833 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005834
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005835public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005836 SystemZTargetInfo(const llvm::Triple &Triple)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005837 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005838 IntMaxType = SignedLong;
5839 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005840 TLSSupported = true;
5841 IntWidth = IntAlign = 32;
5842 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5843 PointerWidth = PointerAlign = 64;
5844 LongDoubleWidth = 128;
5845 LongDoubleAlign = 64;
5846 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005847 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005848 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00005849 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 +00005850 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5851 }
5852 void getTargetDefines(const LangOptions &Opts,
5853 MacroBuilder &Builder) const override {
5854 Builder.defineMacro("__s390__");
5855 Builder.defineMacro("__s390x__");
5856 Builder.defineMacro("__zarch__");
5857 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005858 if (HasTransactionalExecution)
5859 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005860 if (Opts.ZVector)
5861 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005862 }
5863 void getTargetBuiltins(const Builtin::Info *&Records,
5864 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005865 Records = BuiltinInfo;
5866 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005867 }
5868
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005869 void getGCCRegNames(const char *const *&Names,
5870 unsigned &NumNames) const override;
5871 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5872 unsigned &NumAliases) const override {
5873 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005874 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005875 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005876 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005877 bool validateAsmConstraint(const char *&Name,
5878 TargetInfo::ConstraintInfo &info) const override;
5879 const char *getClobbers() const override {
5880 // FIXME: Is this really right?
5881 return "";
5882 }
5883 BuiltinVaListKind getBuiltinVaListKind() const override {
5884 return TargetInfo::SystemZBuiltinVaList;
5885 }
5886 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005887 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005888 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5889 .Case("z10", true)
5890 .Case("z196", true)
5891 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005892 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005893 .Default(false);
5894
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005895 return CPUKnown;
5896 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005897 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5898 if (CPU == "zEC12")
5899 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005900 if (CPU == "z13") {
5901 Features["transactional-execution"] = true;
5902 Features["vector"] = true;
5903 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005904 }
5905
5906 bool handleTargetFeatures(std::vector<std::string> &Features,
5907 DiagnosticsEngine &Diags) override {
5908 HasTransactionalExecution = false;
5909 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5910 if (Features[i] == "+transactional-execution")
5911 HasTransactionalExecution = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005912 if (Features[i] == "+vector")
5913 HasVector = true;
5914 }
5915 // If we use the vector ABI, vector types are 64-bit aligned.
5916 if (HasVector) {
5917 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005918 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5919 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005920 }
5921 return true;
5922 }
5923
5924 bool hasFeature(StringRef Feature) const override {
5925 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005926 .Case("systemz", true)
5927 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005928 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005929 .Default(false);
5930 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005931
5932 StringRef getABI() const override {
5933 if (HasVector)
5934 return "vector";
5935 return "";
5936 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00005937
5938 bool useFloat128ManglingForLongDouble() const override {
5939 return true;
5940 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005941};
5942
5943const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5944#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005945 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005946#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005947};
5948
5949const char *const SystemZTargetInfo::GCCRegNames[] = {
5950 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5951 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5952 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5953 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5954};
5955
5956void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5957 unsigned &NumNames) const {
5958 Names = GCCRegNames;
5959 NumNames = llvm::array_lengthof(GCCRegNames);
5960}
5961
5962bool SystemZTargetInfo::
5963validateAsmConstraint(const char *&Name,
5964 TargetInfo::ConstraintInfo &Info) const {
5965 switch (*Name) {
5966 default:
5967 return false;
5968
5969 case 'a': // Address register
5970 case 'd': // Data register (equivalent to 'r')
5971 case 'f': // Floating-point register
5972 Info.setAllowsRegister();
5973 return true;
5974
5975 case 'I': // Unsigned 8-bit constant
5976 case 'J': // Unsigned 12-bit constant
5977 case 'K': // Signed 16-bit constant
5978 case 'L': // Signed 20-bit displacement (on all targets we support)
5979 case 'M': // 0x7fffffff
5980 return true;
5981
5982 case 'Q': // Memory with base and unsigned 12-bit displacement
5983 case 'R': // Likewise, plus an index
5984 case 'S': // Memory with base and signed 20-bit displacement
5985 case 'T': // Likewise, plus an index
5986 Info.setAllowsMemory();
5987 return true;
5988 }
5989}
Ulrich Weigand47445072013-05-06 16:26:41 +00005990
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005991 class MSP430TargetInfo : public TargetInfo {
5992 static const char * const GCCRegNames[];
5993 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005994 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005995 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005996 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005997 IntWidth = 16; IntAlign = 16;
5998 LongWidth = 32; LongLongWidth = 64;
5999 LongAlign = LongLongAlign = 16;
6000 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006001 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006002 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00006003 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00006004 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006005 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00006006 SigAtomicType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00006007 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00006008 }
6009 void getTargetDefines(const LangOptions &Opts,
6010 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006011 Builder.defineMacro("MSP430");
6012 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006013 // FIXME: defines for different 'flavours' of MCU
6014 }
Craig Topper3164f332014-03-11 03:39:26 +00006015 void getTargetBuiltins(const Builtin::Info *&Records,
6016 unsigned &NumRecords) const override {
6017 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00006018 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006019 NumRecords = 0;
6020 }
Craig Topper3164f332014-03-11 03:39:26 +00006021 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006022 return Feature == "msp430";
6023 }
Craig Topper3164f332014-03-11 03:39:26 +00006024 void getGCCRegNames(const char * const *&Names,
6025 unsigned &NumNames) const override;
6026 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6027 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006028 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00006029 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006030 NumAliases = 0;
6031 }
Eric Christopher917e9522014-11-18 22:36:15 +00006032 bool
6033 validateAsmConstraint(const char *&Name,
6034 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006035 // FIXME: implement
6036 switch (*Name) {
6037 case 'K': // the constant 1
6038 case 'L': // constant -1^20 .. 1^19
6039 case 'M': // constant 1-4:
6040 return true;
6041 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00006042 // No target constraints for now.
6043 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006044 }
Craig Topper3164f332014-03-11 03:39:26 +00006045 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006046 // FIXME: Is this really right?
6047 return "";
6048 }
Craig Topper3164f332014-03-11 03:39:26 +00006049 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006050 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00006051 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006052 }
6053 };
6054
6055 const char * const MSP430TargetInfo::GCCRegNames[] = {
6056 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6057 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
6058 };
6059
6060 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
6061 unsigned &NumNames) const {
6062 Names = GCCRegNames;
6063 NumNames = llvm::array_lengthof(GCCRegNames);
6064 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00006065
Mike Stump11289f42009-09-09 15:08:12 +00006066 // LLVM and Clang cannot be used directly to output native binaries for
6067 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00006068 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00006069 //
6070 // TCE uses the llvm bitcode as input and uses it for generating customized
6071 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00006072 // publicly available in http://tce.cs.tut.fi
6073
Eli Friedman1f191002011-10-07 19:51:42 +00006074 static const unsigned TCEOpenCLAddrSpaceMap[] = {
6075 3, // opencl_global
6076 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00006077 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006078 // FIXME: generic has to be added to the target
6079 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00006080 0, // cuda_device
6081 0, // cuda_constant
6082 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00006083 };
6084
Eli Friedmana9c3d712009-08-19 20:47:07 +00006085 class TCETargetInfo : public TargetInfo{
6086 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006087 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00006088 TLSSupported = false;
6089 IntWidth = 32;
6090 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006091 PointerWidth = 32;
6092 IntAlign = 32;
6093 LongAlign = LongLongAlign = 32;
6094 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006095 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006096 SizeType = UnsignedInt;
6097 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006098 IntPtrType = SignedInt;
6099 PtrDiffType = SignedInt;
6100 FloatWidth = 32;
6101 FloatAlign = 32;
6102 DoubleWidth = 32;
6103 DoubleAlign = 32;
6104 LongDoubleWidth = 32;
6105 LongDoubleAlign = 32;
6106 FloatFormat = &llvm::APFloat::IEEEsingle;
6107 DoubleFormat = &llvm::APFloat::IEEEsingle;
6108 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Eric Christopher964a5f32015-08-05 23:48:05 +00006109 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6110 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00006111 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006112 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006113 }
6114
Craig Topper3164f332014-03-11 03:39:26 +00006115 void getTargetDefines(const LangOptions &Opts,
6116 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006117 DefineStd(Builder, "tce", Opts);
6118 Builder.defineMacro("__TCE__");
6119 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00006120 }
Craig Topper3164f332014-03-11 03:39:26 +00006121 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006122 return Feature == "tce";
6123 }
Craig Topper3164f332014-03-11 03:39:26 +00006124
6125 void getTargetBuiltins(const Builtin::Info *&Records,
6126 unsigned &NumRecords) const override {}
6127 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00006128 return "";
6129 }
Craig Topper3164f332014-03-11 03:39:26 +00006130 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006131 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006132 }
Craig Topper3164f332014-03-11 03:39:26 +00006133 void getGCCRegNames(const char * const *&Names,
6134 unsigned &NumNames) const override {}
6135 bool validateAsmConstraint(const char *&Name,
6136 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00006137 return true;
6138 }
Craig Topper3164f332014-03-11 03:39:26 +00006139 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6140 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00006141 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00006142
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006143class BPFTargetInfo : public TargetInfo {
6144public:
6145 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6146 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6147 SizeType = UnsignedLong;
6148 PtrDiffType = SignedLong;
6149 IntPtrType = SignedLong;
6150 IntMaxType = SignedLong;
6151 Int64Type = SignedLong;
6152 RegParmMax = 5;
6153 if (Triple.getArch() == llvm::Triple::bpfeb) {
6154 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006155 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006156 } else {
6157 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006158 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006159 }
6160 MaxAtomicPromoteWidth = 64;
6161 MaxAtomicInlineWidth = 64;
6162 TLSSupported = false;
6163 }
6164 void getTargetDefines(const LangOptions &Opts,
6165 MacroBuilder &Builder) const override {
6166 DefineStd(Builder, "bpf", Opts);
6167 Builder.defineMacro("__BPF__");
6168 }
6169 bool hasFeature(StringRef Feature) const override {
6170 return Feature == "bpf";
6171 }
6172
6173 void getTargetBuiltins(const Builtin::Info *&Records,
6174 unsigned &NumRecords) const override {}
6175 const char *getClobbers() const override {
6176 return "";
6177 }
6178 BuiltinVaListKind getBuiltinVaListKind() const override {
6179 return TargetInfo::VoidPtrBuiltinVaList;
6180 }
6181 void getGCCRegNames(const char * const *&Names,
6182 unsigned &NumNames) const override {
6183 Names = nullptr;
6184 NumNames = 0;
6185 }
6186 bool validateAsmConstraint(const char *&Name,
6187 TargetInfo::ConstraintInfo &info) const override {
6188 return true;
6189 }
6190 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6191 unsigned &NumAliases) const override {
6192 Aliases = nullptr;
6193 NumAliases = 0;
6194 }
6195};
6196
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006197class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006198 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006199
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006200 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006201 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006202 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006203 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006204 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006205 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006206 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006207 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006208 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006209 enum DspRevEnum {
6210 NoDSP, DSP1, DSP2
6211 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006212 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006213
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006214protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006215 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006216 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006217
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006218public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006219 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6220 const std::string &CPUStr)
6221 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006222 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006223 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6224 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6225 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006226
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006227 bool isNaN2008Default() const {
6228 return CPU == "mips32r6" || CPU == "mips64r6";
6229 }
6230
6231 bool isFP64Default() const {
6232 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6233 }
6234
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006235 bool isNan2008() const override {
6236 return IsNan2008;
6237 }
6238
Alp Toker4925ba72014-06-07 23:30:42 +00006239 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006240 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006241 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6242 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006243 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006244 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006245 .Case("mips1", IsMips32)
6246 .Case("mips2", IsMips32)
6247 .Case("mips3", true)
6248 .Case("mips4", true)
6249 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006250 .Case("mips32", IsMips32)
6251 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006252 .Case("mips32r3", IsMips32)
6253 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006254 .Case("mips32r6", IsMips32)
6255 .Case("mips64", true)
6256 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006257 .Case("mips64r3", true)
6258 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006259 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006260 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006261 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006262 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006263 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00006264 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006265 if (CPU == "octeon")
6266 Features["mips64r2"] = Features["cnmips"] = true;
6267 else
6268 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00006269 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006270
Craig Topper3164f332014-03-11 03:39:26 +00006271 void getTargetDefines(const LangOptions &Opts,
6272 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006273 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006274 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006275 if (Opts.GNUMode)
6276 Builder.defineMacro("mips");
6277
Simon Atanasyan683535b2012-08-29 19:14:58 +00006278 Builder.defineMacro("__REGISTER_PREFIX__", "");
6279
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006280 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006281 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006282 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006283 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006284 case SoftFloat:
6285 Builder.defineMacro("__mips_soft_float", Twine(1));
6286 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006287 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006288
Simon Atanasyan16071912013-04-14 14:07:30 +00006289 if (IsSingleFloat)
6290 Builder.defineMacro("__mips_single_float", Twine(1));
6291
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006292 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6293 Builder.defineMacro("_MIPS_FPSET",
6294 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6295
Simon Atanasyan72244b62012-07-05 16:06:06 +00006296 if (IsMips16)
6297 Builder.defineMacro("__mips16", Twine(1));
6298
Simon Atanasyan60777612013-04-14 14:07:51 +00006299 if (IsMicromips)
6300 Builder.defineMacro("__mips_micromips", Twine(1));
6301
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006302 if (IsNan2008)
6303 Builder.defineMacro("__mips_nan2008", Twine(1));
6304
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006305 switch (DspRev) {
6306 default:
6307 break;
6308 case DSP1:
6309 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6310 Builder.defineMacro("__mips_dsp", Twine(1));
6311 break;
6312 case DSP2:
6313 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6314 Builder.defineMacro("__mips_dspr2", Twine(1));
6315 Builder.defineMacro("__mips_dsp", Twine(1));
6316 break;
6317 }
6318
Jack Carter44ff1e52013-08-12 17:20:29 +00006319 if (HasMSA)
6320 Builder.defineMacro("__mips_msa", Twine(1));
6321
Simon Atanasyan26f19672012-04-05 19:28:31 +00006322 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6323 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6324 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006325
6326 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6327 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006328 }
6329
Craig Topper3164f332014-03-11 03:39:26 +00006330 void getTargetBuiltins(const Builtin::Info *&Records,
6331 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006332 Records = BuiltinInfo;
6333 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006334 }
Craig Topper3164f332014-03-11 03:39:26 +00006335 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006336 return llvm::StringSwitch<bool>(Feature)
6337 .Case("mips", true)
6338 .Case("fp64", HasFP64)
6339 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006340 }
Craig Topper3164f332014-03-11 03:39:26 +00006341 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006342 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006343 }
Craig Topper3164f332014-03-11 03:39:26 +00006344 void getGCCRegNames(const char * const *&Names,
6345 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006346 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006347 // CPU register names
6348 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006349 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6350 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6351 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006352 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6353 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006354 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6355 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6356 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6357 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006358 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006359 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006360 "$fcc5","$fcc6","$fcc7",
6361 // MSA register names
6362 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6363 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6364 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6365 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6366 // MSA control register names
6367 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6368 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006369 };
6370 Names = GCCRegNames;
6371 NumNames = llvm::array_lengthof(GCCRegNames);
6372 }
Craig Topper3164f332014-03-11 03:39:26 +00006373 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6374 unsigned &NumAliases) const override = 0;
6375 bool validateAsmConstraint(const char *&Name,
6376 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006377 switch (*Name) {
6378 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006379 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006380 case 'r': // CPU registers.
6381 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006382 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006383 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006384 case 'c': // $25 for indirect jumps
6385 case 'l': // lo register
6386 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006387 Info.setAllowsRegister();
6388 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006389 case 'I': // Signed 16-bit constant
6390 case 'J': // Integer 0
6391 case 'K': // Unsigned 16-bit constant
6392 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6393 case 'M': // Constants not loadable via lui, addiu, or ori
6394 case 'N': // Constant -1 to -65535
6395 case 'O': // A signed 15-bit constant
6396 case 'P': // A constant between 1 go 65535
6397 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006398 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006399 Info.setAllowsMemory();
6400 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006401 case 'Z':
6402 if (Name[1] == 'C') { // An address usable by ll, and sc.
6403 Info.setAllowsMemory();
6404 Name++; // Skip over 'Z'.
6405 return true;
6406 }
6407 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006408 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006409 }
6410
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006411 std::string convertConstraint(const char *&Constraint) const override {
6412 std::string R;
6413 switch (*Constraint) {
6414 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6415 if (Constraint[1] == 'C') {
6416 R = std::string("^") + std::string(Constraint, 2);
6417 Constraint++;
6418 return R;
6419 }
6420 break;
6421 }
6422 return TargetInfo::convertConstraint(Constraint);
6423 }
6424
Craig Topper3164f332014-03-11 03:39:26 +00006425 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006426 // In GCC, $1 is not widely used in generated code (it's used only in a few
6427 // specific situations), so there is no real need for users to add it to
6428 // the clobbers list if they want to use it in their inline assembly code.
6429 //
6430 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6431 // code generation, so using it in inline assembly without adding it to the
6432 // clobbers list can cause conflicts between the inline assembly code and
6433 // the surrounding generated code.
6434 //
6435 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6436 // operands, which will conflict with the ".set at" assembler option (which
6437 // we use only for inline assembly, in order to maintain compatibility with
6438 // GCC) and will also conflict with the user's usage of $1.
6439 //
6440 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6441 // register for generated code is to automatically clobber $1 for all inline
6442 // assembly code.
6443 //
6444 // FIXME: We should automatically clobber $1 only for inline assembly code
6445 // which actually uses it. This would allow LLVM to use $1 for inline
6446 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006447 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006448 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006449
Craig Topper3164f332014-03-11 03:39:26 +00006450 bool handleTargetFeatures(std::vector<std::string> &Features,
6451 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006452 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006453 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006454 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006455 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006456 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006457 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006458 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006459
6460 for (std::vector<std::string>::iterator it = Features.begin(),
6461 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006462 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006463 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006464 else if (*it == "+soft-float")
6465 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006466 else if (*it == "+mips16")
6467 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00006468 else if (*it == "+micromips")
6469 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006470 else if (*it == "+dsp")
6471 DspRev = std::max(DspRev, DSP1);
6472 else if (*it == "+dspr2")
6473 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00006474 else if (*it == "+msa")
6475 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006476 else if (*it == "+fp64")
6477 HasFP64 = true;
6478 else if (*it == "-fp64")
6479 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006480 else if (*it == "+nan2008")
6481 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006482 else if (*it == "-nan2008")
6483 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006484 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006485
Eric Christopher964a5f32015-08-05 23:48:05 +00006486 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006487
Rafael Espindolaeb265472013-08-21 21:59:03 +00006488 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006489 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006490
Craig Topper3164f332014-03-11 03:39:26 +00006491 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006492 if (RegNo == 0) return 4;
6493 if (RegNo == 1) return 5;
6494 return -1;
6495 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006496
6497 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006498};
6499
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006500const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006501#define BUILTIN(ID, TYPE, ATTRS) \
6502 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6503#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6504 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006505#include "clang/Basic/BuiltinsMips.def"
6506};
6507
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006508class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006509public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006510 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006511 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006512 SizeType = UnsignedInt;
6513 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006514 Int64Type = SignedLongLong;
6515 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006516 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006517 }
Craig Topper3164f332014-03-11 03:39:26 +00006518 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006519 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006520 ABI = Name;
6521 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006522 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006523 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006524 }
Craig Topper3164f332014-03-11 03:39:26 +00006525 void getTargetDefines(const LangOptions &Opts,
6526 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006527 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006528
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006529 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006530 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6531
6532 const std::string& CPUStr = getCPU();
6533 if (CPUStr == "mips32")
6534 Builder.defineMacro("__mips_isa_rev", "1");
6535 else if (CPUStr == "mips32r2")
6536 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006537 else if (CPUStr == "mips32r3")
6538 Builder.defineMacro("__mips_isa_rev", "3");
6539 else if (CPUStr == "mips32r5")
6540 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006541 else if (CPUStr == "mips32r6")
6542 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006543
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006544 if (ABI == "o32") {
6545 Builder.defineMacro("__mips_o32");
6546 Builder.defineMacro("_ABIO32", "1");
6547 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6548 }
6549 else if (ABI == "eabi")
6550 Builder.defineMacro("__mips_eabi");
6551 else
David Blaikie83d382b2011-09-23 05:06:16 +00006552 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006553 }
Craig Topper3164f332014-03-11 03:39:26 +00006554 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6555 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006556 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6557 { { "at" }, "$1" },
6558 { { "v0" }, "$2" },
6559 { { "v1" }, "$3" },
6560 { { "a0" }, "$4" },
6561 { { "a1" }, "$5" },
6562 { { "a2" }, "$6" },
6563 { { "a3" }, "$7" },
6564 { { "t0" }, "$8" },
6565 { { "t1" }, "$9" },
6566 { { "t2" }, "$10" },
6567 { { "t3" }, "$11" },
6568 { { "t4" }, "$12" },
6569 { { "t5" }, "$13" },
6570 { { "t6" }, "$14" },
6571 { { "t7" }, "$15" },
6572 { { "s0" }, "$16" },
6573 { { "s1" }, "$17" },
6574 { { "s2" }, "$18" },
6575 { { "s3" }, "$19" },
6576 { { "s4" }, "$20" },
6577 { { "s5" }, "$21" },
6578 { { "s6" }, "$22" },
6579 { { "s7" }, "$23" },
6580 { { "t8" }, "$24" },
6581 { { "t9" }, "$25" },
6582 { { "k0" }, "$26" },
6583 { { "k1" }, "$27" },
6584 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006585 { { "sp","$sp" }, "$29" },
6586 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006587 { { "ra" }, "$31" }
6588 };
6589 Aliases = GCCRegAliases;
6590 NumAliases = llvm::array_lengthof(GCCRegAliases);
6591 }
6592};
6593
6594class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006595 void setDataLayoutString() override {
6596 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006597 }
6598
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006599public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006600 Mips32EBTargetInfo(const llvm::Triple &Triple)
6601 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006602 }
Craig Topper3164f332014-03-11 03:39:26 +00006603 void getTargetDefines(const LangOptions &Opts,
6604 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006605 DefineStd(Builder, "MIPSEB", Opts);
6606 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006607 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006608 }
6609};
6610
6611class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006612 void setDataLayoutString() override {
6613 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006614 }
6615
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006616public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006617 Mips32ELTargetInfo(const llvm::Triple &Triple)
6618 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006619 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006620 }
Craig Topper3164f332014-03-11 03:39:26 +00006621 void getTargetDefines(const LangOptions &Opts,
6622 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006623 DefineStd(Builder, "MIPSEL", Opts);
6624 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006625 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006626 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006627};
Akira Hatanakabef17452011-09-20 19:21:49 +00006628
6629class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006630public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006631 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006632 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006633 LongDoubleWidth = LongDoubleAlign = 128;
6634 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006635 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6636 LongDoubleWidth = LongDoubleAlign = 64;
6637 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6638 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006639 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006640 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006641 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006642 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006643
6644 void setN64ABITypes() {
6645 LongWidth = LongAlign = 64;
6646 PointerWidth = PointerAlign = 64;
6647 SizeType = UnsignedLong;
6648 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006649 Int64Type = SignedLong;
6650 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006651 }
6652
6653 void setN32ABITypes() {
6654 LongWidth = LongAlign = 32;
6655 PointerWidth = PointerAlign = 32;
6656 SizeType = UnsignedInt;
6657 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006658 Int64Type = SignedLongLong;
6659 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006660 }
6661
Craig Topper3164f332014-03-11 03:39:26 +00006662 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006663 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006664 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006665 ABI = Name;
6666 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006667 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006668 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006669 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006670 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006671 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006672 }
6673 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006674 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006675
Craig Topper3164f332014-03-11 03:39:26 +00006676 void getTargetDefines(const LangOptions &Opts,
6677 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006678 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006679
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006680 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006681 Builder.defineMacro("__mips64");
6682 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006683 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6684
6685 const std::string& CPUStr = getCPU();
6686 if (CPUStr == "mips64")
6687 Builder.defineMacro("__mips_isa_rev", "1");
6688 else if (CPUStr == "mips64r2")
6689 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006690 else if (CPUStr == "mips64r3")
6691 Builder.defineMacro("__mips_isa_rev", "3");
6692 else if (CPUStr == "mips64r5")
6693 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006694 else if (CPUStr == "mips64r6")
6695 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006696
Akira Hatanakabef17452011-09-20 19:21:49 +00006697 if (ABI == "n32") {
6698 Builder.defineMacro("__mips_n32");
6699 Builder.defineMacro("_ABIN32", "2");
6700 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6701 }
6702 else if (ABI == "n64") {
6703 Builder.defineMacro("__mips_n64");
6704 Builder.defineMacro("_ABI64", "3");
6705 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6706 }
6707 else
David Blaikie83d382b2011-09-23 05:06:16 +00006708 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006709 }
Craig Topper3164f332014-03-11 03:39:26 +00006710 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6711 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006712 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6713 { { "at" }, "$1" },
6714 { { "v0" }, "$2" },
6715 { { "v1" }, "$3" },
6716 { { "a0" }, "$4" },
6717 { { "a1" }, "$5" },
6718 { { "a2" }, "$6" },
6719 { { "a3" }, "$7" },
6720 { { "a4" }, "$8" },
6721 { { "a5" }, "$9" },
6722 { { "a6" }, "$10" },
6723 { { "a7" }, "$11" },
6724 { { "t0" }, "$12" },
6725 { { "t1" }, "$13" },
6726 { { "t2" }, "$14" },
6727 { { "t3" }, "$15" },
6728 { { "s0" }, "$16" },
6729 { { "s1" }, "$17" },
6730 { { "s2" }, "$18" },
6731 { { "s3" }, "$19" },
6732 { { "s4" }, "$20" },
6733 { { "s5" }, "$21" },
6734 { { "s6" }, "$22" },
6735 { { "s7" }, "$23" },
6736 { { "t8" }, "$24" },
6737 { { "t9" }, "$25" },
6738 { { "k0" }, "$26" },
6739 { { "k1" }, "$27" },
6740 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006741 { { "sp","$sp" }, "$29" },
6742 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006743 { { "ra" }, "$31" }
6744 };
6745 Aliases = GCCRegAliases;
6746 NumAliases = llvm::array_lengthof(GCCRegAliases);
6747 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006748
6749 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006750};
6751
6752class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006753 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006754 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006755 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 +00006756 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006757 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006758
Akira Hatanakabef17452011-09-20 19:21:49 +00006759 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006760
Akira Hatanakabef17452011-09-20 19:21:49 +00006761public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006762 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006763 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006764 void getTargetDefines(const LangOptions &Opts,
6765 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006766 DefineStd(Builder, "MIPSEB", Opts);
6767 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006768 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006769 }
6770};
6771
6772class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006773 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006774 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006775 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 +00006776 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006777 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006778 }
6779public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006780 Mips64ELTargetInfo(const llvm::Triple &Triple)
6781 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006782 // Default ABI is n64.
6783 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006784 }
Craig Topper3164f332014-03-11 03:39:26 +00006785 void getTargetDefines(const LangOptions &Opts,
6786 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006787 DefineStd(Builder, "MIPSEL", Opts);
6788 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006789 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006790 }
6791};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006792
Ivan Krasindd7403e2011-08-24 20:22:22 +00006793class PNaClTargetInfo : public TargetInfo {
6794public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006795 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006796 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006797 this->UserLabelPrefix = "";
6798 this->LongAlign = 32;
6799 this->LongWidth = 32;
6800 this->PointerAlign = 32;
6801 this->PointerWidth = 32;
6802 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006803 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006804 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006805 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006806 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006807 this->SizeType = TargetInfo::UnsignedInt;
6808 this->PtrDiffType = TargetInfo::SignedInt;
6809 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006810 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006811 }
6812
Craig Topper3164f332014-03-11 03:39:26 +00006813 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006814 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006815 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006816 Builder.defineMacro("__le32__");
6817 Builder.defineMacro("__pnacl__");
6818 }
Craig Topper3164f332014-03-11 03:39:26 +00006819 void getTargetDefines(const LangOptions &Opts,
6820 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006821 getArchDefines(Opts, Builder);
6822 }
Craig Topper3164f332014-03-11 03:39:26 +00006823 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006824 return Feature == "pnacl";
6825 }
Craig Topper3164f332014-03-11 03:39:26 +00006826 void getTargetBuiltins(const Builtin::Info *&Records,
6827 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006828 }
Craig Topper3164f332014-03-11 03:39:26 +00006829 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006830 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006831 }
Craig Topper3164f332014-03-11 03:39:26 +00006832 void getGCCRegNames(const char * const *&Names,
6833 unsigned &NumNames) const override;
6834 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6835 unsigned &NumAliases) const override;
6836 bool validateAsmConstraint(const char *&Name,
6837 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006838 return false;
6839 }
6840
Craig Topper3164f332014-03-11 03:39:26 +00006841 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006842 return "";
6843 }
6844};
6845
6846void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6847 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006848 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006849 NumNames = 0;
6850}
6851
6852void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6853 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006854 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006855 NumAliases = 0;
6856}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006857
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006858// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6859class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6860public:
6861 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00006862 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006863 }
6864
6865 BuiltinVaListKind getBuiltinVaListKind() const override {
6866 return TargetInfo::PNaClABIBuiltinVaList;
6867 }
6868};
6869
JF Bastien643817d2014-09-12 17:52:47 +00006870class Le64TargetInfo : public TargetInfo {
6871 static const Builtin::Info BuiltinInfo[];
6872
6873public:
6874 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6875 BigEndian = false;
6876 NoAsmVariants = true;
6877 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6878 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006879 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006880 }
6881
6882 void getTargetDefines(const LangOptions &Opts,
6883 MacroBuilder &Builder) const override {
6884 DefineStd(Builder, "unix", Opts);
6885 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6886 Builder.defineMacro("__ELF__");
6887 }
6888 void getTargetBuiltins(const Builtin::Info *&Records,
6889 unsigned &NumRecords) const override {
6890 Records = BuiltinInfo;
6891 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6892 }
6893 BuiltinVaListKind getBuiltinVaListKind() const override {
6894 return TargetInfo::PNaClABIBuiltinVaList;
6895 }
6896 const char *getClobbers() const override { return ""; }
6897 void getGCCRegNames(const char *const *&Names,
6898 unsigned &NumNames) const override {
6899 Names = nullptr;
6900 NumNames = 0;
6901 }
6902 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6903 unsigned &NumAliases) const override {
6904 Aliases = nullptr;
6905 NumAliases = 0;
6906 }
6907 bool validateAsmConstraint(const char *&Name,
6908 TargetInfo::ConstraintInfo &Info) const override {
6909 return false;
6910 }
6911
6912 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006913};
6914} // end anonymous namespace.
6915
6916const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6917#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006918 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00006919#include "clang/Basic/BuiltinsLe64.def"
6920};
6921
6922namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006923 static const unsigned SPIRAddrSpaceMap[] = {
6924 1, // opencl_global
6925 3, // opencl_local
6926 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006927 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006928 0, // cuda_device
6929 0, // cuda_constant
6930 0 // cuda_shared
6931 };
6932 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006933 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006934 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006935 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6936 "SPIR target must use unknown OS");
6937 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6938 "SPIR target must use unknown environment type");
6939 BigEndian = false;
6940 TLSSupported = false;
6941 LongWidth = LongAlign = 64;
6942 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006943 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006944 // Define available target features
6945 // These must be defined in sorted order!
6946 NoAsmVariants = true;
6947 }
Craig Topper3164f332014-03-11 03:39:26 +00006948 void getTargetDefines(const LangOptions &Opts,
6949 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006950 DefineStd(Builder, "SPIR", Opts);
6951 }
Craig Topper3164f332014-03-11 03:39:26 +00006952 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006953 return Feature == "spir";
6954 }
Craig Topper3164f332014-03-11 03:39:26 +00006955
6956 void getTargetBuiltins(const Builtin::Info *&Records,
6957 unsigned &NumRecords) const override {}
6958 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006959 return "";
6960 }
Craig Topper3164f332014-03-11 03:39:26 +00006961 void getGCCRegNames(const char * const *&Names,
6962 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006963 bool
6964 validateAsmConstraint(const char *&Name,
6965 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006966 return true;
6967 }
Craig Topper3164f332014-03-11 03:39:26 +00006968 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6969 unsigned &NumAliases) const override {}
6970 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006971 return TargetInfo::VoidPtrBuiltinVaList;
6972 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006973
6974 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6975 return (CC == CC_SpirFunction ||
6976 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6977 }
6978
6979 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6980 return CC_SpirFunction;
6981 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006982 };
6983
6984
6985 class SPIR32TargetInfo : public SPIRTargetInfo {
6986 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006987 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006988 PointerWidth = PointerAlign = 32;
6989 SizeType = TargetInfo::UnsignedInt;
6990 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +00006991 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6992 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006993 }
Craig Topper3164f332014-03-11 03:39:26 +00006994 void getTargetDefines(const LangOptions &Opts,
6995 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006996 DefineStd(Builder, "SPIR32", Opts);
6997 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006998 };
6999
7000 class SPIR64TargetInfo : public SPIRTargetInfo {
7001 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007002 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00007003 PointerWidth = PointerAlign = 64;
7004 SizeType = TargetInfo::UnsignedLong;
7005 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00007006 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7007 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00007008 }
Craig Topper3164f332014-03-11 03:39:26 +00007009 void getTargetDefines(const LangOptions &Opts,
7010 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00007011 DefineStd(Builder, "SPIR64", Opts);
7012 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007013 };
Guy Benyeib798fc92012-12-11 21:38:14 +00007014
Robert Lytton0e076492013-08-13 09:43:10 +00007015class XCoreTargetInfo : public TargetInfo {
7016 static const Builtin::Info BuiltinInfo[];
7017public:
7018 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7019 BigEndian = false;
7020 NoAsmVariants = true;
7021 LongLongAlign = 32;
7022 SuitableAlign = 32;
7023 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007024 SizeType = UnsignedInt;
7025 PtrDiffType = SignedInt;
7026 IntPtrType = SignedInt;
7027 WCharType = UnsignedChar;
7028 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007029 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007030 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7031 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007032 }
Craig Topper3164f332014-03-11 03:39:26 +00007033 void getTargetDefines(const LangOptions &Opts,
7034 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007035 Builder.defineMacro("__XS1B__");
7036 }
Craig Topper3164f332014-03-11 03:39:26 +00007037 void getTargetBuiltins(const Builtin::Info *&Records,
7038 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007039 Records = BuiltinInfo;
7040 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
7041 }
Craig Topper3164f332014-03-11 03:39:26 +00007042 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007043 return TargetInfo::VoidPtrBuiltinVaList;
7044 }
Craig Topper3164f332014-03-11 03:39:26 +00007045 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007046 return "";
7047 }
Craig Topper3164f332014-03-11 03:39:26 +00007048 void getGCCRegNames(const char * const *&Names,
7049 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007050 static const char * const GCCRegNames[] = {
7051 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7052 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7053 };
7054 Names = GCCRegNames;
7055 NumNames = llvm::array_lengthof(GCCRegNames);
7056 }
Craig Topper3164f332014-03-11 03:39:26 +00007057 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7058 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00007059 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00007060 NumAliases = 0;
7061 }
Craig Topper3164f332014-03-11 03:39:26 +00007062 bool validateAsmConstraint(const char *&Name,
7063 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007064 return false;
7065 }
Craig Topper3164f332014-03-11 03:39:26 +00007066 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007067 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7068 return (RegNo < 2)? RegNo : -1;
7069 }
Robert Lytton0e076492013-08-13 09:43:10 +00007070};
7071
7072const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007073#define BUILTIN(ID, TYPE, ATTRS) \
7074 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7075#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7076 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007077#include "clang/Basic/BuiltinsXCore.def"
7078};
7079} // end anonymous namespace.
7080
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007081namespace {
7082// x86_32 Android target
7083class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7084public:
7085 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7086 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7087 SuitableAlign = 32;
7088 LongDoubleWidth = 64;
7089 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7090 }
7091};
7092} // end anonymous namespace
7093
7094namespace {
7095// x86_64 Android target
7096class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7097public:
7098 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7099 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7100 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7101 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007102
7103 bool useFloat128ManglingForLongDouble() const override {
7104 return true;
7105 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007106};
7107} // end anonymous namespace
7108
Ivan Krasindd7403e2011-08-24 20:22:22 +00007109
Chris Lattner5ba61f02006-10-14 07:39:34 +00007110//===----------------------------------------------------------------------===//
7111// Driver code
7112//===----------------------------------------------------------------------===//
7113
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007114static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007115 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007116
Daniel Dunbar52322032009-08-18 05:47:58 +00007117 switch (Triple.getArch()) {
7118 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007119 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007120
Tim Northover2a0783d2014-05-30 14:14:07 +00007121 case llvm::Triple::xcore:
7122 return new XCoreTargetInfo(Triple);
7123
7124 case llvm::Triple::hexagon:
7125 return new HexagonTargetInfo(Triple);
7126
7127 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007128 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007129 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007130
7131 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007132 case llvm::Triple::FreeBSD:
7133 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007134 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007135 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007136 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007137 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007138 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007139 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007140 }
7141
Christian Pirker9b019ae2014-02-25 13:51:00 +00007142 case llvm::Triple::aarch64_be:
7143 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007144 case llvm::Triple::FreeBSD:
7145 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007146 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007147 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007148 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007149 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007150 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007151 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007152 }
7153
Daniel Dunbar52322032009-08-18 05:47:58 +00007154 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007155 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007156 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007157 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007158
Daniel Dunbar52322032009-08-18 05:47:58 +00007159 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007160 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007161 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007162 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007163 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007164 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007165 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007166 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007167 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007168 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007169 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007170 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007171 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007172 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007173 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007174 case llvm::Triple::Win32:
7175 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007176 case llvm::Triple::Cygnus:
7177 return new CygwinARMTargetInfo(Triple);
7178 case llvm::Triple::GNU:
7179 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007180 case llvm::Triple::Itanium:
7181 return new ItaniumWindowsARMleTargetInfo(Triple);
7182 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007183 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007184 return new MicrosoftARMleTargetInfo(Triple);
7185 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007186 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007187 return new ARMleTargetInfo(Triple);
7188 }
7189
7190 case llvm::Triple::armeb:
7191 case llvm::Triple::thumbeb:
7192 if (Triple.isOSDarwin())
7193 return new DarwinARMTargetInfo(Triple);
7194
7195 switch (os) {
7196 case llvm::Triple::Linux:
7197 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7198 case llvm::Triple::FreeBSD:
7199 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7200 case llvm::Triple::NetBSD:
7201 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7202 case llvm::Triple::OpenBSD:
7203 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7204 case llvm::Triple::Bitrig:
7205 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7206 case llvm::Triple::RTEMS:
7207 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7208 case llvm::Triple::NaCl:
7209 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7210 default:
7211 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007212 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007213
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007214 case llvm::Triple::bpfeb:
7215 case llvm::Triple::bpfel:
7216 return new BPFTargetInfo(Triple);
7217
Daniel Dunbar52322032009-08-18 05:47:58 +00007218 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007219 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007220
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007221 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007222 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007223 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007224 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007225 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007226 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007227 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007228 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007229 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007230 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007231 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007232 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007233 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007234
7235 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007236 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007237 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007238 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007239 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007240 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007241 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007242 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007243 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007244 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007245 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007246 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007247 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007248 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007249 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007250
Akira Hatanakabef17452011-09-20 19:21:49 +00007251 case llvm::Triple::mips64:
7252 switch (os) {
7253 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007254 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007255 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007256 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007257 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007258 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007259 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007260 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007261 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007262 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007263 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007264 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007265 }
7266
7267 case llvm::Triple::mips64el:
7268 switch (os) {
7269 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007270 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007271 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007272 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007273 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007274 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007275 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007276 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007277 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007278 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007279 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007280 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007281 }
7282
Ivan Krasindd7403e2011-08-24 20:22:22 +00007283 case llvm::Triple::le32:
7284 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007285 case llvm::Triple::NaCl:
7286 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7287 default:
7288 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007289 }
7290
JF Bastien643817d2014-09-12 17:52:47 +00007291 case llvm::Triple::le64:
7292 return new Le64TargetInfo(Triple);
7293
Daniel Dunbar52322032009-08-18 05:47:58 +00007294 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007295 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007296 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007297 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007298 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007299 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007300 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007301 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007302 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007303 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007304 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007305 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007306 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007307 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007308 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007309 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007310 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007311
7312 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007313 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007314 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007315 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007316 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007317 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007318 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007319 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007320 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007321 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007322 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007323 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007324 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007325 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007326 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007327
Bill Schmidt778d3872013-07-26 01:36:11 +00007328 case llvm::Triple::ppc64le:
7329 switch (os) {
7330 case llvm::Triple::Linux:
7331 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007332 case llvm::Triple::NetBSD:
7333 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007334 default:
7335 return new PPC64TargetInfo(Triple);
7336 }
7337
Peter Collingbournec947aae2012-05-20 23:28:41 +00007338 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007339 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007340 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007341 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007342
Tom Stellardd8e38a32015-01-06 20:34:47 +00007343 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007344 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007345 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007346
Daniel Dunbar52322032009-08-18 05:47:58 +00007347 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007348 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007349 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007350 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007351 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007352 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007353 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007354 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007355 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007356 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007357 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007358 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007359 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007360 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007361 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007362
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007363 // The 'sparcel' architecture copies all the above cases except for Solaris.
7364 case llvm::Triple::sparcel:
7365 switch (os) {
7366 case llvm::Triple::Linux:
7367 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7368 case llvm::Triple::NetBSD:
7369 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7370 case llvm::Triple::OpenBSD:
7371 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7372 case llvm::Triple::RTEMS:
7373 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7374 default:
7375 return new SparcV8elTargetInfo(Triple);
7376 }
7377
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007378 case llvm::Triple::sparcv9:
7379 switch (os) {
7380 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007381 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007382 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007383 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007384 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007385 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007386 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007387 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007388 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007389 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007390 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007391 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007392 }
7393
Ulrich Weigand47445072013-05-06 16:26:41 +00007394 case llvm::Triple::systemz:
7395 switch (os) {
7396 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007397 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007398 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007399 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007400 }
7401
Eli Friedmana9c3d712009-08-19 20:47:07 +00007402 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007403 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007404
Daniel Dunbar52322032009-08-18 05:47:58 +00007405 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007406 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007407 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007408
Daniel Dunbar52322032009-08-18 05:47:58 +00007409 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007410 case llvm::Triple::CloudABI:
7411 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007412 case llvm::Triple::Linux: {
7413 switch (Triple.getEnvironment()) {
7414 default:
7415 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7416 case llvm::Triple::Android:
7417 return new AndroidX86_32TargetInfo(Triple);
7418 }
7419 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007420 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007421 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007422 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007423 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007424 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007425 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007426 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007427 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007428 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007429 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007430 case llvm::Triple::KFreeBSD:
7431 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007432 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007433 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007434 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007435 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007436 case llvm::Triple::Win32: {
7437 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007438 case llvm::Triple::Cygnus:
7439 return new CygwinX86_32TargetInfo(Triple);
7440 case llvm::Triple::GNU:
7441 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007442 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007443 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007444 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007445 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007446 }
7447 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007448 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007449 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007450 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007451 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007452 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007453 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007454 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007455 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007456 }
7457
7458 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007459 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007460 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007461
Daniel Dunbar52322032009-08-18 05:47:58 +00007462 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007463 case llvm::Triple::CloudABI:
7464 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007465 case llvm::Triple::Linux: {
7466 switch (Triple.getEnvironment()) {
7467 default:
7468 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7469 case llvm::Triple::Android:
7470 return new AndroidX86_64TargetInfo(Triple);
7471 }
7472 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007473 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007474 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007475 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007476 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007477 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007478 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007479 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007480 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007481 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007482 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007483 case llvm::Triple::KFreeBSD:
7484 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007485 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007486 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007487 case llvm::Triple::Win32: {
7488 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007489 case llvm::Triple::Cygnus:
7490 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007491 case llvm::Triple::GNU:
7492 return new MinGWX86_64TargetInfo(Triple);
7493 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007494 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007495 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007496 }
7497 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007498 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007499 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007500 case llvm::Triple::PS4:
7501 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007502 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007503 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007504 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007505
Douglas Katzman78d7c542015-05-12 21:18:10 +00007506 case llvm::Triple::spir: {
7507 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7508 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7509 return nullptr;
7510 return new SPIR32TargetInfo(Triple);
7511 }
7512 case llvm::Triple::spir64: {
7513 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7514 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7515 return nullptr;
7516 return new SPIR64TargetInfo(Triple);
7517 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007518 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007519}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007520
7521/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007522/// options.
Alp Toker80758082014-07-06 05:26:44 +00007523TargetInfo *
7524TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7525 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007526 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007527
7528 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007529 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007530 if (!Target) {
7531 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007532 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007533 }
Alp Toker80758082014-07-06 05:26:44 +00007534 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007535
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007536 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007537 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7538 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007539 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007540 }
7541
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007542 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007543 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7544 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007545 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007546 }
7547
Rafael Espindolaeb265472013-08-21 21:59:03 +00007548 // Set the fp math unit.
7549 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7550 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007551 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007552 }
7553
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007554 // Compute the default target features, we need the target to handle this
7555 // because features may have dependencies on one another.
7556 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00007557 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007558
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007559 // Apply the user specified deltas.
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007560 for (const auto &F : Opts->FeaturesAsWritten) {
7561 const char *Name = F.c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00007562 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007563 bool Enabled = Name[0] == '+';
7564 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007565 }
7566
7567 // Add the features to the compile options.
7568 //
7569 // FIXME: If we are completely confident that we have the right set, we only
7570 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007571 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007572 for (const auto &F : Features)
7573 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7574
Eric Christopher3ff21b32013-10-16 21:26:26 +00007575 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007576 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007577
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007578 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007579}