blob: d85e28b753ea44eec6d26e0887d90e50281abbb0 [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[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001012#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001013#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001014 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001015#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001016};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001017
Eric Christopher917e9522014-11-18 22:36:15 +00001018/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001019/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001020bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001021 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001022 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1023 // Ignore disabled features.
1024 if (Features[i][0] == '-')
1025 continue;
1026
1027 StringRef Feature = StringRef(Features[i]).substr(1);
1028
1029 if (Feature == "vsx") {
1030 HasVSX = true;
1031 continue;
1032 }
1033
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001034 if (Feature == "bpermd") {
1035 HasBPERMD = true;
1036 continue;
1037 }
1038
1039 if (Feature == "extdiv") {
1040 HasExtDiv = true;
1041 continue;
1042 }
1043
Bill Schmidt59eb7672014-10-10 15:09:43 +00001044 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001045 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +00001046 continue;
1047 }
1048
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001049 if (Feature == "crypto") {
1050 HasP8Crypto = true;
1051 continue;
1052 }
1053
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001054 if (Feature == "direct-move") {
1055 HasDirectMove = true;
1056 continue;
1057 }
1058
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001059 if (Feature == "qpx") {
1060 HasQPX = true;
1061 continue;
1062 }
1063
Kit Barton8246f282015-03-25 19:41:41 +00001064 if (Feature == "htm") {
1065 HasHTM = true;
1066 continue;
1067 }
1068
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001069 // TODO: Finish this list and add an assert that we've handled them
1070 // all.
1071 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001072 if (!HasVSX && (HasP8Vector || HasDirectMove)) {
1073 if (HasP8Vector)
1074 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector" <<
1075 "-mno-vsx";
1076 else if (HasDirectMove)
1077 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move" <<
1078 "-mno-vsx";
1079 return false;
1080 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001081
1082 return true;
1083}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001084
Chris Lattnerecd49032009-03-02 22:27:17 +00001085/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1086/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001087void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001088 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001089 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001090 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001091 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001092 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001093 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001094 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001095 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001096 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001097 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001098 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001099 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001100 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001101
Chris Lattnerecd49032009-03-02 22:27:17 +00001102 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001103 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1104 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001105 } else {
1106 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1107 getTriple().getOS() != llvm::Triple::OpenBSD)
1108 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001109 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001110
Ulrich Weigand8afad612014-07-28 13:17:52 +00001111 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001112 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001113 Builder.defineMacro("_CALL_ELF", "1");
1114 if (ABI == "elfv2")
1115 Builder.defineMacro("_CALL_ELF", "2");
1116
Chris Lattnerecd49032009-03-02 22:27:17 +00001117 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001118 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1119 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001120
Chris Lattnerecd49032009-03-02 22:27:17 +00001121 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001122 if (LongDoubleWidth == 128)
1123 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001124
John Thompsone467e192009-11-19 17:18:50 +00001125 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001126 Builder.defineMacro("__VEC__", "10206");
1127 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001128 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001129
1130 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001131 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1132 .Case("440", ArchDefineName)
1133 .Case("450", ArchDefineName | ArchDefine440)
1134 .Case("601", ArchDefineName)
1135 .Case("602", ArchDefineName | ArchDefinePpcgr)
1136 .Case("603", ArchDefineName | ArchDefinePpcgr)
1137 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1138 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1139 .Case("604", ArchDefineName | ArchDefinePpcgr)
1140 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1141 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001142 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001143 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1144 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1145 .Case("750", ArchDefineName | ArchDefinePpcgr)
1146 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1147 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001148 .Case("a2", ArchDefineA2)
1149 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001150 .Case("pwr3", ArchDefinePpcgr)
1151 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1152 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1153 | ArchDefinePpcsq)
1154 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1155 | ArchDefinePpcgr | ArchDefinePpcsq)
1156 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1157 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1158 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1159 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1160 | ArchDefinePpcsq)
1161 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1162 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001163 | ArchDefinePpcgr | ArchDefinePpcsq)
1164 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1165 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1166 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001167 .Case("power3", ArchDefinePpcgr)
1168 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1169 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1170 | ArchDefinePpcsq)
1171 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1172 | ArchDefinePpcgr | ArchDefinePpcsq)
1173 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1174 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1175 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1176 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1177 | ArchDefinePpcsq)
1178 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1179 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001180 | ArchDefinePpcgr | ArchDefinePpcsq)
1181 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1182 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1183 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001184 .Default(ArchDefineNone);
1185
1186 if (defs & ArchDefineName)
1187 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1188 if (defs & ArchDefinePpcgr)
1189 Builder.defineMacro("_ARCH_PPCGR");
1190 if (defs & ArchDefinePpcsq)
1191 Builder.defineMacro("_ARCH_PPCSQ");
1192 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001193 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001194 if (defs & ArchDefine603)
1195 Builder.defineMacro("_ARCH_603");
1196 if (defs & ArchDefine604)
1197 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001198 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001199 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001200 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001201 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001202 if (defs & ArchDefinePwr5x)
1203 Builder.defineMacro("_ARCH_PWR5X");
1204 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001205 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001206 if (defs & ArchDefinePwr6x)
1207 Builder.defineMacro("_ARCH_PWR6X");
1208 if (defs & ArchDefinePwr7)
1209 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001210 if (defs & ArchDefinePwr8)
1211 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001212 if (defs & ArchDefineA2)
1213 Builder.defineMacro("_ARCH_A2");
1214 if (defs & ArchDefineA2q) {
1215 Builder.defineMacro("_ARCH_A2Q");
1216 Builder.defineMacro("_ARCH_QP");
1217 }
1218
1219 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1220 Builder.defineMacro("__bg__");
1221 Builder.defineMacro("__THW_BLUEGENE__");
1222 Builder.defineMacro("__bgq__");
1223 Builder.defineMacro("__TOS_BGQ__");
1224 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001225
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001226 if (HasVSX)
1227 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001228 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001229 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001230 if (HasP8Crypto)
1231 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001232 if (HasHTM)
1233 Builder.defineMacro("__HTM__");
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001234 if (getTriple().getArch() == llvm::Triple::ppc64le ||
Nemanja Ivanovice97e1112015-05-14 20:02:24 +00001235 (defs & ArchDefinePwr8) || (CPU == "pwr8")) {
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001236 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1237 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1238 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1239 if (PointerWidth == 64)
1240 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1241 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001242
Bill Schmidt38378a02013-02-01 20:23:10 +00001243 // FIXME: The following are not yet generated here by Clang, but are
1244 // generated by GCC:
1245 //
1246 // _SOFT_FLOAT_
1247 // __RECIP_PRECISION__
1248 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001249 // __RECIP__
1250 // __RECIPF__
1251 // __RSQRTE__
1252 // __RSQRTEF__
1253 // _SOFT_DOUBLE_
1254 // __NO_LWSYNC__
1255 // __HAVE_BSWAP__
1256 // __LONGDOUBLE128
1257 // __CMODEL_MEDIUM__
1258 // __CMODEL_LARGE__
1259 // _CALL_SYSV
1260 // _CALL_DARWIN
1261 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001262}
1263
1264void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1265 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1266 .Case("7400", true)
1267 .Case("g4", true)
1268 .Case("7450", true)
1269 .Case("g4+", true)
1270 .Case("970", true)
1271 .Case("g5", true)
1272 .Case("pwr6", true)
1273 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001274 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001275 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001276 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001277 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001278
1279 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001280 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1281 .Case("ppc64le", true)
1282 .Case("pwr8", true)
1283 .Default(false);
1284 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1285 .Case("ppc64le", true)
1286 .Case("pwr8", true)
1287 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001288 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1289 .Case("ppc64le", true)
1290 .Case("pwr8", true)
1291 .Case("pwr7", true)
1292 .Default(false);
1293 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1294 .Case("ppc64le", true)
1295 .Case("pwr8", true)
1296 .Case("pwr7", true)
1297 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001298 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1299 .Case("ppc64le", true)
1300 .Case("pwr8", true)
1301 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001302 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1303 .Case("ppc64le", true)
1304 .Case("pwr8", true)
1305 .Case("pwr7", true)
1306 .Default(false);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001307}
1308
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001309bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001310 return llvm::StringSwitch<bool>(Feature)
1311 .Case("powerpc", true)
1312 .Case("vsx", HasVSX)
1313 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001314 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001315 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001316 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001317 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001318 .Case("bpermd", HasBPERMD)
1319 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001320 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001321}
Chris Lattner17df24e2008-04-21 18:56:49 +00001322
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001323/* There is no clear way for the target to know which of the features in the
1324 final feature vector came from defaults and which are actually specified by
1325 the user. To that end, we use the fact that this function is not called on
1326 default features - only user specified ones. By the first time this
1327 function is called, the default features are populated.
1328 We then keep track of the features that the user specified so that we
1329 can ensure we do not override a user's request (only defaults).
1330 For example:
1331 -mcpu=pwr8 -mno-vsx (should disable vsx and everything that depends on it)
1332 -mcpu=pwr8 -mdirect-move -mno-vsx (should actually be diagnosed)
1333
1334NOTE: Do not call this from PPCTargetInfo::getDefaultFeatures
1335*/
1336void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1337 StringRef Name, bool Enabled) const {
1338 static llvm::StringMap<bool> ExplicitFeatures;
1339 ExplicitFeatures[Name] = Enabled;
1340
1341 // At this point, -mno-vsx turns off the dependent features but we respect
1342 // the user's requests.
1343 if (!Enabled && Name == "vsx") {
1344 Features["direct-move"] = ExplicitFeatures["direct-move"];
1345 Features["power8-vector"] = ExplicitFeatures["power8-vector"];
1346 }
1347 if ((Enabled && Name == "power8-vector") ||
1348 (Enabled && Name == "direct-move")) {
1349 if (ExplicitFeatures.find("vsx") == ExplicitFeatures.end()) {
1350 Features["vsx"] = true;
1351 }
1352 }
1353 Features[Name] = Enabled;
1354}
1355
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001356const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001357 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1358 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1359 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1360 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1361 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1362 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1363 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1364 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001365 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001366 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001367 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001368 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1369 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1370 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1371 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001372 "vrsave", "vscr",
1373 "spe_acc", "spefscr",
1374 "sfp"
1375};
Chris Lattner10a5b382007-01-29 05:24:35 +00001376
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001377void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001378 unsigned &NumNames) const {
1379 Names = GCCRegNames;
1380 NumNames = llvm::array_lengthof(GCCRegNames);
1381}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001382
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001383const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1384 // While some of these aliases do map to different registers
1385 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001386 { { "0" }, "r0" },
1387 { { "1"}, "r1" },
1388 { { "2" }, "r2" },
1389 { { "3" }, "r3" },
1390 { { "4" }, "r4" },
1391 { { "5" }, "r5" },
1392 { { "6" }, "r6" },
1393 { { "7" }, "r7" },
1394 { { "8" }, "r8" },
1395 { { "9" }, "r9" },
1396 { { "10" }, "r10" },
1397 { { "11" }, "r11" },
1398 { { "12" }, "r12" },
1399 { { "13" }, "r13" },
1400 { { "14" }, "r14" },
1401 { { "15" }, "r15" },
1402 { { "16" }, "r16" },
1403 { { "17" }, "r17" },
1404 { { "18" }, "r18" },
1405 { { "19" }, "r19" },
1406 { { "20" }, "r20" },
1407 { { "21" }, "r21" },
1408 { { "22" }, "r22" },
1409 { { "23" }, "r23" },
1410 { { "24" }, "r24" },
1411 { { "25" }, "r25" },
1412 { { "26" }, "r26" },
1413 { { "27" }, "r27" },
1414 { { "28" }, "r28" },
1415 { { "29" }, "r29" },
1416 { { "30" }, "r30" },
1417 { { "31" }, "r31" },
1418 { { "fr0" }, "f0" },
1419 { { "fr1" }, "f1" },
1420 { { "fr2" }, "f2" },
1421 { { "fr3" }, "f3" },
1422 { { "fr4" }, "f4" },
1423 { { "fr5" }, "f5" },
1424 { { "fr6" }, "f6" },
1425 { { "fr7" }, "f7" },
1426 { { "fr8" }, "f8" },
1427 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001428 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001429 { { "fr11" }, "f11" },
1430 { { "fr12" }, "f12" },
1431 { { "fr13" }, "f13" },
1432 { { "fr14" }, "f14" },
1433 { { "fr15" }, "f15" },
1434 { { "fr16" }, "f16" },
1435 { { "fr17" }, "f17" },
1436 { { "fr18" }, "f18" },
1437 { { "fr19" }, "f19" },
1438 { { "fr20" }, "f20" },
1439 { { "fr21" }, "f21" },
1440 { { "fr22" }, "f22" },
1441 { { "fr23" }, "f23" },
1442 { { "fr24" }, "f24" },
1443 { { "fr25" }, "f25" },
1444 { { "fr26" }, "f26" },
1445 { { "fr27" }, "f27" },
1446 { { "fr28" }, "f28" },
1447 { { "fr29" }, "f29" },
1448 { { "fr30" }, "f30" },
1449 { { "fr31" }, "f31" },
1450 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001451};
1452
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001453void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001454 unsigned &NumAliases) const {
1455 Aliases = GCCRegAliases;
1456 NumAliases = llvm::array_lengthof(GCCRegAliases);
1457}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001458
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001459class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001460public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001461 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001462 DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001463
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001464 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001465 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001466 case llvm::Triple::FreeBSD:
1467 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001468 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001469 PtrDiffType = SignedInt;
1470 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001471 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001472 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001473 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001474 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001475
Roman Divacky3ffe7462012-03-13 19:20:17 +00001476 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1477 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001478 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001479 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001480
1481 // PPC32 supports atomics up to 4 bytes.
1482 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001483 }
1484
Craig Topper3164f332014-03-11 03:39:26 +00001485 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001486 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001487 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001488 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001489};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001490
Bill Schmidt778d3872013-07-26 01:36:11 +00001491// Note: ABI differences may eventually require us to have a separate
1492// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001493class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001494public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001495 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001496 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001497 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001498 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001499
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001500 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001501 DataLayoutString = "e-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001502 ABI = "elfv2";
1503 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001504 DataLayoutString = "E-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001505 ABI = "elfv1";
1506 }
1507
1508 switch (getTriple().getOS()) {
1509 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001510 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001511 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001512 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001513 case llvm::Triple::NetBSD:
1514 IntMaxType = SignedLongLong;
1515 Int64Type = SignedLongLong;
1516 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001517 default:
1518 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001519 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001520
1521 // PPC64 supports atomics up to 8 bytes.
1522 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001523 }
Craig Topper3164f332014-03-11 03:39:26 +00001524 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001525 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001526 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001527 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001528 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001529 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001530 ABI = Name;
1531 return true;
1532 }
1533 return false;
1534 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001535};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001536
Roman Divacky965b0b72011-01-06 08:27:10 +00001537class DarwinPPC32TargetInfo :
1538 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001539public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001540 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1541 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001542 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001543 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001544 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001545 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001546 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001547 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001548 }
Craig Topper3164f332014-03-11 03:39:26 +00001549 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001550 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001551 }
1552};
1553
1554class DarwinPPC64TargetInfo :
1555 public DarwinTargetInfo<PPC64TargetInfo> {
1556public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001557 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1558 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001559 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001560 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001561 DataLayoutString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001562 }
1563};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001564
Peter Collingbournec947aae2012-05-20 23:28:41 +00001565 static const unsigned NVPTXAddrSpaceMap[] = {
1566 1, // opencl_global
1567 3, // opencl_local
1568 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001569 // FIXME: generic has to be added to the target
1570 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001571 1, // cuda_device
1572 4, // cuda_constant
1573 3, // cuda_shared
1574 };
1575 class NVPTXTargetInfo : public TargetInfo {
1576 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001577 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001578
1579 // The GPU profiles supported by the NVPTX backend
1580 enum GPUKind {
1581 GK_NONE,
1582 GK_SM20,
1583 GK_SM21,
1584 GK_SM30,
1585 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001586 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001587 } GPU;
1588
Peter Collingbournec947aae2012-05-20 23:28:41 +00001589 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001590 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001591 BigEndian = false;
1592 TLSSupported = false;
1593 LongWidth = LongAlign = 64;
1594 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001595 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001596 // Define available target features
1597 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001598 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001599 // Set the default GPU to sm20
1600 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001601 }
Craig Topper3164f332014-03-11 03:39:26 +00001602 void getTargetDefines(const LangOptions &Opts,
1603 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001604 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001605 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001606 if (Opts.CUDAIsDevice) {
1607 // Set __CUDA_ARCH__ for the GPU specified.
1608 std::string CUDAArchCode;
1609 switch (GPU) {
1610 case GK_SM20:
1611 CUDAArchCode = "200";
1612 break;
1613 case GK_SM21:
1614 CUDAArchCode = "210";
1615 break;
1616 case GK_SM30:
1617 CUDAArchCode = "300";
1618 break;
1619 case GK_SM35:
1620 CUDAArchCode = "350";
1621 break;
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001622 case GK_SM37:
1623 CUDAArchCode = "370";
1624 break;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001625 default:
1626 llvm_unreachable("Unhandled target CPU");
1627 }
1628 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1629 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001630 }
Craig Topper3164f332014-03-11 03:39:26 +00001631 void getTargetBuiltins(const Builtin::Info *&Records,
1632 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001633 Records = BuiltinInfo;
1634 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001635 }
Craig Topper3164f332014-03-11 03:39:26 +00001636 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001637 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001638 }
Craig Topper3164f332014-03-11 03:39:26 +00001639
1640 void getGCCRegNames(const char * const *&Names,
1641 unsigned &NumNames) const override;
1642 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1643 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001644 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001645 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001646 NumAliases = 0;
1647 }
Eric Christopher917e9522014-11-18 22:36:15 +00001648 bool
1649 validateAsmConstraint(const char *&Name,
1650 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001651 switch (*Name) {
1652 default: return false;
1653 case 'c':
1654 case 'h':
1655 case 'r':
1656 case 'l':
1657 case 'f':
1658 case 'd':
1659 Info.setAllowsRegister();
1660 return true;
1661 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001662 }
Craig Topper3164f332014-03-11 03:39:26 +00001663 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001664 // FIXME: Is this really right?
1665 return "";
1666 }
Craig Topper3164f332014-03-11 03:39:26 +00001667 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001668 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001669 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001670 }
Craig Topper3164f332014-03-11 03:39:26 +00001671 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001672 GPU = llvm::StringSwitch<GPUKind>(Name)
1673 .Case("sm_20", GK_SM20)
1674 .Case("sm_21", GK_SM21)
1675 .Case("sm_30", GK_SM30)
1676 .Case("sm_35", GK_SM35)
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001677 .Case("sm_37", GK_SM37)
Reid Klecknerbbc01782014-12-03 21:53:36 +00001678 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001679
Reid Klecknerbbc01782014-12-03 21:53:36 +00001680 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001681 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001682 };
1683
1684 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1685#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1686#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1687 ALL_LANGUAGES },
1688#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001689 };
1690
1691 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1692 "r0"
1693 };
1694
1695 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1696 unsigned &NumNames) const {
1697 Names = GCCRegNames;
1698 NumNames = llvm::array_lengthof(GCCRegNames);
1699 }
1700
1701 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1702 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001703 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001704 PointerWidth = PointerAlign = 32;
Eli Bendersky13467172015-04-01 20:29:18 +00001705 SizeType = TargetInfo::UnsignedInt;
1706 PtrDiffType = TargetInfo::SignedInt;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001707 IntPtrType = TargetInfo::SignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +00001708 DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001709 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001710 };
1711
1712 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1713 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001714 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001715 PointerWidth = PointerAlign = 64;
Eli Bendersky13467172015-04-01 20:29:18 +00001716 SizeType = TargetInfo::UnsignedLong;
1717 PtrDiffType = TargetInfo::SignedLong;
Eli Bendersky15f63422015-04-01 18:29:27 +00001718 IntPtrType = TargetInfo::SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00001719 DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001720 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001721 };
Eli Friedmand13b41e2012-10-12 23:32:00 +00001722
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001723static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001724 1, // opencl_global
1725 3, // opencl_local
1726 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001727 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001728 1, // cuda_device
1729 2, // cuda_constant
1730 3 // cuda_shared
1731};
1732
Tom Stellarda96344b2014-08-21 13:58:40 +00001733// If you edit the description strings, make sure you update
1734// getPointerWidthV().
1735
Eric Christopher964a5f32015-08-05 23:48:05 +00001736static const char *DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001737 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1738 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001739
Eric Christopher964a5f32015-08-05 23:48:05 +00001740static const char *DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001741 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1742 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001743
Eric Christopher964a5f32015-08-05 23:48:05 +00001744static const char *DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001745 "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 +00001746 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1747 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001748
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001749class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001750 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001751 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001752
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001753 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001754 enum GPUKind {
1755 GK_NONE,
1756 GK_R600,
1757 GK_R600_DOUBLE_OPS,
1758 GK_R700,
1759 GK_R700_DOUBLE_OPS,
1760 GK_EVERGREEN,
1761 GK_EVERGREEN_DOUBLE_OPS,
1762 GK_NORTHERN_ISLANDS,
1763 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001764 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001765 GK_SEA_ISLANDS,
1766 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001767 } GPU;
1768
Jan Veselyeebeaea2015-05-04 19:53:36 +00001769 bool hasFP64:1;
1770 bool hasFMAF:1;
1771 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001772
Eli Friedmand13b41e2012-10-12 23:32:00 +00001773public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001774 AMDGPUTargetInfo(const llvm::Triple &Triple)
1775 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001776
1777 if (Triple.getArch() == llvm::Triple::amdgcn) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001778 DataLayoutString = DataLayoutStringSI;
Tom Stellardd99fb952015-01-28 15:38:44 +00001779 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001780 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001781 hasFMAF = true;
1782 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001783 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001784 DataLayoutString = DataLayoutStringR600;
Tom Stellardd99fb952015-01-28 15:38:44 +00001785 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001786 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001787 hasFMAF = false;
1788 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001789 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001790 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001791 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001792 }
1793
Tom Stellarda96344b2014-08-21 13:58:40 +00001794 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1795 if (GPU <= GK_CAYMAN)
1796 return 32;
1797
1798 switch(AddrSpace) {
1799 default:
1800 return 64;
1801 case 0:
1802 case 3:
1803 case 5:
1804 return 32;
1805 }
1806 }
1807
Craig Topper3164f332014-03-11 03:39:26 +00001808 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001809 return "";
1810 }
1811
Craig Topper3164f332014-03-11 03:39:26 +00001812 void getGCCRegNames(const char * const *&Names,
Tom Stellard7b1059b2015-04-14 14:36:56 +00001813 unsigned &NumNames) const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001814
Craig Topper3164f332014-03-11 03:39:26 +00001815 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1816 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001817 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001818 NumAliases = 0;
1819 }
1820
Craig Topper3164f332014-03-11 03:39:26 +00001821 bool validateAsmConstraint(const char *&Name,
1822 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001823 return true;
1824 }
1825
Craig Topper3164f332014-03-11 03:39:26 +00001826 void getTargetBuiltins(const Builtin::Info *&Records,
1827 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001828 Records = BuiltinInfo;
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001829 NumRecords = clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001830 }
1831
Craig Topper3164f332014-03-11 03:39:26 +00001832 void getTargetDefines(const LangOptions &Opts,
1833 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001834 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001835 if (hasFMAF)
1836 Builder.defineMacro("__HAS_FMAF__");
1837 if (hasLDEXPF)
1838 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001839 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001840 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001841 if (Opts.OpenCL) {
1842 if (GPU >= GK_NORTHERN_ISLANDS) {
1843 Builder.defineMacro("cl_khr_byte_addressable_store");
1844 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1845 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1846 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1847 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1848 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001849 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001850 }
1851
Craig Topper3164f332014-03-11 03:39:26 +00001852 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001853 return TargetInfo::CharPtrBuiltinVaList;
1854 }
1855
Craig Topper3164f332014-03-11 03:39:26 +00001856 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001857 GPU = llvm::StringSwitch<GPUKind>(Name)
1858 .Case("r600" , GK_R600)
1859 .Case("rv610", GK_R600)
1860 .Case("rv620", GK_R600)
1861 .Case("rv630", GK_R600)
1862 .Case("rv635", GK_R600)
1863 .Case("rs780", GK_R600)
1864 .Case("rs880", GK_R600)
1865 .Case("rv670", GK_R600_DOUBLE_OPS)
1866 .Case("rv710", GK_R700)
1867 .Case("rv730", GK_R700)
1868 .Case("rv740", GK_R700_DOUBLE_OPS)
1869 .Case("rv770", GK_R700_DOUBLE_OPS)
1870 .Case("palm", GK_EVERGREEN)
1871 .Case("cedar", GK_EVERGREEN)
1872 .Case("sumo", GK_EVERGREEN)
1873 .Case("sumo2", GK_EVERGREEN)
1874 .Case("redwood", GK_EVERGREEN)
1875 .Case("juniper", GK_EVERGREEN)
1876 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1877 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1878 .Case("barts", GK_NORTHERN_ISLANDS)
1879 .Case("turks", GK_NORTHERN_ISLANDS)
1880 .Case("caicos", GK_NORTHERN_ISLANDS)
1881 .Case("cayman", GK_CAYMAN)
1882 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001883 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001884 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1885 .Case("verde", GK_SOUTHERN_ISLANDS)
1886 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001887 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001888 .Case("bonaire", GK_SEA_ISLANDS)
1889 .Case("kabini", GK_SEA_ISLANDS)
1890 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001891 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001892 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001893 .Case("tonga", GK_VOLCANIC_ISLANDS)
1894 .Case("iceland", GK_VOLCANIC_ISLANDS)
1895 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001896 .Default(GK_NONE);
1897
1898 if (GPU == GK_NONE) {
1899 return false;
1900 }
1901
1902 // Set the correct data layout
1903 switch (GPU) {
1904 case GK_NONE:
1905 case GK_R600:
1906 case GK_R700:
1907 case GK_EVERGREEN:
1908 case GK_NORTHERN_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001909 DataLayoutString = DataLayoutStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001910 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001911 hasFMAF = false;
1912 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001913 break;
1914 case GK_R600_DOUBLE_OPS:
1915 case GK_R700_DOUBLE_OPS:
1916 case GK_EVERGREEN_DOUBLE_OPS:
1917 case GK_CAYMAN:
Eric Christopher964a5f32015-08-05 23:48:05 +00001918 DataLayoutString = DataLayoutStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001919 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001920 hasFMAF = true;
1921 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001922 break;
1923 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001924 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001925 case GK_VOLCANIC_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001926 DataLayoutString = DataLayoutStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001927 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001928 hasFMAF = true;
1929 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001930 break;
1931 }
1932
1933 return true;
1934 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001935};
1936
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001937const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001938#define BUILTIN(ID, TYPE, ATTRS) \
1939 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001940#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001941};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001942const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001943 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1944 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1945 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1946 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1947 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1948 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1949 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1950 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1951 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1952 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1953 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1954 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1955 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1956 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1957 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1958 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1959 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1960 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1961 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1962 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1963 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1964 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1965 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1966 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1967 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1968 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1969 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1970 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1971 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1972 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1973 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1974 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1975 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1976 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1977 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1978 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1979 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1980 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1981 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1982 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1983 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1984 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
1985 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
1986 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
1987 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
1988 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
1989 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
1990 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
1991 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
1992 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
1993};
1994
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001995void AMDGPUTargetInfo::getGCCRegNames(const char * const *&Names,
1996 unsigned &NumNames) const {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001997 Names = GCCRegNames;
1998 NumNames = llvm::array_lengthof(GCCRegNames);
1999}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002000
Eli Friedman3fd920a2008-08-20 02:34:37 +00002001// Namespace for x86 abstract base class
2002const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00002003#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00002004#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00002005 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00002006#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002007};
Eli Friedmanb5366062008-05-20 14:21:01 +00002008
Nuno Lopescfca1f02009-12-23 17:49:57 +00002009static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002010 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2011 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002012 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002013 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2014 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2015 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002016 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002017 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2018 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002019};
2020
Eric Christophercdd36352011-06-21 00:05:20 +00002021const TargetInfo::AddlRegName AddlRegNames[] = {
2022 { { "al", "ah", "eax", "rax" }, 0 },
2023 { { "bl", "bh", "ebx", "rbx" }, 3 },
2024 { { "cl", "ch", "ecx", "rcx" }, 2 },
2025 { { "dl", "dh", "edx", "rdx" }, 1 },
2026 { { "esi", "rsi" }, 4 },
2027 { { "edi", "rdi" }, 5 },
2028 { { "esp", "rsp" }, 7 },
2029 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002030};
2031
2032// X86 target abstract base class; x86-32 and x86-64 are very close, so
2033// most of the implementation can be shared.
2034class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002035 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002036 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00002037 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00002038 enum MMX3DNowEnum {
2039 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
2040 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002041 enum XOPEnum {
2042 NoXOP,
2043 SSE4A,
2044 FMA4,
2045 XOP
2046 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00002047
Eric Christophere1ddaf92010-04-02 23:50:19 +00002048 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00002049 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00002050 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00002051 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00002052 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00002053 bool HasBMI;
2054 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00002055 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00002056 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00002057 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00002058 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00002059 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002060 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00002061 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00002062 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00002063 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
2064 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00002065 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002066 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002067
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002068 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2069 ///
2070 /// Each enumeration represents a particular CPU supported by Clang. These
2071 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2072 enum CPUKind {
2073 CK_Generic,
2074
2075 /// \name i386
2076 /// i386-generation processors.
2077 //@{
2078 CK_i386,
2079 //@}
2080
2081 /// \name i486
2082 /// i486-generation processors.
2083 //@{
2084 CK_i486,
2085 CK_WinChipC6,
2086 CK_WinChip2,
2087 CK_C3,
2088 //@}
2089
2090 /// \name i586
2091 /// i586-generation processors, P5 microarchitecture based.
2092 //@{
2093 CK_i586,
2094 CK_Pentium,
2095 CK_PentiumMMX,
2096 //@}
2097
2098 /// \name i686
2099 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2100 //@{
2101 CK_i686,
2102 CK_PentiumPro,
2103 CK_Pentium2,
2104 CK_Pentium3,
2105 CK_Pentium3M,
2106 CK_PentiumM,
2107 CK_C3_2,
2108
2109 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2110 /// Clang however has some logic to suport this.
2111 // FIXME: Warn, deprecate, and potentially remove this.
2112 CK_Yonah,
2113 //@}
2114
2115 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002116 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002117 //@{
2118 CK_Pentium4,
2119 CK_Pentium4M,
2120 CK_Prescott,
2121 CK_Nocona,
2122 //@}
2123
2124 /// \name Core
2125 /// Core microarchitecture based processors.
2126 //@{
2127 CK_Core2,
2128
2129 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2130 /// codename which GCC no longer accepts as an option to -march, but Clang
2131 /// has some logic for recognizing it.
2132 // FIXME: Warn, deprecate, and potentially remove this.
2133 CK_Penryn,
2134 //@}
2135
2136 /// \name Atom
2137 /// Atom processors
2138 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002139 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002140 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002141 //@}
2142
2143 /// \name Nehalem
2144 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002145 CK_Nehalem,
2146
2147 /// \name Westmere
2148 /// Westmere microarchitecture based processors.
2149 CK_Westmere,
2150
2151 /// \name Sandy Bridge
2152 /// Sandy Bridge microarchitecture based processors.
2153 CK_SandyBridge,
2154
2155 /// \name Ivy Bridge
2156 /// Ivy Bridge microarchitecture based processors.
2157 CK_IvyBridge,
2158
2159 /// \name Haswell
2160 /// Haswell microarchitecture based processors.
2161 CK_Haswell,
2162
2163 /// \name Broadwell
2164 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002165 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002166
2167 /// \name Skylake
2168 /// Skylake microarchitecture based processors.
2169 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002170
Craig Topper449314e2013-08-20 07:09:39 +00002171 /// \name Knights Landing
2172 /// Knights Landing processor.
2173 CK_KNL,
2174
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002175 /// \name K6
2176 /// K6 architecture processors.
2177 //@{
2178 CK_K6,
2179 CK_K6_2,
2180 CK_K6_3,
2181 //@}
2182
2183 /// \name K7
2184 /// K7 architecture processors.
2185 //@{
2186 CK_Athlon,
2187 CK_AthlonThunderbird,
2188 CK_Athlon4,
2189 CK_AthlonXP,
2190 CK_AthlonMP,
2191 //@}
2192
2193 /// \name K8
2194 /// K8 architecture processors.
2195 //@{
2196 CK_Athlon64,
2197 CK_Athlon64SSE3,
2198 CK_AthlonFX,
2199 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002200 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002201 CK_Opteron,
2202 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002203 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002204 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002205
Benjamin Kramer569f2152012-01-10 11:50:18 +00002206 /// \name Bobcat
2207 /// Bobcat architecture processors.
2208 //@{
2209 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002210 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002211 //@}
2212
2213 /// \name Bulldozer
2214 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002215 //@{
2216 CK_BDVER1,
2217 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002218 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002219 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002220 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002221
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002222 /// This specification is deprecated and will be removed in the future.
2223 /// Users should prefer \see CK_K8.
2224 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002225 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002226 CK_x86_64,
2227 //@}
2228
2229 /// \name Geode
2230 /// Geode processors.
2231 //@{
2232 CK_Geode
2233 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002234 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002235
Rafael Espindolaeb265472013-08-21 21:59:03 +00002236 enum FPMathKind {
2237 FP_Default,
2238 FP_SSE,
2239 FP_387
2240 } FPMath;
2241
Eli Friedman3fd920a2008-08-20 02:34:37 +00002242public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002243 X86TargetInfo(const llvm::Triple &Triple)
2244 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002245 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002246 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2247 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2248 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2249 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2250 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2251 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002252 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002253 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002254 }
Craig Topper3164f332014-03-11 03:39:26 +00002255 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002256 // X87 evaluates with 80 bits "long double" precision.
2257 return SSELevel == NoSSE ? 2 : 0;
2258 }
Craig Topper3164f332014-03-11 03:39:26 +00002259 void getTargetBuiltins(const Builtin::Info *&Records,
2260 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002261 Records = BuiltinInfo;
2262 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002263 }
Craig Topper3164f332014-03-11 03:39:26 +00002264 void getGCCRegNames(const char * const *&Names,
2265 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002266 Names = GCCRegNames;
2267 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002268 }
Craig Topper3164f332014-03-11 03:39:26 +00002269 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2270 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002271 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002272 NumAliases = 0;
2273 }
Craig Topper3164f332014-03-11 03:39:26 +00002274 void getGCCAddlRegNames(const AddlRegName *&Names,
2275 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002276 Names = AddlRegNames;
2277 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002278 }
Eric Christopherd9832702015-06-29 21:00:05 +00002279 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002280 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002281 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002282
Akira Hatanaka974131e2014-09-18 18:17:18 +00002283 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2284
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002285 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2286
Akira Hatanaka974131e2014-09-18 18:17:18 +00002287 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2288
Craig Topper3164f332014-03-11 03:39:26 +00002289 std::string convertConstraint(const char *&Constraint) const override;
2290 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002291 return "~{dirflag},~{fpsr},~{flags}";
2292 }
Craig Topper3164f332014-03-11 03:39:26 +00002293 void getTargetDefines(const LangOptions &Opts,
2294 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002295 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2296 bool Enabled);
2297 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2298 bool Enabled);
2299 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2300 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002301 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2302 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002303 setFeatureEnabledImpl(Features, Name, Enabled);
2304 }
2305 // This exists purely to cut down on the number of virtual calls in
2306 // getDefaultFeatures which calls this repeatedly.
2307 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2308 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002309 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2310 bool hasFeature(StringRef Feature) const override;
2311 bool handleTargetFeatures(std::vector<std::string> &Features,
2312 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002313 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002314 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2315 return "avx512";
2316 else if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002317 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002318 else if (getTriple().getArch() == llvm::Triple::x86 &&
2319 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002320 return "no-mmx";
2321 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002322 }
Craig Topper3164f332014-03-11 03:39:26 +00002323 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002324 CPU = llvm::StringSwitch<CPUKind>(Name)
2325 .Case("i386", CK_i386)
2326 .Case("i486", CK_i486)
2327 .Case("winchip-c6", CK_WinChipC6)
2328 .Case("winchip2", CK_WinChip2)
2329 .Case("c3", CK_C3)
2330 .Case("i586", CK_i586)
2331 .Case("pentium", CK_Pentium)
2332 .Case("pentium-mmx", CK_PentiumMMX)
2333 .Case("i686", CK_i686)
2334 .Case("pentiumpro", CK_PentiumPro)
2335 .Case("pentium2", CK_Pentium2)
2336 .Case("pentium3", CK_Pentium3)
2337 .Case("pentium3m", CK_Pentium3M)
2338 .Case("pentium-m", CK_PentiumM)
2339 .Case("c3-2", CK_C3_2)
2340 .Case("yonah", CK_Yonah)
2341 .Case("pentium4", CK_Pentium4)
2342 .Case("pentium4m", CK_Pentium4M)
2343 .Case("prescott", CK_Prescott)
2344 .Case("nocona", CK_Nocona)
2345 .Case("core2", CK_Core2)
2346 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002347 .Case("bonnell", CK_Bonnell)
2348 .Case("atom", CK_Bonnell) // Legacy name.
2349 .Case("silvermont", CK_Silvermont)
2350 .Case("slm", CK_Silvermont) // Legacy name.
2351 .Case("nehalem", CK_Nehalem)
2352 .Case("corei7", CK_Nehalem) // Legacy name.
2353 .Case("westmere", CK_Westmere)
2354 .Case("sandybridge", CK_SandyBridge)
2355 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2356 .Case("ivybridge", CK_IvyBridge)
2357 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2358 .Case("haswell", CK_Haswell)
2359 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002360 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002361 .Case("skylake", CK_Skylake)
2362 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002363 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002364 .Case("k6", CK_K6)
2365 .Case("k6-2", CK_K6_2)
2366 .Case("k6-3", CK_K6_3)
2367 .Case("athlon", CK_Athlon)
2368 .Case("athlon-tbird", CK_AthlonThunderbird)
2369 .Case("athlon-4", CK_Athlon4)
2370 .Case("athlon-xp", CK_AthlonXP)
2371 .Case("athlon-mp", CK_AthlonMP)
2372 .Case("athlon64", CK_Athlon64)
2373 .Case("athlon64-sse3", CK_Athlon64SSE3)
2374 .Case("athlon-fx", CK_AthlonFX)
2375 .Case("k8", CK_K8)
2376 .Case("k8-sse3", CK_K8SSE3)
2377 .Case("opteron", CK_Opteron)
2378 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002379 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002380 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002381 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002382 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002383 .Case("bdver1", CK_BDVER1)
2384 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002385 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002386 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002387 .Case("x86-64", CK_x86_64)
2388 .Case("geode", CK_Geode)
2389 .Default(CK_Generic);
2390
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002391 // Perform any per-CPU checks necessary to determine if this CPU is
2392 // acceptable.
2393 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2394 // invalid without explaining *why*.
2395 switch (CPU) {
2396 case CK_Generic:
2397 // No processor selected!
2398 return false;
2399
2400 case CK_i386:
2401 case CK_i486:
2402 case CK_WinChipC6:
2403 case CK_WinChip2:
2404 case CK_C3:
2405 case CK_i586:
2406 case CK_Pentium:
2407 case CK_PentiumMMX:
2408 case CK_i686:
2409 case CK_PentiumPro:
2410 case CK_Pentium2:
2411 case CK_Pentium3:
2412 case CK_Pentium3M:
2413 case CK_PentiumM:
2414 case CK_Yonah:
2415 case CK_C3_2:
2416 case CK_Pentium4:
2417 case CK_Pentium4M:
2418 case CK_Prescott:
2419 case CK_K6:
2420 case CK_K6_2:
2421 case CK_K6_3:
2422 case CK_Athlon:
2423 case CK_AthlonThunderbird:
2424 case CK_Athlon4:
2425 case CK_AthlonXP:
2426 case CK_AthlonMP:
2427 case CK_Geode:
2428 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002429 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002430 return false;
2431
2432 // Fallthrough
2433 case CK_Nocona:
2434 case CK_Core2:
2435 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002436 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002437 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002438 case CK_Nehalem:
2439 case CK_Westmere:
2440 case CK_SandyBridge:
2441 case CK_IvyBridge:
2442 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002443 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002444 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002445 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002446 case CK_Athlon64:
2447 case CK_Athlon64SSE3:
2448 case CK_AthlonFX:
2449 case CK_K8:
2450 case CK_K8SSE3:
2451 case CK_Opteron:
2452 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002453 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002454 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002455 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002456 case CK_BDVER1:
2457 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002458 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002459 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002460 case CK_x86_64:
2461 return true;
2462 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002463 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002464 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002465
Craig Topper3164f332014-03-11 03:39:26 +00002466 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002467
Craig Topper3164f332014-03-11 03:39:26 +00002468 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002469 // We accept all non-ARM calling conventions
2470 return (CC == CC_X86ThisCall ||
2471 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002472 CC == CC_X86StdCall ||
2473 CC == CC_X86VectorCall ||
2474 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002475 CC == CC_X86Pascal ||
2476 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002477 }
2478
Craig Topper3164f332014-03-11 03:39:26 +00002479 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002480 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002481 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002482
2483 bool hasSjLjLowering() const override {
2484 return true;
2485 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002486};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002487
Rafael Espindolaeb265472013-08-21 21:59:03 +00002488bool X86TargetInfo::setFPMath(StringRef Name) {
2489 if (Name == "387") {
2490 FPMath = FP_387;
2491 return true;
2492 }
2493 if (Name == "sse") {
2494 FPMath = FP_SSE;
2495 return true;
2496 }
2497 return false;
2498}
2499
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002500void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002501 // FIXME: This *really* should not be here.
2502
2503 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002504 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002505 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002506
Chandler Carruth212334f2011-09-28 08:55:37 +00002507 switch (CPU) {
2508 case CK_Generic:
2509 case CK_i386:
2510 case CK_i486:
2511 case CK_i586:
2512 case CK_Pentium:
2513 case CK_i686:
2514 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002515 break;
2516 case CK_PentiumMMX:
2517 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002518 case CK_K6:
2519 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002520 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002521 break;
2522 case CK_Pentium3:
2523 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002524 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002525 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002526 break;
2527 case CK_PentiumM:
2528 case CK_Pentium4:
2529 case CK_Pentium4M:
2530 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002531 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002532 break;
2533 case CK_Yonah:
2534 case CK_Prescott:
2535 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002536 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002537 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002538 break;
2539 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002540 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002541 setFeatureEnabledImpl(Features, "ssse3", 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_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002545 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002546 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002547 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002548 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002549 setFeatureEnabledImpl(Features, "avx512f", true);
2550 setFeatureEnabledImpl(Features, "avx512cd", true);
2551 setFeatureEnabledImpl(Features, "avx512dq", true);
2552 setFeatureEnabledImpl(Features, "avx512bw", true);
2553 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002554 // FALLTHROUGH
2555 case CK_Broadwell:
2556 setFeatureEnabledImpl(Features, "rdseed", true);
2557 setFeatureEnabledImpl(Features, "adx", true);
2558 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002559 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002560 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002561 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002562 setFeatureEnabledImpl(Features, "bmi", true);
2563 setFeatureEnabledImpl(Features, "bmi2", true);
2564 setFeatureEnabledImpl(Features, "rtm", true);
2565 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002566 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002567 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002568 setFeatureEnabledImpl(Features, "rdrnd", true);
2569 setFeatureEnabledImpl(Features, "f16c", true);
2570 setFeatureEnabledImpl(Features, "fsgsbase", true);
2571 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002572 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002573 setFeatureEnabledImpl(Features, "avx", true);
2574 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002575 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002576 case CK_Silvermont:
2577 setFeatureEnabledImpl(Features, "aes", true);
2578 setFeatureEnabledImpl(Features, "pclmul", true);
2579 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002580 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002581 setFeatureEnabledImpl(Features, "sse4.2", true);
2582 setFeatureEnabledImpl(Features, "cx16", true);
2583 break;
2584 case CK_KNL:
2585 setFeatureEnabledImpl(Features, "avx512f", true);
2586 setFeatureEnabledImpl(Features, "avx512cd", true);
2587 setFeatureEnabledImpl(Features, "avx512er", true);
2588 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002589 setFeatureEnabledImpl(Features, "rdseed", true);
2590 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002591 setFeatureEnabledImpl(Features, "lzcnt", true);
2592 setFeatureEnabledImpl(Features, "bmi", true);
2593 setFeatureEnabledImpl(Features, "bmi2", true);
2594 setFeatureEnabledImpl(Features, "rtm", true);
2595 setFeatureEnabledImpl(Features, "fma", true);
2596 setFeatureEnabledImpl(Features, "rdrnd", true);
2597 setFeatureEnabledImpl(Features, "f16c", true);
2598 setFeatureEnabledImpl(Features, "fsgsbase", true);
2599 setFeatureEnabledImpl(Features, "aes", true);
2600 setFeatureEnabledImpl(Features, "pclmul", true);
2601 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002602 break;
2603 case CK_K6_2:
2604 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002605 case CK_WinChip2:
2606 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002607 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002608 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002609 case CK_Athlon:
2610 case CK_AthlonThunderbird:
2611 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002612 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002613 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002614 case CK_Athlon4:
2615 case CK_AthlonXP:
2616 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002617 setFeatureEnabledImpl(Features, "sse", true);
2618 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002619 break;
2620 case CK_K8:
2621 case CK_Opteron:
2622 case CK_Athlon64:
2623 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002624 setFeatureEnabledImpl(Features, "sse2", true);
2625 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002626 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002627 case CK_AMDFAM10:
2628 setFeatureEnabledImpl(Features, "sse4a", true);
2629 setFeatureEnabledImpl(Features, "lzcnt", true);
2630 setFeatureEnabledImpl(Features, "popcnt", true);
2631 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002632 case CK_K8SSE3:
2633 case CK_OpteronSSE3:
2634 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002635 setFeatureEnabledImpl(Features, "sse3", true);
2636 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002637 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002638 case CK_BTVER2:
2639 setFeatureEnabledImpl(Features, "avx", true);
2640 setFeatureEnabledImpl(Features, "aes", true);
2641 setFeatureEnabledImpl(Features, "pclmul", true);
2642 setFeatureEnabledImpl(Features, "bmi", true);
2643 setFeatureEnabledImpl(Features, "f16c", true);
2644 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002645 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002646 setFeatureEnabledImpl(Features, "ssse3", true);
2647 setFeatureEnabledImpl(Features, "sse4a", true);
2648 setFeatureEnabledImpl(Features, "lzcnt", true);
2649 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002650 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002651 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002652 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002653 case CK_BDVER4:
2654 setFeatureEnabledImpl(Features, "avx2", true);
2655 setFeatureEnabledImpl(Features, "bmi2", true);
2656 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002657 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002658 setFeatureEnabledImpl(Features, "fsgsbase", true);
2659 // FALLTHROUGH
2660 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002661 setFeatureEnabledImpl(Features, "bmi", true);
2662 setFeatureEnabledImpl(Features, "fma", true);
2663 setFeatureEnabledImpl(Features, "f16c", true);
2664 setFeatureEnabledImpl(Features, "tbm", true);
2665 // FALLTHROUGH
2666 case CK_BDVER1:
2667 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002668 setFeatureEnabledImpl(Features, "xop", true);
2669 setFeatureEnabledImpl(Features, "lzcnt", true);
2670 setFeatureEnabledImpl(Features, "aes", true);
2671 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002672 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002673 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002674 break;
Eli Friedman33465822011-07-08 23:31:17 +00002675 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002676}
2677
Rafael Espindolae62e2792013-08-20 13:44:29 +00002678void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002679 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002680 if (Enabled) {
2681 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002682 case AVX512F:
2683 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002684 case AVX2:
2685 Features["avx2"] = true;
2686 case AVX:
2687 Features["avx"] = true;
2688 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002689 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002690 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002691 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002692 case SSSE3:
2693 Features["ssse3"] = true;
2694 case SSE3:
2695 Features["sse3"] = true;
2696 case SSE2:
2697 Features["sse2"] = true;
2698 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002699 Features["sse"] = true;
2700 case NoSSE:
2701 break;
2702 }
2703 return;
2704 }
2705
2706 switch (Level) {
2707 case NoSSE:
2708 case SSE1:
2709 Features["sse"] = false;
2710 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002711 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2712 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002713 case SSE3:
2714 Features["sse3"] = false;
2715 setXOPLevel(Features, NoXOP, false);
2716 case SSSE3:
2717 Features["ssse3"] = false;
2718 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002719 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002720 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002721 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002722 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002723 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002724 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002725 case AVX2:
2726 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002727 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002728 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002729 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2730 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002731 }
2732}
2733
2734void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002735 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002736 if (Enabled) {
2737 switch (Level) {
2738 case AMD3DNowAthlon:
2739 Features["3dnowa"] = true;
2740 case AMD3DNow:
2741 Features["3dnow"] = true;
2742 case MMX:
2743 Features["mmx"] = true;
2744 case NoMMX3DNow:
2745 break;
2746 }
2747 return;
2748 }
2749
2750 switch (Level) {
2751 case NoMMX3DNow:
2752 case MMX:
2753 Features["mmx"] = false;
2754 case AMD3DNow:
2755 Features["3dnow"] = false;
2756 case AMD3DNowAthlon:
2757 Features["3dnowa"] = false;
2758 }
2759}
2760
2761void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002762 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002763 if (Enabled) {
2764 switch (Level) {
2765 case XOP:
2766 Features["xop"] = true;
2767 case FMA4:
2768 Features["fma4"] = true;
2769 setSSELevel(Features, AVX, true);
2770 case SSE4A:
2771 Features["sse4a"] = true;
2772 setSSELevel(Features, SSE3, true);
2773 case NoXOP:
2774 break;
2775 }
2776 return;
2777 }
2778
2779 switch (Level) {
2780 case NoXOP:
2781 case SSE4A:
2782 Features["sse4a"] = false;
2783 case FMA4:
2784 Features["fma4"] = false;
2785 case XOP:
2786 Features["xop"] = false;
2787 }
2788}
2789
Craig Topper86d79ef2013-09-17 04:51:29 +00002790void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2791 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002792 // This is a bit of a hack to deal with the sse4 target feature when used
2793 // as part of the target attribute. We handle sse4 correctly everywhere
2794 // else. See below for more information on how we handle the sse4 options.
2795 if (Name != "sse4")
2796 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002797
Craig Topper29561122013-09-19 01:13:07 +00002798 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002799 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002800 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002801 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002802 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002803 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002804 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002805 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002806 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002807 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002808 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002809 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002810 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002811 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002812 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002813 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002814 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002815 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002816 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002817 if (Enabled)
2818 setSSELevel(Features, SSE2, Enabled);
2819 } else if (Name == "pclmul") {
2820 if (Enabled)
2821 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002822 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002823 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002824 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002825 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002826 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002827 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002828 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2829 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002830 if (Enabled)
2831 setSSELevel(Features, AVX512F, Enabled);
2832 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002833 if (Enabled)
2834 setSSELevel(Features, AVX, Enabled);
2835 } else if (Name == "fma4") {
2836 setXOPLevel(Features, FMA4, Enabled);
2837 } else if (Name == "xop") {
2838 setXOPLevel(Features, XOP, Enabled);
2839 } else if (Name == "sse4a") {
2840 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002841 } else if (Name == "f16c") {
2842 if (Enabled)
2843 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002844 } else if (Name == "sha") {
2845 if (Enabled)
2846 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002847 } else if (Name == "sse4") {
2848 // We can get here via the __target__ attribute since that's not controlled
2849 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2850 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2851 // disabled.
2852 if (Enabled)
2853 setSSELevel(Features, SSE42, Enabled);
2854 else
2855 setSSELevel(Features, SSE41, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002856 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002857}
2858
Eric Christopher3ff21b32013-10-16 21:26:26 +00002859/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002860/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002861bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002862 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002863 // Remember the maximum enabled sselevel.
2864 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2865 // Ignore disabled features.
2866 if (Features[i][0] == '-')
2867 continue;
2868
Benjamin Kramer27402c62012-03-05 15:10:44 +00002869 StringRef Feature = StringRef(Features[i]).substr(1);
2870
2871 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002872 HasAES = true;
2873 continue;
2874 }
2875
Craig Topper3f122a72012-05-31 05:18:48 +00002876 if (Feature == "pclmul") {
2877 HasPCLMUL = true;
2878 continue;
2879 }
2880
Benjamin Kramer27402c62012-03-05 15:10:44 +00002881 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002882 HasLZCNT = true;
2883 continue;
2884 }
2885
Rafael Espindola89049822013-08-23 20:21:37 +00002886 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002887 HasRDRND = true;
2888 continue;
2889 }
2890
Craig Topper8c7f2512014-11-03 06:51:41 +00002891 if (Feature == "fsgsbase") {
2892 HasFSGSBASE = true;
2893 continue;
2894 }
2895
Benjamin Kramer27402c62012-03-05 15:10:44 +00002896 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002897 HasBMI = true;
2898 continue;
2899 }
2900
Benjamin Kramer27402c62012-03-05 15:10:44 +00002901 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002902 HasBMI2 = true;
2903 continue;
2904 }
2905
Benjamin Kramer27402c62012-03-05 15:10:44 +00002906 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002907 HasPOPCNT = true;
2908 continue;
2909 }
2910
Michael Liao625a8752012-11-10 05:17:46 +00002911 if (Feature == "rtm") {
2912 HasRTM = true;
2913 continue;
2914 }
2915
Michael Liao74f4eaf2013-03-26 17:52:08 +00002916 if (Feature == "prfchw") {
2917 HasPRFCHW = true;
2918 continue;
2919 }
2920
Michael Liaoffaae352013-03-29 05:17:55 +00002921 if (Feature == "rdseed") {
2922 HasRDSEED = true;
2923 continue;
2924 }
2925
Robert Khasanov50e6f582014-09-19 09:53:48 +00002926 if (Feature == "adx") {
2927 HasADX = true;
2928 continue;
2929 }
2930
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002931 if (Feature == "tbm") {
2932 HasTBM = true;
2933 continue;
2934 }
2935
Craig Topperbba778b2012-06-03 21:46:30 +00002936 if (Feature == "fma") {
2937 HasFMA = true;
2938 continue;
2939 }
2940
Manman Rena45358c2012-10-11 00:59:55 +00002941 if (Feature == "f16c") {
2942 HasF16C = true;
2943 continue;
2944 }
2945
Craig Topper679b53a2013-08-21 05:29:10 +00002946 if (Feature == "avx512cd") {
2947 HasAVX512CD = true;
2948 continue;
2949 }
2950
2951 if (Feature == "avx512er") {
2952 HasAVX512ER = true;
2953 continue;
2954 }
2955
2956 if (Feature == "avx512pf") {
2957 HasAVX512PF = true;
2958 continue;
2959 }
2960
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002961 if (Feature == "avx512dq") {
2962 HasAVX512DQ = true;
2963 continue;
2964 }
2965
2966 if (Feature == "avx512bw") {
2967 HasAVX512BW = true;
2968 continue;
2969 }
2970
2971 if (Feature == "avx512vl") {
2972 HasAVX512VL = true;
2973 continue;
2974 }
2975
Ben Langmuir58078d02013-09-19 13:22:04 +00002976 if (Feature == "sha") {
2977 HasSHA = true;
2978 continue;
2979 }
2980
Nick Lewycky50e8f482013-10-05 20:14:27 +00002981 if (Feature == "cx16") {
2982 HasCX16 = true;
2983 continue;
2984 }
2985
Daniel Dunbar979586e2009-11-11 09:38:56 +00002986 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002987 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002988 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002989 .Case("avx2", AVX2)
2990 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002991 .Case("sse4.2", SSE42)
2992 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002993 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002994 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002995 .Case("sse2", SSE2)
2996 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002997 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002998 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002999
Eli Friedman33465822011-07-08 23:31:17 +00003000 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003001 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00003002 .Case("3dnowa", AMD3DNowAthlon)
3003 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00003004 .Case("mmx", MMX)
3005 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003006 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003007
3008 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
3009 .Case("xop", XOP)
3010 .Case("fma4", FMA4)
3011 .Case("sse4a", SSE4A)
3012 .Default(NoXOP);
3013 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003014 }
Eli Friedman33465822011-07-08 23:31:17 +00003015
Craig Topper7481d8a2013-09-10 06:55:47 +00003016 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3017 // Can't do this earlier because we need to be able to explicitly enable
3018 // popcnt and still disable sse4.2.
3019 if (!HasPOPCNT && SSELevel >= SSE42 &&
3020 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
3021 HasPOPCNT = true;
3022 Features.push_back("+popcnt");
3023 }
3024
Yunzhong Gao61089362013-10-16 19:07:02 +00003025 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3026 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
3027 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
3028 HasPRFCHW = true;
3029 Features.push_back("+prfchw");
3030 }
3031
Rafael Espindolaeb265472013-08-21 21:59:03 +00003032 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3033 // matches the selected sse level.
3034 if (FPMath == FP_SSE && SSELevel < SSE1) {
3035 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
3036 return false;
3037 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
3038 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
3039 return false;
3040 }
3041
Eli Friedman33465822011-07-08 23:31:17 +00003042 // Don't tell the backend if we're turning off mmx; it will end up disabling
3043 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00003044 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3045 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00003046 std::vector<std::string>::iterator it;
3047 it = std::find(Features.begin(), Features.end(), "-mmx");
3048 if (it != Features.end())
3049 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00003050 else if (SSELevel > NoSSE)
3051 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Alexey Bataev00396512015-07-02 03:40:19 +00003052
3053 SimdDefaultAlign =
3054 (getABI() == "avx512") ? 512 : (getABI() == "avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003055 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003056}
Chris Lattnerecd49032009-03-02 22:27:17 +00003057
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003058/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3059/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003060void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003061 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003062 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003063 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003064 Builder.defineMacro("__amd64__");
3065 Builder.defineMacro("__amd64");
3066 Builder.defineMacro("__x86_64");
3067 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003068 if (getTriple().getArchName() == "x86_64h") {
3069 Builder.defineMacro("__x86_64h");
3070 Builder.defineMacro("__x86_64h__");
3071 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003072 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003073 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003074 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003075
Chris Lattnerecd49032009-03-02 22:27:17 +00003076 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003077 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3078 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003079 switch (CPU) {
3080 case CK_Generic:
3081 break;
3082 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003083 // The rest are coming from the i386 define above.
3084 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003085 break;
3086 case CK_i486:
3087 case CK_WinChipC6:
3088 case CK_WinChip2:
3089 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003090 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003091 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003092 case CK_PentiumMMX:
3093 Builder.defineMacro("__pentium_mmx__");
3094 Builder.defineMacro("__tune_pentium_mmx__");
3095 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003096 case CK_i586:
3097 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003098 defineCPUMacros(Builder, "i586");
3099 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003100 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003101 case CK_Pentium3:
3102 case CK_Pentium3M:
3103 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003104 Builder.defineMacro("__tune_pentium3__");
3105 // Fallthrough
3106 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003107 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003108 Builder.defineMacro("__tune_pentium2__");
3109 // Fallthrough
3110 case CK_PentiumPro:
3111 Builder.defineMacro("__tune_i686__");
3112 Builder.defineMacro("__tune_pentiumpro__");
3113 // Fallthrough
3114 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003115 Builder.defineMacro("__i686");
3116 Builder.defineMacro("__i686__");
3117 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3118 Builder.defineMacro("__pentiumpro");
3119 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003120 break;
3121 case CK_Pentium4:
3122 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003123 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003124 break;
3125 case CK_Yonah:
3126 case CK_Prescott:
3127 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003128 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003129 break;
3130 case CK_Core2:
3131 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003132 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003133 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003134 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003135 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003136 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003137 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003138 defineCPUMacros(Builder, "slm");
3139 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003140 case CK_Nehalem:
3141 case CK_Westmere:
3142 case CK_SandyBridge:
3143 case CK_IvyBridge:
3144 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003145 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003146 // FIXME: Historically, we defined this legacy name, it would be nice to
3147 // remove it at some point. We've never exposed fine-grained names for
3148 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003149 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003150 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003151 case CK_Skylake:
3152 // FIXME: Historically, we defined this legacy name, it would be nice to
3153 // remove it at some point. This is the only fine-grained CPU macro in the
3154 // main intel CPU line, and it would be better to not have these and force
3155 // people to use ISA macros.
3156 defineCPUMacros(Builder, "skx");
3157 break;
Craig Topper449314e2013-08-20 07:09:39 +00003158 case CK_KNL:
3159 defineCPUMacros(Builder, "knl");
3160 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003161 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003162 Builder.defineMacro("__k6_2__");
3163 Builder.defineMacro("__tune_k6_2__");
3164 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003165 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003166 if (CPU != CK_K6_2) { // In case of fallthrough
3167 // FIXME: GCC may be enabling these in cases where some other k6
3168 // architecture is specified but -m3dnow is explicitly provided. The
3169 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003170 Builder.defineMacro("__k6_3__");
3171 Builder.defineMacro("__tune_k6_3__");
3172 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003173 // Fallthrough
3174 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003175 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003176 break;
3177 case CK_Athlon:
3178 case CK_AthlonThunderbird:
3179 case CK_Athlon4:
3180 case CK_AthlonXP:
3181 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003182 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003183 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003184 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003185 Builder.defineMacro("__tune_athlon_sse__");
3186 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003187 break;
3188 case CK_K8:
3189 case CK_K8SSE3:
3190 case CK_x86_64:
3191 case CK_Opteron:
3192 case CK_OpteronSSE3:
3193 case CK_Athlon64:
3194 case CK_Athlon64SSE3:
3195 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003196 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003197 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003198 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003199 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003200 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003201 case CK_BTVER1:
3202 defineCPUMacros(Builder, "btver1");
3203 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003204 case CK_BTVER2:
3205 defineCPUMacros(Builder, "btver2");
3206 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003207 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003208 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003209 break;
3210 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003211 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003212 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003213 case CK_BDVER3:
3214 defineCPUMacros(Builder, "bdver3");
3215 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003216 case CK_BDVER4:
3217 defineCPUMacros(Builder, "bdver4");
3218 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003219 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003220 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003221 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003222 }
Chris Lattner96e43572009-03-02 22:40:39 +00003223
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003224 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003225 Builder.defineMacro("__REGISTER_PREFIX__", "");
3226
Chris Lattner6df41af2009-04-19 17:32:33 +00003227 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3228 // functions in glibc header files that use FP Stack inline asm which the
3229 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003230 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003231
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003232 if (HasAES)
3233 Builder.defineMacro("__AES__");
3234
Craig Topper3f122a72012-05-31 05:18:48 +00003235 if (HasPCLMUL)
3236 Builder.defineMacro("__PCLMUL__");
3237
Craig Topper22967d42011-12-25 05:06:45 +00003238 if (HasLZCNT)
3239 Builder.defineMacro("__LZCNT__");
3240
Benjamin Kramer1e250392012-07-07 09:39:18 +00003241 if (HasRDRND)
3242 Builder.defineMacro("__RDRND__");
3243
Craig Topper8c7f2512014-11-03 06:51:41 +00003244 if (HasFSGSBASE)
3245 Builder.defineMacro("__FSGSBASE__");
3246
Craig Topper22967d42011-12-25 05:06:45 +00003247 if (HasBMI)
3248 Builder.defineMacro("__BMI__");
3249
3250 if (HasBMI2)
3251 Builder.defineMacro("__BMI2__");
3252
Craig Topper1de83482011-12-29 16:10:46 +00003253 if (HasPOPCNT)
3254 Builder.defineMacro("__POPCNT__");
3255
Michael Liao625a8752012-11-10 05:17:46 +00003256 if (HasRTM)
3257 Builder.defineMacro("__RTM__");
3258
Michael Liao74f4eaf2013-03-26 17:52:08 +00003259 if (HasPRFCHW)
3260 Builder.defineMacro("__PRFCHW__");
3261
Michael Liaoffaae352013-03-29 05:17:55 +00003262 if (HasRDSEED)
3263 Builder.defineMacro("__RDSEED__");
3264
Robert Khasanov50e6f582014-09-19 09:53:48 +00003265 if (HasADX)
3266 Builder.defineMacro("__ADX__");
3267
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003268 if (HasTBM)
3269 Builder.defineMacro("__TBM__");
3270
Rafael Espindolae62e2792013-08-20 13:44:29 +00003271 switch (XOPLevel) {
3272 case XOP:
3273 Builder.defineMacro("__XOP__");
3274 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003275 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003276 case SSE4A:
3277 Builder.defineMacro("__SSE4A__");
3278 case NoXOP:
3279 break;
3280 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003281
Craig Topperbba778b2012-06-03 21:46:30 +00003282 if (HasFMA)
3283 Builder.defineMacro("__FMA__");
3284
Manman Rena45358c2012-10-11 00:59:55 +00003285 if (HasF16C)
3286 Builder.defineMacro("__F16C__");
3287
Craig Topper679b53a2013-08-21 05:29:10 +00003288 if (HasAVX512CD)
3289 Builder.defineMacro("__AVX512CD__");
3290 if (HasAVX512ER)
3291 Builder.defineMacro("__AVX512ER__");
3292 if (HasAVX512PF)
3293 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003294 if (HasAVX512DQ)
3295 Builder.defineMacro("__AVX512DQ__");
3296 if (HasAVX512BW)
3297 Builder.defineMacro("__AVX512BW__");
3298 if (HasAVX512VL)
3299 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003300
Ben Langmuir58078d02013-09-19 13:22:04 +00003301 if (HasSHA)
3302 Builder.defineMacro("__SHA__");
3303
Nick Lewycky50e8f482013-10-05 20:14:27 +00003304 if (HasCX16)
3305 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3306
Chris Lattner96e43572009-03-02 22:40:39 +00003307 // Each case falls through to the previous one here.
3308 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003309 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003310 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003311 case AVX2:
3312 Builder.defineMacro("__AVX2__");
3313 case AVX:
3314 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003315 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003316 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003317 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003318 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003319 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003320 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003321 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003322 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003323 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003324 Builder.defineMacro("__SSE2__");
3325 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003326 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003327 Builder.defineMacro("__SSE__");
3328 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003329 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003330 break;
3331 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003332
Derek Schuffc7dd7222012-10-11 15:52:22 +00003333 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003334 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003335 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003336 case AVX2:
3337 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003338 case SSE42:
3339 case SSE41:
3340 case SSSE3:
3341 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003342 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003343 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003344 break;
3345 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003346 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003347 break;
3348 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003349 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003350 }
3351 }
3352
Anders Carlssone437c682010-01-27 03:47:49 +00003353 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003354 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003355 case AMD3DNowAthlon:
3356 Builder.defineMacro("__3dNOW_A__");
3357 case AMD3DNow:
3358 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003359 case MMX:
3360 Builder.defineMacro("__MMX__");
3361 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003362 break;
3363 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003364
3365 if (CPU >= CK_i486) {
3366 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3367 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3368 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3369 }
3370 if (CPU >= CK_i586)
3371 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003372}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003373
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003374bool X86TargetInfo::hasFeature(StringRef Feature) const {
3375 return llvm::StringSwitch<bool>(Feature)
3376 .Case("aes", HasAES)
3377 .Case("avx", SSELevel >= AVX)
3378 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003379 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003380 .Case("avx512cd", HasAVX512CD)
3381 .Case("avx512er", HasAVX512ER)
3382 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003383 .Case("avx512dq", HasAVX512DQ)
3384 .Case("avx512bw", HasAVX512BW)
3385 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003386 .Case("bmi", HasBMI)
3387 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003388 .Case("cx16", HasCX16)
3389 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003390 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003391 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003392 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003393 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003394 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3395 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3396 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003397 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003398 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003399 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003400 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003401 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003402 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003403 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003404 .Case("sse", SSELevel >= SSE1)
3405 .Case("sse2", SSELevel >= SSE2)
3406 .Case("sse3", SSELevel >= SSE3)
3407 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003408 .Case("sse4.1", SSELevel >= SSE41)
3409 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003410 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003411 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003412 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003413 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3414 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003415 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003416 .Default(false);
3417}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003418
Eric Christopherd9832702015-06-29 21:00:05 +00003419// We can't use a generic validation scheme for the features accepted here
3420// versus subtarget features accepted in the target attribute because the
3421// bitfield structure that's initialized in the runtime only supports the
3422// below currently rather than the full range of subtarget features. (See
3423// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3424bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3425 return llvm::StringSwitch<bool>(FeatureStr)
3426 .Case("cmov", true)
3427 .Case("mmx", true)
3428 .Case("popcnt", true)
3429 .Case("sse", true)
3430 .Case("sse2", true)
3431 .Case("sse3", true)
3432 .Case("sse4.1", true)
3433 .Case("sse4.2", true)
3434 .Case("avx", true)
3435 .Case("avx2", true)
3436 .Case("sse4a", true)
3437 .Case("fma4", true)
3438 .Case("xop", true)
3439 .Case("fma", true)
3440 .Case("avx512f", true)
3441 .Case("bmi", true)
3442 .Case("bmi2", true)
3443 .Default(false);
3444}
3445
Eli Friedman3fd920a2008-08-20 02:34:37 +00003446bool
Anders Carlsson58436352009-02-28 17:11:49 +00003447X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003448 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003449 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003450 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003451 // Constant constraints.
3452 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3453 // instructions.
3454 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3455 // x86_64 instructions.
3456 case 's':
3457 Info.setRequiresImmediate();
3458 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003459 case 'I':
3460 Info.setRequiresImmediate(0, 31);
3461 return true;
3462 case 'J':
3463 Info.setRequiresImmediate(0, 63);
3464 return true;
3465 case 'K':
3466 Info.setRequiresImmediate(-128, 127);
3467 return true;
3468 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003469 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003470 return true;
3471 case 'M':
3472 Info.setRequiresImmediate(0, 3);
3473 return true;
3474 case 'N':
3475 Info.setRequiresImmediate(0, 255);
3476 return true;
3477 case 'O':
3478 Info.setRequiresImmediate(0, 127);
3479 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003480 // Register constraints.
3481 case 'Y': // 'Y' is the first character for several 2-character constraints.
3482 // Shift the pointer to the second character of the constraint.
3483 Name++;
3484 switch (*Name) {
3485 default:
3486 return false;
3487 case '0': // First SSE register.
3488 case 't': // Any SSE register, when SSE2 is enabled.
3489 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3490 case 'm': // Any MMX register, when inter-unit moves enabled.
3491 Info.setAllowsRegister();
3492 return true;
3493 }
3494 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003495 // Constraint 'f' cannot be used for output operands.
3496 if (Info.ConstraintStr[0] == '=')
3497 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003498 Info.setAllowsRegister();
3499 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003500 case 'a': // eax.
3501 case 'b': // ebx.
3502 case 'c': // ecx.
3503 case 'd': // edx.
3504 case 'S': // esi.
3505 case 'D': // edi.
3506 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003507 case 't': // Top of floating point stack.
3508 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003509 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003510 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003511 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003512 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003513 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3514 case 'l': // "Index" registers: any general register that can be used as an
3515 // index in a base+index memory access.
3516 Info.setAllowsRegister();
3517 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003518 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003519 case 'C': // SSE floating point constant.
3520 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003521 return true;
3522 }
3523}
3524
Akira Hatanaka974131e2014-09-18 18:17:18 +00003525bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3526 unsigned Size) const {
3527 // Strip off constraint modifiers.
3528 while (Constraint[0] == '=' ||
3529 Constraint[0] == '+' ||
3530 Constraint[0] == '&')
3531 Constraint = Constraint.substr(1);
3532
3533 return validateOperandSize(Constraint, Size);
3534}
3535
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003536bool X86TargetInfo::validateInputSize(StringRef Constraint,
3537 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003538 return validateOperandSize(Constraint, Size);
3539}
3540
3541bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3542 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003543 switch (Constraint[0]) {
3544 default: break;
3545 case 'y':
3546 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003547 case 'f':
3548 case 't':
3549 case 'u':
3550 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003551 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003552 if (SSELevel >= AVX512F)
3553 // 512-bit zmm registers can be used if target supports AVX512F.
3554 return Size <= 512U;
3555 else if (SSELevel >= AVX)
3556 // 256-bit ymm registers can be used if target supports AVX.
3557 return Size <= 256U;
3558 return Size <= 128U;
3559 case 'Y':
3560 // 'Y' is the first character for several 2-character constraints.
3561 switch (Constraint[1]) {
3562 default: break;
3563 case 'm':
3564 // 'Ym' is synonymous with 'y'.
3565 return Size <= 64;
3566 case 'i':
3567 case 't':
3568 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3569 if (SSELevel >= AVX512F)
3570 return Size <= 512U;
3571 else if (SSELevel >= AVX)
3572 return Size <= 256U;
3573 return SSELevel >= SSE2 && Size <= 128U;
3574 }
3575
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003576 }
3577
3578 return true;
3579}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003580
Eli Friedman3fd920a2008-08-20 02:34:37 +00003581std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003582X86TargetInfo::convertConstraint(const char *&Constraint) const {
3583 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003584 case 'a': return std::string("{ax}");
3585 case 'b': return std::string("{bx}");
3586 case 'c': return std::string("{cx}");
3587 case 'd': return std::string("{dx}");
3588 case 'S': return std::string("{si}");
3589 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003590 case 'p': // address
3591 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003592 case 't': // top of floating point stack.
3593 return std::string("{st}");
3594 case 'u': // second from top of floating point stack.
3595 return std::string("{st(1)}"); // second from top of floating point stack.
3596 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003597 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003598 }
3599}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003600
Eli Friedman3fd920a2008-08-20 02:34:37 +00003601// X86-32 generic target
3602class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003603public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003604 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003605 DoubleAlign = LongLongAlign = 32;
3606 LongDoubleWidth = 96;
3607 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003608 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003609 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003610 SizeType = UnsignedInt;
3611 PtrDiffType = SignedInt;
3612 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003613 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003614
3615 // Use fpret for all types.
3616 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3617 (1 << TargetInfo::Double) |
3618 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003619
3620 // x86-32 has atomics up to 8 bytes
3621 // FIXME: Check that we actually have cmpxchg8b before setting
3622 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3623 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003624 }
Craig Topper3164f332014-03-11 03:39:26 +00003625 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003626 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003627 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003628
Craig Topper3164f332014-03-11 03:39:26 +00003629 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003630 if (RegNo == 0) return 0;
3631 if (RegNo == 1) return 2;
3632 return -1;
3633 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003634 bool validateOperandSize(StringRef Constraint,
3635 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003636 switch (Constraint[0]) {
3637 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003638 case 'R':
3639 case 'q':
3640 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003641 case 'a':
3642 case 'b':
3643 case 'c':
3644 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003645 case 'S':
3646 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003647 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003648 case 'A':
3649 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003650 }
3651
Akira Hatanaka974131e2014-09-18 18:17:18 +00003652 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003653 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003654};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003655
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003656class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3657public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003658 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3659 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003660
Craig Topper3164f332014-03-11 03:39:26 +00003661 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003662 unsigned Major, Minor, Micro;
3663 getTriple().getOSVersion(Major, Minor, Micro);
3664 // New NetBSD uses the default rounding mode.
3665 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3666 return X86_32TargetInfo::getFloatEvalMethod();
3667 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003668 return 1;
3669 }
3670};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003671
Eli Friedmane3aa4542009-07-05 18:47:56 +00003672class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3673public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003674 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3675 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003676 SizeType = UnsignedLong;
3677 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003678 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003679 }
3680};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003681
Eli Friedman9fa28852012-08-08 23:57:20 +00003682class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3683public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003684 BitrigI386TargetInfo(const llvm::Triple &Triple)
3685 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003686 SizeType = UnsignedLong;
3687 IntPtrType = SignedLong;
3688 PtrDiffType = SignedLong;
3689 }
3690};
Eli Friedman9fa28852012-08-08 23:57:20 +00003691
Torok Edwinb2b37c62009-06-30 17:10:35 +00003692class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003693public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003694 DarwinI386TargetInfo(const llvm::Triple &Triple)
3695 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003696 LongDoubleWidth = 128;
3697 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003698 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003699 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003700 SizeType = UnsignedLong;
3701 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003702 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003703 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003704 }
3705
Eli Friedman3fd920a2008-08-20 02:34:37 +00003706};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003707
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003708// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003709class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003710public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003711 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3712 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003713 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003714 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003715 bool IsWinCOFF =
3716 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003717 DataLayoutString = IsWinCOFF
3718 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3719 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003720 }
Craig Topper3164f332014-03-11 03:39:26 +00003721 void getTargetDefines(const LangOptions &Opts,
3722 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003723 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3724 }
3725};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003726
3727// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003728class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003729public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003730 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003731 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003732 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003733 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3734 }
Craig Topper3164f332014-03-11 03:39:26 +00003735 void getTargetDefines(const LangOptions &Opts,
3736 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003737 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3738 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3739 // The value of the following reflects processor type.
3740 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3741 // We lost the original triple, so we use the default.
3742 Builder.defineMacro("_M_IX86", "600");
3743 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003744};
3745} // end anonymous namespace
3746
David Majnemerae1ed0e2015-05-28 04:36:18 +00003747static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3748 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang supports
Reid Kleckner47606832014-04-21 20:58:00 +00003749 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3750 // macro anyway for pre-processor compatibility.
3751 if (Opts.MicrosoftExt)
3752 Builder.defineMacro("__declspec", "__declspec");
3753 else
3754 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3755
3756 if (!Opts.MicrosoftExt) {
3757 // Provide macros for all the calling convention keywords. Provide both
3758 // single and double underscore prefixed variants. These are available on
3759 // x64 as well as x86, even though they have no effect.
3760 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3761 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003762 std::string GCCSpelling = "__attribute__((__";
3763 GCCSpelling += CC;
3764 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003765 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3766 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3767 }
3768 }
3769}
3770
David Majnemerae1ed0e2015-05-28 04:36:18 +00003771static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3772 Builder.defineMacro("__MSVCRT__");
3773 Builder.defineMacro("__MINGW32__");
3774 addCygMingDefines(Opts, Builder);
3775}
3776
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003777namespace {
3778// x86-32 MinGW target
3779class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3780public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003781 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3782 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003783 void getTargetDefines(const LangOptions &Opts,
3784 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003785 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003786 DefineStd(Builder, "WIN32", Opts);
3787 DefineStd(Builder, "WINNT", Opts);
3788 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003789 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003790 }
3791};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003792
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003793// x86-32 Cygwin target
3794class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3795public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003796 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3797 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003798 TLSSupported = false;
3799 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003800 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003801 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 +00003802 }
Craig Topper3164f332014-03-11 03:39:26 +00003803 void getTargetDefines(const LangOptions &Opts,
3804 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003805 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003806 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003807 Builder.defineMacro("__CYGWIN__");
3808 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003809 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003810 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003811 if (Opts.CPlusPlus)
3812 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003813 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003814};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003815
Chris Lattnerb986aba2010-04-11 19:29:39 +00003816// x86-32 Haiku target
3817class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3818public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003819 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003820 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003821 IntPtrType = SignedLong;
3822 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003823 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003824 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003825 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003826 }
Craig Topper3164f332014-03-11 03:39:26 +00003827 void getTargetDefines(const LangOptions &Opts,
3828 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003829 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3830 Builder.defineMacro("__INTEL__");
3831 Builder.defineMacro("__HAIKU__");
3832 }
3833};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003834
Douglas Gregor9fabd852011-07-01 22:41:14 +00003835// RTEMS Target
3836template<typename Target>
3837class RTEMSTargetInfo : public OSTargetInfo<Target> {
3838protected:
Craig Topper3164f332014-03-11 03:39:26 +00003839 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3840 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003841 // RTEMS defines; list based off of gcc output
3842
Douglas Gregor9fabd852011-07-01 22:41:14 +00003843 Builder.defineMacro("__rtems__");
3844 Builder.defineMacro("__ELF__");
3845 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003846
Douglas Gregor9fabd852011-07-01 22:41:14 +00003847public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003848 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3849 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003850
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003851 switch (Triple.getArch()) {
3852 default:
3853 case llvm::Triple::x86:
3854 // this->MCountName = ".mcount";
3855 break;
3856 case llvm::Triple::mips:
3857 case llvm::Triple::mipsel:
3858 case llvm::Triple::ppc:
3859 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003860 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003861 // this->MCountName = "_mcount";
3862 break;
3863 case llvm::Triple::arm:
3864 // this->MCountName = "__mcount";
3865 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003866 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003867 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003868};
3869
Douglas Gregor9fabd852011-07-01 22:41:14 +00003870// x86-32 RTEMS target
3871class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3872public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003873 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003874 SizeType = UnsignedLong;
3875 IntPtrType = SignedLong;
3876 PtrDiffType = SignedLong;
3877 this->UserLabelPrefix = "";
3878 }
Craig Topper3164f332014-03-11 03:39:26 +00003879 void getTargetDefines(const LangOptions &Opts,
3880 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003881 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3882 Builder.defineMacro("__INTEL__");
3883 Builder.defineMacro("__rtems__");
3884 }
3885};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003886
Eli Friedman3fd920a2008-08-20 02:34:37 +00003887// x86-64 generic target
3888class X86_64TargetInfo : public X86TargetInfo {
3889public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003890 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003891 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003892 bool IsWinCOFF =
3893 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003894 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003895 LongDoubleWidth = 128;
3896 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003897 LargeArrayMinWidth = 128;
3898 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003899 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003900 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3901 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3902 IntPtrType = IsX32 ? SignedInt : SignedLong;
3903 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003904 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003905 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003906
Eric Christopher917e9522014-11-18 22:36:15 +00003907 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003908 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3909 : IsWinCOFF
3910 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3911 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003912
3913 // Use fpret only for long double.
3914 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003915
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003916 // Use fp2ret for _Complex long double.
3917 ComplexLongDoubleUsesFP2Ret = true;
3918
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003919 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003920 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003921 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003922 }
Craig Topper3164f332014-03-11 03:39:26 +00003923 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003924 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003925 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003926
Craig Topper3164f332014-03-11 03:39:26 +00003927 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003928 if (RegNo == 0) return 0;
3929 if (RegNo == 1) return 1;
3930 return -1;
3931 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003932
Craig Topper3164f332014-03-11 03:39:26 +00003933 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003934 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003935 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003936 CC == CC_IntelOclBicc ||
3937 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003938 }
3939
Craig Topper3164f332014-03-11 03:39:26 +00003940 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003941 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003942 }
3943
Pavel Chupinfd223e12014-08-04 12:39:43 +00003944 // for x32 we need it here explicitly
3945 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003946};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003947
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003948// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003949class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003950public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003951 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3952 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003953 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003954 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003955 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003956 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003957 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003958 SizeType = UnsignedLongLong;
3959 PtrDiffType = SignedLongLong;
3960 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003961 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003962 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003963
Craig Topper3164f332014-03-11 03:39:26 +00003964 void getTargetDefines(const LangOptions &Opts,
3965 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003966 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003967 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003968 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003969
Craig Topper3164f332014-03-11 03:39:26 +00003970 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003971 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003972 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003973
Craig Topper3164f332014-03-11 03:39:26 +00003974 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003975 switch (CC) {
3976 case CC_X86StdCall:
3977 case CC_X86ThisCall:
3978 case CC_X86FastCall:
3979 return CCCR_Ignore;
3980 case CC_C:
3981 case CC_X86VectorCall:
3982 case CC_IntelOclBicc:
3983 case CC_X86_64SysV:
3984 return CCCR_OK;
3985 default:
3986 return CCCR_Warning;
3987 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003988 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003989};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003990
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003991// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003992class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003993public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003994 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003995 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003996 LongDoubleWidth = LongDoubleAlign = 64;
3997 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003998 }
Craig Topper3164f332014-03-11 03:39:26 +00003999 void getTargetDefines(const LangOptions &Opts,
4000 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004001 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4002 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004003 Builder.defineMacro("_M_X64", "100");
4004 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004005 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004006};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004007
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004008// x86-64 MinGW target
4009class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4010public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004011 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
4012 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00004013 void getTargetDefines(const LangOptions &Opts,
4014 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004015 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004016 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004017 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004018 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004019
4020 // GCC defines this macro when it is using __gxx_personality_seh0.
4021 if (!Opts.SjLjExceptions)
4022 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004023 }
4024};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004025
Yaron Kerend030d112015-07-22 17:38:19 +00004026// x86-64 Cygwin target
4027class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4028public:
4029 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4030 : X86_64TargetInfo(Triple) {
4031 TLSSupported = false;
4032 WCharType = UnsignedShort;
4033 }
4034 void getTargetDefines(const LangOptions &Opts,
4035 MacroBuilder &Builder) const override {
4036 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4037 Builder.defineMacro("__x86_64__");
4038 Builder.defineMacro("__CYGWIN__");
4039 Builder.defineMacro("__CYGWIN64__");
4040 addCygMingDefines(Opts, Builder);
4041 DefineStd(Builder, "unix", Opts);
4042 if (Opts.CPlusPlus)
4043 Builder.defineMacro("_GNU_SOURCE");
4044
4045 // GCC defines this macro when it is using __gxx_personality_seh0.
4046 if (!Opts.SjLjExceptions)
4047 Builder.defineMacro("__SEH__");
4048 }
4049};
4050
Eli Friedman2857ccb2009-07-01 03:36:11 +00004051class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4052public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004053 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4054 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004055 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00004056 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00004057 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4058 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004059 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004060 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004061 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004062 }
4063};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004064
Eli Friedman245f2292009-07-05 22:31:18 +00004065class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4066public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004067 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4068 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004069 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004070 Int64Type = SignedLongLong;
4071 }
4072};
Eli Friedman245f2292009-07-05 22:31:18 +00004073
Eli Friedman9fa28852012-08-08 23:57:20 +00004074class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4075public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004076 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4077 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4078 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004079 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004080 }
4081};
Tim Northover9bb857a2013-01-31 12:13:10 +00004082
Eli Friedmanf05b7722008-08-20 07:44:10 +00004083class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004084 // Possible FPU choices.
4085 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004086 VFP2FPU = (1 << 0),
4087 VFP3FPU = (1 << 1),
4088 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004089 NeonFPU = (1 << 3),
4090 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004091 };
4092
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004093 // Possible HWDiv features.
4094 enum HWDivMode {
4095 HWDivThumb = (1 << 0),
4096 HWDivARM = (1 << 1)
4097 };
4098
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004099 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004100 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004101 }
4102
4103 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4104 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004105
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004106 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004107
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004108 StringRef DefaultCPU;
4109 StringRef CPUProfile;
4110 StringRef CPUAttr;
4111
Rafael Espindolaeb265472013-08-21 21:59:03 +00004112 enum {
4113 FP_Default,
4114 FP_VFP,
4115 FP_Neon
4116 } FPMath;
4117
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004118 unsigned ArchISA;
4119 unsigned ArchKind;
4120 unsigned ArchProfile;
4121 unsigned ArchVersion;
4122
Bernard Ogdenda13af32013-10-24 18:32:51 +00004123 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004124
Logan Chien57086ce2012-10-10 06:56:20 +00004125 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004126 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004127
4128 // Initialized via features.
4129 unsigned SoftFloat : 1;
4130 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004131
Bernard Ogden18b57012013-10-29 09:47:51 +00004132 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004133 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00004134
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004135 // ACLE 6.5.1 Hardware floating point
4136 enum {
4137 HW_FP_HP = (1 << 1), /// half (16-bit)
4138 HW_FP_SP = (1 << 2), /// single (32-bit)
4139 HW_FP_DP = (1 << 3), /// double (64-bit)
4140 };
4141 uint32_t HW_FP;
4142
Chris Lattner5cc15e02010-03-03 19:03:45 +00004143 static const Builtin::Info BuiltinInfo[];
4144
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004145 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004146 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004147
4148 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004149 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004150
Renato Golin9ba39232015-02-27 16:35:48 +00004151 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4152 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4153 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004154 SizeType = UnsignedLong;
4155 else
4156 SizeType = UnsignedInt;
4157
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004158 switch (T.getOS()) {
4159 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004160 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004161 break;
4162 case llvm::Triple::Win32:
4163 WCharType = UnsignedShort;
4164 break;
4165 case llvm::Triple::Linux:
4166 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004167 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4168 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004169 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004170 }
4171
4172 UseBitFieldTypeAlignment = true;
4173
4174 ZeroLengthBitfieldBoundary = 0;
4175
Tim Northover147cd2f2014-10-14 22:12:21 +00004176 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4177 // so set preferred for small types to 32.
4178 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004179 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004180 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4181 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4182 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004183 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004184 DataLayoutString = "e"
4185 "-m:w"
4186 "-p:32:32"
4187 "-i64:64"
4188 "-v128:64:128"
4189 "-a:0:32"
4190 "-n32"
4191 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004192 } else if (T.isOSNaCl()) {
4193 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004194 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004195 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004196 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004197 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4198 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004199 }
4200
4201 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004202 }
4203
4204 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004205 const llvm::Triple &T = getTriple();
4206
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004207 IsAAPCS = false;
4208
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004209 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004210
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004211 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004212 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004213 SizeType = UnsignedInt;
4214 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004215 SizeType = UnsignedLong;
4216
4217 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4218 WCharType = SignedInt;
4219
4220 // Do not respect the alignment of bit-field types when laying out
4221 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4222 UseBitFieldTypeAlignment = false;
4223
4224 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4225 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4226 /// gcc.
4227 ZeroLengthBitfieldBoundary = 32;
4228
Tim Northover147cd2f2014-10-14 22:12:21 +00004229 if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004230 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004231 BigEndian
4232 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4233 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4234 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004235 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004236 BigEndian
4237 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4238 : "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 +00004239
4240 // FIXME: Override "preferred align" for double and long long.
4241 }
4242
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004243 void setArchInfo() {
4244 StringRef ArchName = getTriple().getArchName();
4245
4246 ArchISA = llvm::ARMTargetParser::parseArchISA(ArchName);
4247 DefaultCPU = getDefaultCPU(ArchName);
4248
4249 // SubArch is specified by the target triple
4250 if (!DefaultCPU.empty())
4251 setArchInfo(DefaultCPU);
4252 else
4253 // FIXME ArchInfo should be based on ArchName from triple, not on
4254 // a hard-coded CPU name. Doing so currently causes regressions:
4255 // test/Preprocessor/init.c: __ARM_ARCH_6J__ not defined
4256 setArchInfo(CPU);
4257 }
4258
4259 void setArchInfo(StringRef CPU) {
4260 StringRef SubArch;
4261
4262 // cache TargetParser info
4263 ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
4264 SubArch = llvm::ARMTargetParser::getSubArch(ArchKind);
4265 ArchProfile = llvm::ARMTargetParser::parseArchProfile(SubArch);
4266 ArchVersion = llvm::ARMTargetParser::parseArchVersion(SubArch);
4267
4268 // cache CPU related strings
4269 CPUAttr = getCPUAttr();
4270 CPUProfile = getCPUProfile();
4271 }
4272
4273 void setAtomic() {
4274 // when triple does not specify a sub arch,
4275 // then we are not using inline atomics
4276 bool ShouldUseInlineAtomic = DefaultCPU.empty() ?
4277 false :
4278 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4279 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
4280 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4281 if (ArchProfile == llvm::ARM::PK_M) {
4282 MaxAtomicPromoteWidth = 32;
4283 if (ShouldUseInlineAtomic)
4284 MaxAtomicInlineWidth = 32;
4285 }
4286 else {
4287 MaxAtomicPromoteWidth = 64;
4288 if (ShouldUseInlineAtomic)
4289 MaxAtomicInlineWidth = 64;
4290 }
4291 }
4292
4293 bool isThumb() const {
4294 return (ArchISA == llvm::ARM::IK_THUMB);
4295 }
4296
4297 bool supportsThumb() const {
4298 return CPUAttr.count('T') || ArchVersion >= 6;
4299 }
4300
4301 bool supportsThumb2() const {
4302 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4303 }
4304
4305 StringRef getDefaultCPU(StringRef ArchName) const {
4306 const char *DefaultCPU = llvm::ARMTargetParser::getDefaultCPU(ArchName);
4307 return DefaultCPU ? DefaultCPU : "";
4308 }
4309
4310 StringRef getCPUAttr() const {
4311 const char *CPUAttr;
4312 // For most sub-arches, the build attribute CPU name is enough.
4313 // For Cortex variants, it's slightly different.
4314 switch(ArchKind) {
4315 default:
4316 CPUAttr = llvm::ARMTargetParser::getCPUAttr(ArchKind);
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004317 return CPUAttr ? CPUAttr : "";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004318 case llvm::ARM::AK_ARMV6M:
4319 case llvm::ARM::AK_ARMV6SM:
4320 case llvm::ARM::AK_ARMV6HL:
4321 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004322 case llvm::ARM::AK_ARMV7S:
4323 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004324 case llvm::ARM::AK_ARMV7:
4325 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004326 case llvm::ARM::AK_ARMV7L:
4327 case llvm::ARM::AK_ARMV7HL:
4328 return "7A";
4329 case llvm::ARM::AK_ARMV7R:
4330 return "7R";
4331 case llvm::ARM::AK_ARMV7M:
4332 return "7M";
4333 case llvm::ARM::AK_ARMV7EM:
4334 return "7EM";
4335 case llvm::ARM::AK_ARMV8A:
4336 return "8A";
4337 case llvm::ARM::AK_ARMV8_1A:
4338 return "8_1A";
4339 }
4340 }
4341
4342 StringRef getCPUProfile() const {
4343 switch(ArchProfile) {
4344 case llvm::ARM::PK_A:
4345 return "A";
4346 case llvm::ARM::PK_R:
4347 return "R";
4348 case llvm::ARM::PK_M:
4349 return "M";
4350 default:
4351 return "";
4352 }
4353 }
4354
Chris Lattner17df24e2008-04-21 18:56:49 +00004355public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004356 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004357 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004358 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004359 BigEndian = IsBigEndian;
4360
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004361 switch (getTriple().getOS()) {
4362 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004363 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004364 break;
4365 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004366 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004367 break;
4368 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004369
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004370 // cache arch related info
4371 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004372
Chris Lattner1a8f3942010-04-23 16:29:58 +00004373 // {} in inline assembly are neon specifiers, not assembly variant
4374 // specifiers.
4375 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004376
Eric Christopher0e261882014-12-05 01:06:59 +00004377 // FIXME: This duplicates code from the driver that sets the -target-abi
4378 // option - this code is used if -target-abi isn't passed and should
4379 // be unified in some way.
4380 if (Triple.isOSBinFormatMachO()) {
4381 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4382 // the frontend matches that.
4383 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4384 Triple.getOS() == llvm::Triple::UnknownOS ||
4385 StringRef(CPU).startswith("cortex-m")) {
4386 setABI("aapcs");
4387 } else {
4388 setABI("apcs-gnu");
4389 }
4390 } else if (Triple.isOSWindows()) {
4391 // FIXME: this is invalid for WindowsCE
4392 setABI("aapcs");
4393 } else {
4394 // Select the default based on the platform.
4395 switch (Triple.getEnvironment()) {
4396 case llvm::Triple::Android:
4397 case llvm::Triple::GNUEABI:
4398 case llvm::Triple::GNUEABIHF:
4399 setABI("aapcs-linux");
4400 break;
4401 case llvm::Triple::EABIHF:
4402 case llvm::Triple::EABI:
4403 setABI("aapcs");
4404 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004405 case llvm::Triple::GNU:
4406 setABI("apcs-gnu");
4407 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004408 default:
4409 if (Triple.getOS() == llvm::Triple::NetBSD)
4410 setABI("apcs-gnu");
4411 else
4412 setABI("aapcs");
4413 break;
4414 }
4415 }
John McCall86353412010-08-21 22:46:04 +00004416
4417 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004418 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004419
Renato Golin15b86152015-07-03 16:41:13 +00004420 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004421 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004422
James Molloya7139222012-03-12 09:14:10 +00004423 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004424 // the alignment of the zero-length bitfield is greater than the member
4425 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004426 // zero length bitfield.
4427 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004428 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004429
Alp Toker4925ba72014-06-07 23:30:42 +00004430 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004431
Craig Topper3164f332014-03-11 03:39:26 +00004432 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004433 ABI = Name;
4434
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004435 // The defaults (above) are for AAPCS, check if we need to change them.
4436 //
4437 // FIXME: We need support for -meabi... we could just mangle it into the
4438 // name.
4439 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004440 setABIAPCS();
4441 return true;
4442 }
4443 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4444 setABIAAPCS();
4445 return true;
4446 }
4447 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004448 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004449
Renato Golinf5c4dec2015-05-27 13:33:00 +00004450 // FIXME: This should be based on Arch attributes, not CPU names.
Craig Topper3164f332014-03-11 03:39:26 +00004451 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004452 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4453 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004454 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004455 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004456 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004457 }
4458 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004459 Features["vfp4"] = true;
4460 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004461 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4462 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004463 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004464 Features["vfp4"] = true;
4465 Features["neon"] = true;
4466 Features["hwdiv"] = true;
4467 Features["hwdiv-arm"] = true;
Tim Northoverf9b517c2015-05-01 21:17:25 +00004468 } else if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
4469 CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004470 Features["fp-armv8"] = true;
4471 Features["neon"] = true;
4472 Features["hwdiv"] = true;
4473 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004474 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004475 Features["crypto"] = true;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004476 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" || ArchVersion == 8) {
Silviu Barangae5690462013-10-21 10:59:33 +00004477 Features["hwdiv"] = true;
4478 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004479 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
Javed Absar879d18b82015-04-09 14:12:10 +00004480 CPU == "sc300" || CPU == "cortex-r4" || CPU == "cortex-r4f") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004481 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004482 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004483 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004484
Craig Topper3164f332014-03-11 03:39:26 +00004485 bool handleTargetFeatures(std::vector<std::string> &Features,
4486 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004487 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004488 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004489 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004490 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004491 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004492
Ranjeet Singhac08e532015-06-24 23:39:25 +00004493 // This does not diagnose illegal cases like having both
4494 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4495 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004496 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004497 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004498 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004499 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004500 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004501 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004502 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004503 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004504 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004505 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004506 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004507 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004508 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004509 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004510 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004511 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004512 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004513 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004514 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004515 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004516 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004517 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004518 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004519 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004520 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004521 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004522 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004523 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004524 } else if (Feature == "+fp-only-sp") {
Ranjeet Singhac08e532015-06-24 23:39:25 +00004525 HW_FP_remove |= HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004526 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004527 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004528 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004529
Rafael Espindolaeb265472013-08-21 21:59:03 +00004530 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4531 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4532 return false;
4533 }
4534
4535 if (FPMath == FP_Neon)
4536 Features.push_back("+neonfp");
4537 else if (FPMath == FP_VFP)
4538 Features.push_back("-neonfp");
4539
Daniel Dunbar893d4752009-12-19 04:15:38 +00004540 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004541 auto Feature =
4542 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4543 if (Feature != Features.end())
4544 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004545
Rafael Espindolaeb265472013-08-21 21:59:03 +00004546 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004547 }
4548
Craig Topper3164f332014-03-11 03:39:26 +00004549 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004550 return llvm::StringSwitch<bool>(Feature)
4551 .Case("arm", true)
4552 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004553 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004554 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004555 .Case("hwdiv", HWDiv & HWDivThumb)
4556 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004557 .Default(false);
4558 }
Renato Golin15b86152015-07-03 16:41:13 +00004559
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004560 bool setCPU(const std::string &Name) override {
Renato Golin15b86152015-07-03 16:41:13 +00004561 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(Name);
4562 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004563 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004564 setArchInfo(Name);
4565 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004566 CPU = Name;
4567 return true;
4568 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004569
Craig Topper3164f332014-03-11 03:39:26 +00004570 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004571
Craig Topper3164f332014-03-11 03:39:26 +00004572 void getTargetDefines(const LangOptions &Opts,
4573 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004574 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004575 Builder.defineMacro("__arm");
4576 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004577
Chris Lattnerecd49032009-03-02 22:27:17 +00004578 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004579 Builder.defineMacro("__REGISTER_PREFIX__", "");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004580 if (!CPUAttr.empty())
4581 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004582
4583 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004584 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004585 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004586 if (ArchVersion >= 8) {
Eric Christopher917e9522014-11-18 22:36:15 +00004587 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4588 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004589 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004590
4591 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4592 // is not defined for the M-profile.
4593 // NOTE that the deffault profile is assumed to be 'A'
4594 if (CPUProfile.empty() || CPUProfile != "M")
4595 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4596
4597 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4598 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4599 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004600 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004601 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004602 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004603 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4604
4605 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4606 // instruction set such as ARM or Thumb.
4607 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4608
4609 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4610
4611 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004612 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004613 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004614
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004615 // ACLE 6.5.1 Hardware Floating Point
4616 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004617 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004618
Yi Konga44c4d72014-06-27 21:25:42 +00004619 // ACLE predefines.
4620 Builder.defineMacro("__ARM_ACLE", "200");
4621
Mike Stump9d54bd72009-04-08 02:07:04 +00004622 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004623
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004624 // FIXME: It's more complicated than this and we don't really support
4625 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004626 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004627 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004628 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004629
David Tweed8f676532012-10-25 13:33:01 +00004630 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004631 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004632 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4633 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004634 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004635 Builder.defineMacro("__ARM_PCS", "1");
4636
David Tweed8f676532012-10-25 13:33:01 +00004637 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004638 Builder.defineMacro("__ARM_PCS_VFP", "1");
4639 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004640
Daniel Dunbar893d4752009-12-19 04:15:38 +00004641 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004642 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004643
4644 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004645 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004646
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004647 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004648 Builder.defineMacro("__THUMBEL__");
4649 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004650 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004651 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004652 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004653 if (((HWDiv & HWDivThumb) && isThumb()) || ((HWDiv & HWDivARM) && !isThumb()))
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004654 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004655
4656 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004657 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004658
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004659 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004660 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004661 if (FPU & VFP2FPU)
4662 Builder.defineMacro("__ARM_VFPV2__");
4663 if (FPU & VFP3FPU)
4664 Builder.defineMacro("__ARM_VFPV3__");
4665 if (FPU & VFP4FPU)
4666 Builder.defineMacro("__ARM_VFPV4__");
4667 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004668
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004669 // This only gets set when Neon instructions are actually available, unlike
4670 // the VFP define, hence the soft float and arch check. This is subtly
4671 // different from gcc, we follow the intent which was that it should be set
4672 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004673 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Tim Northover5bb34ca2013-11-21 12:36:34 +00004674 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004675 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004676 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004677
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004678 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4679 Opts.ShortWChar ? "2" : "4");
4680
4681 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4682 Opts.ShortEnums ? "1" : "4");
4683
Bernard Ogden18b57012013-10-29 09:47:51 +00004684 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004685 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004686
Tim Northover02e38602014-02-03 17:28:04 +00004687 if (Crypto)
4688 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4689
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004690 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004691 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4692 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4693 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4694 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4695 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004696
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004697 bool is5EOrAbove = (ArchVersion >= 6 ||
4698 (ArchVersion == 5 && CPUAttr.count('E')));
4699 // FIXME: We are not getting all 32-bit ARM architectures
4700 bool is32Bit = (!isThumb() || supportsThumb2());
4701 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUAttr == "7EM"))
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004702 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004703 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004704
Craig Topper3164f332014-03-11 03:39:26 +00004705 void getTargetBuiltins(const Builtin::Info *&Records,
4706 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004707 Records = BuiltinInfo;
4708 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004709 }
Craig Topper3164f332014-03-11 03:39:26 +00004710 bool isCLZForZeroUndef() const override { return false; }
4711 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004712 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004713 }
Craig Topper3164f332014-03-11 03:39:26 +00004714 void getGCCRegNames(const char * const *&Names,
4715 unsigned &NumNames) const override;
4716 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4717 unsigned &NumAliases) const override;
4718 bool validateAsmConstraint(const char *&Name,
4719 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004720 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004721 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004722 case 'l': // r0-r7
4723 case 'h': // r8-r15
4724 case 'w': // VFP Floating point register single precision
4725 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004726 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004727 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004728 case 'I':
4729 case 'J':
4730 case 'K':
4731 case 'L':
4732 case 'M':
4733 // FIXME
4734 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004735 case 'Q': // A memory address that is a single base register.
4736 Info.setAllowsMemory();
4737 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004738 case 'U': // a memory reference...
4739 switch (Name[1]) {
4740 case 'q': // ...ARMV4 ldrsb
4741 case 'v': // ...VFP load/store (reg+constant offset)
4742 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004743 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004744 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004745 case 'n': // valid address for Neon doubleword vector load/store
4746 case 'm': // valid address for Neon element and structure load/store
4747 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004748 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004749 Info.setAllowsMemory();
4750 Name++;
4751 return true;
4752 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004753 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004754 return false;
4755 }
Craig Topper3164f332014-03-11 03:39:26 +00004756 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004757 std::string R;
4758 switch (*Constraint) {
4759 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004760 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004761 Constraint++;
4762 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004763 case 'p': // 'p' should be translated to 'r' by default.
4764 R = std::string("r");
4765 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004766 default:
4767 return std::string(1, *Constraint);
4768 }
4769 return R;
4770 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004771 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004772 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004773 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004774 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004775 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004776
Bill Wendling9d1ee112012-10-25 23:28:48 +00004777 // Strip off constraint modifiers.
4778 while (Constraint[0] == '=' ||
4779 Constraint[0] == '+' ||
4780 Constraint[0] == '&')
4781 Constraint = Constraint.substr(1);
4782
4783 switch (Constraint[0]) {
4784 default: break;
4785 case 'r': {
4786 switch (Modifier) {
4787 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004788 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004789 case 'q':
4790 // A register of size 32 cannot fit a vector type.
4791 return false;
4792 }
4793 }
4794 }
4795
4796 return true;
4797 }
Craig Topper3164f332014-03-11 03:39:26 +00004798 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004799 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004800 return "";
4801 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004802
Craig Topper3164f332014-03-11 03:39:26 +00004803 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004804 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4805 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004806
Craig Topper3164f332014-03-11 03:39:26 +00004807 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004808 if (RegNo == 0) return 0;
4809 if (RegNo == 1) return 1;
4810 return -1;
4811 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004812
4813 bool hasSjLjLowering() const override {
4814 return true;
4815 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004816};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004817
Rafael Espindolaeb265472013-08-21 21:59:03 +00004818bool ARMTargetInfo::setFPMath(StringRef Name) {
4819 if (Name == "neon") {
4820 FPMath = FP_Neon;
4821 return true;
4822 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4823 Name == "vfp4") {
4824 FPMath = FP_VFP;
4825 return true;
4826 }
4827 return false;
4828}
4829
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004830const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004831 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004832 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004833 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4834
4835 // Float registers
4836 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4837 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4838 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004839 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004840
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004841 // Double registers
4842 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4843 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004844 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4845 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004846
4847 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004848 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4849 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004850};
4851
4852void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004853 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004854 Names = GCCRegNames;
4855 NumNames = llvm::array_lengthof(GCCRegNames);
4856}
4857
4858const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004859 { { "a1" }, "r0" },
4860 { { "a2" }, "r1" },
4861 { { "a3" }, "r2" },
4862 { { "a4" }, "r3" },
4863 { { "v1" }, "r4" },
4864 { { "v2" }, "r5" },
4865 { { "v3" }, "r6" },
4866 { { "v4" }, "r7" },
4867 { { "v5" }, "r8" },
4868 { { "v6", "rfp" }, "r9" },
4869 { { "sl" }, "r10" },
4870 { { "fp" }, "r11" },
4871 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004872 { { "r13" }, "sp" },
4873 { { "r14" }, "lr" },
4874 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004875 // The S, D and Q registers overlap, but aren't really aliases; we
4876 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004877};
4878
4879void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4880 unsigned &NumAliases) const {
4881 Aliases = GCCRegAliases;
4882 NumAliases = llvm::array_lengthof(GCCRegAliases);
4883}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004884
4885const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004886#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004887#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004888 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004889#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004890
4891#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004892#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004893#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4894 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004895#include "clang/Basic/BuiltinsARM.def"
4896};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004897
4898class ARMleTargetInfo : public ARMTargetInfo {
4899public:
4900 ARMleTargetInfo(const llvm::Triple &Triple)
4901 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004902 void getTargetDefines(const LangOptions &Opts,
4903 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004904 Builder.defineMacro("__ARMEL__");
4905 ARMTargetInfo::getTargetDefines(Opts, Builder);
4906 }
4907};
4908
4909class ARMbeTargetInfo : public ARMTargetInfo {
4910public:
4911 ARMbeTargetInfo(const llvm::Triple &Triple)
4912 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004913 void getTargetDefines(const LangOptions &Opts,
4914 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004915 Builder.defineMacro("__ARMEB__");
4916 Builder.defineMacro("__ARM_BIG_ENDIAN");
4917 ARMTargetInfo::getTargetDefines(Opts, Builder);
4918 }
4919};
Chris Lattner17df24e2008-04-21 18:56:49 +00004920
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004921class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4922 const llvm::Triple Triple;
4923public:
4924 WindowsARMTargetInfo(const llvm::Triple &Triple)
4925 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4926 TLSSupported = false;
4927 WCharType = UnsignedShort;
4928 SizeType = UnsignedInt;
4929 UserLabelPrefix = "";
4930 }
4931 void getVisualStudioDefines(const LangOptions &Opts,
4932 MacroBuilder &Builder) const {
4933 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4934
4935 // FIXME: this is invalid for WindowsCE
4936 Builder.defineMacro("_M_ARM_NT", "1");
4937 Builder.defineMacro("_M_ARMT", "_M_ARM");
4938 Builder.defineMacro("_M_THUMB", "_M_ARM");
4939
4940 assert((Triple.getArch() == llvm::Triple::arm ||
4941 Triple.getArch() == llvm::Triple::thumb) &&
4942 "invalid architecture for Windows ARM target info");
4943 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4944 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4945
4946 // TODO map the complete set of values
4947 // 31: VFPv3 40: VFPv4
4948 Builder.defineMacro("_M_ARM_FP", "31");
4949 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004950 BuiltinVaListKind getBuiltinVaListKind() const override {
4951 return TargetInfo::CharPtrBuiltinVaList;
4952 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004953};
4954
4955// Windows ARM + Itanium C++ ABI Target
4956class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4957public:
4958 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4959 : WindowsARMTargetInfo(Triple) {
4960 TheCXXABI.set(TargetCXXABI::GenericARM);
4961 }
4962
4963 void getTargetDefines(const LangOptions &Opts,
4964 MacroBuilder &Builder) const override {
4965 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4966
4967 if (Opts.MSVCCompat)
4968 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4969 }
4970};
4971
4972// Windows ARM, MS (C++) ABI
4973class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4974public:
4975 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4976 : WindowsARMTargetInfo(Triple) {
4977 TheCXXABI.set(TargetCXXABI::Microsoft);
4978 }
4979
4980 void getTargetDefines(const LangOptions &Opts,
4981 MacroBuilder &Builder) const override {
4982 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4983 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4984 }
4985};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004986
Yaron Keren321249c2015-07-15 13:32:23 +00004987// ARM MinGW target
4988class MinGWARMTargetInfo : public WindowsARMTargetInfo {
4989public:
4990 MinGWARMTargetInfo(const llvm::Triple &Triple)
4991 : WindowsARMTargetInfo(Triple) {
4992 TheCXXABI.set(TargetCXXABI::GenericARM);
4993 }
4994
4995 void getTargetDefines(const LangOptions &Opts,
4996 MacroBuilder &Builder) const override {
4997 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4998 DefineStd(Builder, "WIN32", Opts);
4999 DefineStd(Builder, "WINNT", Opts);
5000 Builder.defineMacro("_ARM_");
5001 addMinGWDefines(Opts, Builder);
5002 }
5003};
5004
5005// ARM Cygwin target
5006class CygwinARMTargetInfo : public ARMleTargetInfo {
5007public:
5008 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5009 TLSSupported = false;
5010 WCharType = UnsignedShort;
5011 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005012 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005013 }
5014 void getTargetDefines(const LangOptions &Opts,
5015 MacroBuilder &Builder) const override {
5016 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5017 Builder.defineMacro("_ARM_");
5018 Builder.defineMacro("__CYGWIN__");
5019 Builder.defineMacro("__CYGWIN32__");
5020 DefineStd(Builder, "unix", Opts);
5021 if (Opts.CPlusPlus)
5022 Builder.defineMacro("_GNU_SOURCE");
5023 }
5024};
5025
Mike Stump11289f42009-09-09 15:08:12 +00005026class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005027 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005028protected:
Craig Topper3164f332014-03-11 03:39:26 +00005029 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5030 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005031 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005032 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005033
Torok Edwinb2b37c62009-06-30 17:10:35 +00005034public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005035 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005036 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005037 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005038 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005039 // FIXME: This should be based off of the target features in
5040 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005041 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005042
5043 // Darwin on iOS uses a variant of the ARM C++ ABI.
5044 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005045 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005046};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005047
Tim Northover573cbee2014-05-24 12:52:07 +00005048class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005049 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005050 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5051 static const char *const GCCRegNames[];
5052
James Molloy75f5f9e2014-04-16 15:33:48 +00005053 enum FPUModeEnum {
5054 FPUMode,
5055 NeonMode
5056 };
5057
5058 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005059 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005060 unsigned Crypto;
5061
Tim Northovera2ee4332014-03-29 15:09:45 +00005062 static const Builtin::Info BuiltinInfo[];
5063
5064 std::string ABI;
5065
5066public:
Tim Northover573cbee2014-05-24 12:52:07 +00005067 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005068 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005069
5070 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5071 WCharType = SignedInt;
5072
5073 // NetBSD apparently prefers consistency across ARM targets to consistency
5074 // across 64-bit targets.
5075 Int64Type = SignedLongLong;
5076 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005077 } else {
5078 WCharType = UnsignedInt;
5079 Int64Type = SignedLong;
5080 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005081 }
5082
Tim Northovera2ee4332014-03-29 15:09:45 +00005083 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005084 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005085 MaxAtomicInlineWidth = 128;
5086 MaxAtomicPromoteWidth = 128;
5087
Tim Northovera6a19f12015-02-06 01:25:07 +00005088 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005089 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5090
Tim Northovera2ee4332014-03-29 15:09:45 +00005091 // {} in inline assembly are neon specifiers, not assembly variant
5092 // specifiers.
5093 NoAsmVariants = true;
5094
Tim Northover7ad87af2015-01-16 18:44:04 +00005095 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5096 // contributes to the alignment of the containing aggregate in the same way
5097 // a plain (non bit-field) member of that type would, without exception for
5098 // zero-sized or anonymous bit-fields."
5099 UseBitFieldTypeAlignment = true;
5100 UseZeroLengthBitfieldAlignment = true;
5101
Tim Northover573cbee2014-05-24 12:52:07 +00005102 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005103 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5104 }
5105
Alp Toker4925ba72014-06-07 23:30:42 +00005106 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005107 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005108 if (Name != "aapcs" && Name != "darwinpcs")
5109 return false;
5110
5111 ABI = Name;
5112 return true;
5113 }
5114
David Blaikie1cbb9712014-11-14 19:09:44 +00005115 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005116 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005117 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005118 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005119 .Case("cyclone", true)
5120 .Default(false);
5121 return CPUKnown;
5122 }
5123
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005124 void getTargetDefines(const LangOptions &Opts,
5125 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005126 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005127 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005128
5129 // Target properties.
5130 Builder.defineMacro("_LP64");
5131 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005132
5133 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5134 Builder.defineMacro("__ARM_ACLE", "200");
5135 Builder.defineMacro("__ARM_ARCH", "8");
5136 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5137
5138 Builder.defineMacro("__ARM_64BIT_STATE");
5139 Builder.defineMacro("__ARM_PCS_AAPCS64");
5140 Builder.defineMacro("__ARM_ARCH_ISA_A64");
5141
5142 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
5143 Builder.defineMacro("__ARM_FEATURE_CLZ");
5144 Builder.defineMacro("__ARM_FEATURE_FMA");
5145 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00005146 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
5147 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
5148 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
5149 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00005150
5151 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5152
5153 // 0xe implies support for half, single and double precision operations.
5154 Builder.defineMacro("__ARM_FP", "0xe");
5155
5156 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5157 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
5158 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
5159
5160 if (Opts.FastMath || Opts.FiniteMathOnly)
5161 Builder.defineMacro("__ARM_FP_FAST");
5162
Richard Smithab506ad2014-10-20 23:26:58 +00005163 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00005164 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
5165
5166 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5167
5168 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5169 Opts.ShortEnums ? "1" : "4");
5170
James Molloy75f5f9e2014-04-16 15:33:48 +00005171 if (FPU == NeonMode) {
5172 Builder.defineMacro("__ARM_NEON");
5173 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00005174 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00005175 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005176
Bradley Smith418c5932014-05-02 15:17:51 +00005177 if (CRC)
5178 Builder.defineMacro("__ARM_FEATURE_CRC32");
5179
James Molloy75f5f9e2014-04-16 15:33:48 +00005180 if (Crypto)
5181 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Reid Klecknerd167d422015-05-06 15:31:46 +00005182
5183 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5184 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5185 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5186 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5187 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005188 }
5189
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005190 void getTargetBuiltins(const Builtin::Info *&Records,
5191 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005192 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00005193 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00005194 }
5195
David Blaikie1cbb9712014-11-14 19:09:44 +00005196 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005197 return Feature == "aarch64" ||
5198 Feature == "arm64" ||
5199 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005200 }
5201
James Molloy5e73df52014-04-16 15:06:20 +00005202 bool handleTargetFeatures(std::vector<std::string> &Features,
5203 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005204 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005205 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005206 Crypto = 0;
5207 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5208 if (Features[i] == "+neon")
5209 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005210 if (Features[i] == "+crc")
5211 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005212 if (Features[i] == "+crypto")
5213 Crypto = 1;
5214 }
5215
Eric Christopher964a5f32015-08-05 23:48:05 +00005216 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005217
5218 return true;
5219 }
5220
David Blaikie1cbb9712014-11-14 19:09:44 +00005221 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005222
David Blaikie1cbb9712014-11-14 19:09:44 +00005223 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005224 return TargetInfo::AArch64ABIBuiltinVaList;
5225 }
5226
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005227 void getGCCRegNames(const char *const *&Names,
5228 unsigned &NumNames) const override;
5229 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5230 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005231
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005232 bool validateAsmConstraint(const char *&Name,
5233 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005234 switch (*Name) {
5235 default:
5236 return false;
5237 case 'w': // Floating point and SIMD registers (V0-V31)
5238 Info.setAllowsRegister();
5239 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005240 case 'I': // Constant that can be used with an ADD instruction
5241 case 'J': // Constant that can be used with a SUB instruction
5242 case 'K': // Constant that can be used with a 32-bit logical instruction
5243 case 'L': // Constant that can be used with a 64-bit logical instruction
5244 case 'M': // Constant that can be used as a 32-bit MOV immediate
5245 case 'N': // Constant that can be used as a 64-bit MOV immediate
5246 case 'Y': // Floating point constant zero
5247 case 'Z': // Integer constant zero
5248 return true;
5249 case 'Q': // A memory reference with base register and no offset
5250 Info.setAllowsMemory();
5251 return true;
5252 case 'S': // A symbolic address
5253 Info.setAllowsRegister();
5254 return true;
5255 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005256 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5257 // Utf: A memory address suitable for ldp/stp in TF mode.
5258 // Usa: An absolute symbolic address.
5259 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5260 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005261 case 'z': // Zero register, wzr or xzr
5262 Info.setAllowsRegister();
5263 return true;
5264 case 'x': // Floating point and SIMD registers (V0-V15)
5265 Info.setAllowsRegister();
5266 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005267 }
5268 return false;
5269 }
5270
Akira Hatanaka987f1862014-08-22 06:05:21 +00005271 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005272 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005273 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005274 // Strip off constraint modifiers.
5275 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5276 Constraint = Constraint.substr(1);
5277
5278 switch (Constraint[0]) {
5279 default:
5280 return true;
5281 case 'z':
5282 case 'r': {
5283 switch (Modifier) {
5284 case 'x':
5285 case 'w':
5286 // For now assume that the person knows what they're
5287 // doing with the modifier.
5288 return true;
5289 default:
5290 // By default an 'r' constraint will be in the 'x'
5291 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005292 if (Size == 64)
5293 return true;
5294
5295 SuggestedModifier = "w";
5296 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005297 }
5298 }
5299 }
5300 }
5301
David Blaikie1cbb9712014-11-14 19:09:44 +00005302 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005303
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005304 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005305 if (RegNo == 0)
5306 return 0;
5307 if (RegNo == 1)
5308 return 1;
5309 return -1;
5310 }
5311};
5312
Tim Northover573cbee2014-05-24 12:52:07 +00005313const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005314 // 32-bit Integer registers
5315 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5316 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5317 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5318
5319 // 64-bit Integer registers
5320 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5321 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5322 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5323
5324 // 32-bit floating point regsisters
5325 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5326 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5327 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5328
5329 // 64-bit floating point regsisters
5330 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5331 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5332 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5333
5334 // Vector registers
5335 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5336 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5337 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5338};
5339
Tim Northover573cbee2014-05-24 12:52:07 +00005340void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005341 unsigned &NumNames) const {
5342 Names = GCCRegNames;
5343 NumNames = llvm::array_lengthof(GCCRegNames);
5344}
5345
Tim Northover573cbee2014-05-24 12:52:07 +00005346const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005347 { { "w31" }, "wsp" },
5348 { { "x29" }, "fp" },
5349 { { "x30" }, "lr" },
5350 { { "x31" }, "sp" },
5351 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5352 // don't want to substitute one of these for a different-sized one.
5353};
5354
Tim Northover573cbee2014-05-24 12:52:07 +00005355void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005356 unsigned &NumAliases) const {
5357 Aliases = GCCRegAliases;
5358 NumAliases = llvm::array_lengthof(GCCRegAliases);
5359}
5360
Tim Northover573cbee2014-05-24 12:52:07 +00005361const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005362#define BUILTIN(ID, TYPE, ATTRS) \
5363 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5364#include "clang/Basic/BuiltinsNEON.def"
5365
5366#define BUILTIN(ID, TYPE, ATTRS) \
5367 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00005368#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005369};
James Molloy5e73df52014-04-16 15:06:20 +00005370
Tim Northover573cbee2014-05-24 12:52:07 +00005371class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005372 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005373 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005374 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005375 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005376 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005377 }
5378
5379public:
Tim Northover573cbee2014-05-24 12:52:07 +00005380 AArch64leTargetInfo(const llvm::Triple &Triple)
5381 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005382 BigEndian = false;
5383 }
5384 void getTargetDefines(const LangOptions &Opts,
5385 MacroBuilder &Builder) const override {
5386 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005387 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005388 }
5389};
5390
Tim Northover573cbee2014-05-24 12:52:07 +00005391class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005392 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005393 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005394 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005395 }
5396
5397public:
Tim Northover573cbee2014-05-24 12:52:07 +00005398 AArch64beTargetInfo(const llvm::Triple &Triple)
5399 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005400 void getTargetDefines(const LangOptions &Opts,
5401 MacroBuilder &Builder) const override {
5402 Builder.defineMacro("__AARCH64EB__");
5403 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5404 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005405 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005406 }
5407};
Tim Northovera2ee4332014-03-29 15:09:45 +00005408
Tim Northover573cbee2014-05-24 12:52:07 +00005409class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005410protected:
5411 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5412 MacroBuilder &Builder) const override {
5413 Builder.defineMacro("__AARCH64_SIMD__");
5414 Builder.defineMacro("__ARM64_ARCH_8__");
5415 Builder.defineMacro("__ARM_NEON__");
5416 Builder.defineMacro("__LITTLE_ENDIAN__");
5417 Builder.defineMacro("__REGISTER_PREFIX__", "");
5418 Builder.defineMacro("__arm64", "1");
5419 Builder.defineMacro("__arm64__", "1");
5420
5421 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5422 }
5423
Tim Northovera2ee4332014-03-29 15:09:45 +00005424public:
Tim Northover573cbee2014-05-24 12:52:07 +00005425 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5426 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005427 Int64Type = SignedLongLong;
5428 WCharType = SignedInt;
5429 UseSignedCharForObjCBool = false;
5430
Tim Northovera6a19f12015-02-06 01:25:07 +00005431 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005432 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5433
5434 TheCXXABI.set(TargetCXXABI::iOS64);
5435 }
5436
David Blaikie1cbb9712014-11-14 19:09:44 +00005437 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005438 return TargetInfo::CharPtrBuiltinVaList;
5439 }
5440};
Tim Northovera2ee4332014-03-29 15:09:45 +00005441
Tony Linthicum76329bf2011-12-12 21:14:55 +00005442// Hexagon abstract base class
5443class HexagonTargetInfo : public TargetInfo {
5444 static const Builtin::Info BuiltinInfo[];
5445 static const char * const GCCRegNames[];
5446 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5447 std::string CPU;
5448public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005449 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005450 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00005451 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005452
5453 // {} in inline assembly are packet specifiers, not assembly variant
5454 // specifiers.
5455 NoAsmVariants = true;
5456 }
5457
Craig Topper3164f332014-03-11 03:39:26 +00005458 void getTargetBuiltins(const Builtin::Info *&Records,
5459 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005460 Records = BuiltinInfo;
5461 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5462 }
5463
Craig Topper3164f332014-03-11 03:39:26 +00005464 bool validateAsmConstraint(const char *&Name,
5465 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005466 return true;
5467 }
5468
Craig Topper3164f332014-03-11 03:39:26 +00005469 void getTargetDefines(const LangOptions &Opts,
5470 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005471
Craig Topper3164f332014-03-11 03:39:26 +00005472 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005473 return Feature == "hexagon";
5474 }
Craig Topper3164f332014-03-11 03:39:26 +00005475
5476 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005477 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005478 }
Craig Topper3164f332014-03-11 03:39:26 +00005479 void getGCCRegNames(const char * const *&Names,
5480 unsigned &NumNames) const override;
5481 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5482 unsigned &NumAliases) const override;
5483 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005484 return "";
5485 }
Sebastian Pop86500282012-01-13 20:37:10 +00005486
5487 static const char *getHexagonCPUSuffix(StringRef Name) {
5488 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005489 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005490 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005491 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005492 }
5493
Craig Topper3164f332014-03-11 03:39:26 +00005494 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005495 if (!getHexagonCPUSuffix(Name))
5496 return false;
5497
Tony Linthicum76329bf2011-12-12 21:14:55 +00005498 CPU = Name;
5499 return true;
5500 }
5501};
5502
5503void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5504 MacroBuilder &Builder) const {
5505 Builder.defineMacro("qdsp6");
5506 Builder.defineMacro("__qdsp6", "1");
5507 Builder.defineMacro("__qdsp6__", "1");
5508
5509 Builder.defineMacro("hexagon");
5510 Builder.defineMacro("__hexagon", "1");
5511 Builder.defineMacro("__hexagon__", "1");
5512
5513 if(CPU == "hexagonv1") {
5514 Builder.defineMacro("__HEXAGON_V1__");
5515 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5516 if(Opts.HexagonQdsp6Compat) {
5517 Builder.defineMacro("__QDSP6_V1__");
5518 Builder.defineMacro("__QDSP6_ARCH__", "1");
5519 }
5520 }
5521 else if(CPU == "hexagonv2") {
5522 Builder.defineMacro("__HEXAGON_V2__");
5523 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5524 if(Opts.HexagonQdsp6Compat) {
5525 Builder.defineMacro("__QDSP6_V2__");
5526 Builder.defineMacro("__QDSP6_ARCH__", "2");
5527 }
5528 }
5529 else if(CPU == "hexagonv3") {
5530 Builder.defineMacro("__HEXAGON_V3__");
5531 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5532 if(Opts.HexagonQdsp6Compat) {
5533 Builder.defineMacro("__QDSP6_V3__");
5534 Builder.defineMacro("__QDSP6_ARCH__", "3");
5535 }
5536 }
5537 else if(CPU == "hexagonv4") {
5538 Builder.defineMacro("__HEXAGON_V4__");
5539 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5540 if(Opts.HexagonQdsp6Compat) {
5541 Builder.defineMacro("__QDSP6_V4__");
5542 Builder.defineMacro("__QDSP6_ARCH__", "4");
5543 }
5544 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005545 else if(CPU == "hexagonv5") {
5546 Builder.defineMacro("__HEXAGON_V5__");
5547 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5548 if(Opts.HexagonQdsp6Compat) {
5549 Builder.defineMacro("__QDSP6_V5__");
5550 Builder.defineMacro("__QDSP6_ARCH__", "5");
5551 }
5552 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005553}
5554
5555const char * const HexagonTargetInfo::GCCRegNames[] = {
5556 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5557 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5558 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5559 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5560 "p0", "p1", "p2", "p3",
5561 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5562};
5563
5564void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5565 unsigned &NumNames) const {
5566 Names = GCCRegNames;
5567 NumNames = llvm::array_lengthof(GCCRegNames);
5568}
5569
5570
5571const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5572 { { "sp" }, "r29" },
5573 { { "fp" }, "r30" },
5574 { { "lr" }, "r31" },
5575 };
5576
5577void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5578 unsigned &NumAliases) const {
5579 Aliases = GCCRegAliases;
5580 NumAliases = llvm::array_lengthof(GCCRegAliases);
5581}
5582
5583
5584const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5585#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5586#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5587 ALL_LANGUAGES },
5588#include "clang/Basic/BuiltinsHexagon.def"
5589};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005590
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005591// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5592class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005593 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5594 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005595 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005596public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005597 SparcTargetInfo(const llvm::Triple &Triple)
5598 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005599
Craig Topper3164f332014-03-11 03:39:26 +00005600 bool handleTargetFeatures(std::vector<std::string> &Features,
5601 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005602 // The backend doesn't actually handle soft float yet, but in case someone
5603 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005604 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5605 if (Feature != Features.end()) {
5606 SoftFloat = true;
5607 Features.erase(Feature);
5608 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005609 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005610 }
Craig Topper3164f332014-03-11 03:39:26 +00005611 void getTargetDefines(const LangOptions &Opts,
5612 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005613 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005614 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005615
5616 if (SoftFloat)
5617 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005618 }
Craig Topper3164f332014-03-11 03:39:26 +00005619
5620 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005621 return llvm::StringSwitch<bool>(Feature)
5622 .Case("softfloat", SoftFloat)
5623 .Case("sparc", true)
5624 .Default(false);
5625 }
Craig Topper3164f332014-03-11 03:39:26 +00005626
5627 void getTargetBuiltins(const Builtin::Info *&Records,
5628 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005629 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005630 }
Craig Topper3164f332014-03-11 03:39:26 +00005631 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005632 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005633 }
Craig Topper3164f332014-03-11 03:39:26 +00005634 void getGCCRegNames(const char * const *&Names,
5635 unsigned &NumNames) const override;
5636 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5637 unsigned &NumAliases) const override;
5638 bool validateAsmConstraint(const char *&Name,
5639 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005640 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005641 switch (*Name) {
5642 case 'I': // Signed 13-bit constant
5643 case 'J': // Zero
5644 case 'K': // 32-bit constant with the low 12 bits clear
5645 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5646 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5647 case 'N': // Same as 'K' but zext (required for SIMode)
5648 case 'O': // The constant 4096
5649 return true;
5650 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005651 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005652 }
Craig Topper3164f332014-03-11 03:39:26 +00005653 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005654 // FIXME: Implement!
5655 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005656 }
5657};
5658
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005659const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005660 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5661 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5662 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5663 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5664};
5665
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005666void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5667 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005668 Names = GCCRegNames;
5669 NumNames = llvm::array_lengthof(GCCRegNames);
5670}
5671
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005672const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005673 { { "g0" }, "r0" },
5674 { { "g1" }, "r1" },
5675 { { "g2" }, "r2" },
5676 { { "g3" }, "r3" },
5677 { { "g4" }, "r4" },
5678 { { "g5" }, "r5" },
5679 { { "g6" }, "r6" },
5680 { { "g7" }, "r7" },
5681 { { "o0" }, "r8" },
5682 { { "o1" }, "r9" },
5683 { { "o2" }, "r10" },
5684 { { "o3" }, "r11" },
5685 { { "o4" }, "r12" },
5686 { { "o5" }, "r13" },
5687 { { "o6", "sp" }, "r14" },
5688 { { "o7" }, "r15" },
5689 { { "l0" }, "r16" },
5690 { { "l1" }, "r17" },
5691 { { "l2" }, "r18" },
5692 { { "l3" }, "r19" },
5693 { { "l4" }, "r20" },
5694 { { "l5" }, "r21" },
5695 { { "l6" }, "r22" },
5696 { { "l7" }, "r23" },
5697 { { "i0" }, "r24" },
5698 { { "i1" }, "r25" },
5699 { { "i2" }, "r26" },
5700 { { "i3" }, "r27" },
5701 { { "i4" }, "r28" },
5702 { { "i5" }, "r29" },
5703 { { "i6", "fp" }, "r30" },
5704 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005705};
5706
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005707void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5708 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005709 Aliases = GCCRegAliases;
5710 NumAliases = llvm::array_lengthof(GCCRegAliases);
5711}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005712
5713// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5714class SparcV8TargetInfo : public SparcTargetInfo {
5715public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005716 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005717 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
James Y Knight4b4d19e2015-06-04 15:36:29 +00005718 // NetBSD uses long (same as llvm default); everyone else uses int.
5719 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5720 SizeType = UnsignedLong;
5721 IntPtrType = SignedLong;
5722 PtrDiffType = SignedLong;
5723 } else {
5724 SizeType = UnsignedInt;
5725 IntPtrType = SignedInt;
5726 PtrDiffType = SignedInt;
5727 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005728 }
5729
Craig Topper3164f332014-03-11 03:39:26 +00005730 void getTargetDefines(const LangOptions &Opts,
5731 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005732 SparcTargetInfo::getTargetDefines(Opts, Builder);
5733 Builder.defineMacro("__sparcv8");
5734 }
5735};
5736
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005737// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5738class SparcV8elTargetInfo : public SparcV8TargetInfo {
5739 public:
5740 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005741 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005742 BigEndian = false;
5743 }
5744};
5745
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005746// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5747class SparcV9TargetInfo : public SparcTargetInfo {
5748public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005749 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005750 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00005751 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005752 // This is an LP64 platform.
5753 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005754
5755 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005756 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005757 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005758 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005759 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005760 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005761
5762 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5763 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5764 LongDoubleWidth = 128;
5765 LongDoubleAlign = 128;
5766 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005767 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005768 }
5769
Craig Topper3164f332014-03-11 03:39:26 +00005770 void getTargetDefines(const LangOptions &Opts,
5771 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005772 SparcTargetInfo::getTargetDefines(Opts, Builder);
5773 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005774 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005775 // Solaris doesn't need these variants, but the BSDs do.
5776 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005777 Builder.defineMacro("__sparc64__");
5778 Builder.defineMacro("__sparc_v9__");
5779 Builder.defineMacro("__sparcv9__");
5780 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005781 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005782
Craig Topper3164f332014-03-11 03:39:26 +00005783 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005784 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5785 .Case("v9", true)
5786 .Case("ultrasparc", true)
5787 .Case("ultrasparc3", true)
5788 .Case("niagara", true)
5789 .Case("niagara2", true)
5790 .Case("niagara3", true)
5791 .Case("niagara4", true)
5792 .Default(false);
5793
5794 // No need to store the CPU yet. There aren't any CPU-specific
5795 // macros to define.
5796 return CPUKnown;
5797 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005798};
5799
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005800class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005801 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005802 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005803 std::string CPU;
5804 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005805 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005806
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005807public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005808 SystemZTargetInfo(const llvm::Triple &Triple)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005809 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005810 IntMaxType = SignedLong;
5811 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005812 TLSSupported = true;
5813 IntWidth = IntAlign = 32;
5814 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5815 PointerWidth = PointerAlign = 64;
5816 LongDoubleWidth = 128;
5817 LongDoubleAlign = 64;
5818 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005819 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005820 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00005821 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 +00005822 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5823 }
5824 void getTargetDefines(const LangOptions &Opts,
5825 MacroBuilder &Builder) const override {
5826 Builder.defineMacro("__s390__");
5827 Builder.defineMacro("__s390x__");
5828 Builder.defineMacro("__zarch__");
5829 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005830 if (HasTransactionalExecution)
5831 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005832 if (Opts.ZVector)
5833 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005834 }
5835 void getTargetBuiltins(const Builtin::Info *&Records,
5836 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005837 Records = BuiltinInfo;
5838 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005839 }
5840
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005841 void getGCCRegNames(const char *const *&Names,
5842 unsigned &NumNames) const override;
5843 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5844 unsigned &NumAliases) const override {
5845 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005846 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005847 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005848 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005849 bool validateAsmConstraint(const char *&Name,
5850 TargetInfo::ConstraintInfo &info) const override;
5851 const char *getClobbers() const override {
5852 // FIXME: Is this really right?
5853 return "";
5854 }
5855 BuiltinVaListKind getBuiltinVaListKind() const override {
5856 return TargetInfo::SystemZBuiltinVaList;
5857 }
5858 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005859 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005860 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5861 .Case("z10", true)
5862 .Case("z196", true)
5863 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005864 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005865 .Default(false);
5866
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005867 return CPUKnown;
5868 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005869 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5870 if (CPU == "zEC12")
5871 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005872 if (CPU == "z13") {
5873 Features["transactional-execution"] = true;
5874 Features["vector"] = true;
5875 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005876 }
5877
5878 bool handleTargetFeatures(std::vector<std::string> &Features,
5879 DiagnosticsEngine &Diags) override {
5880 HasTransactionalExecution = false;
5881 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5882 if (Features[i] == "+transactional-execution")
5883 HasTransactionalExecution = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005884 if (Features[i] == "+vector")
5885 HasVector = true;
5886 }
5887 // If we use the vector ABI, vector types are 64-bit aligned.
5888 if (HasVector) {
5889 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005890 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5891 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005892 }
5893 return true;
5894 }
5895
5896 bool hasFeature(StringRef Feature) const override {
5897 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005898 .Case("systemz", true)
5899 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005900 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005901 .Default(false);
5902 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005903
5904 StringRef getABI() const override {
5905 if (HasVector)
5906 return "vector";
5907 return "";
5908 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00005909
5910 bool useFloat128ManglingForLongDouble() const override {
5911 return true;
5912 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005913};
5914
5915const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5916#define BUILTIN(ID, TYPE, ATTRS) \
5917 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5918#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005919};
5920
5921const char *const SystemZTargetInfo::GCCRegNames[] = {
5922 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5923 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5924 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5925 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5926};
5927
5928void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5929 unsigned &NumNames) const {
5930 Names = GCCRegNames;
5931 NumNames = llvm::array_lengthof(GCCRegNames);
5932}
5933
5934bool SystemZTargetInfo::
5935validateAsmConstraint(const char *&Name,
5936 TargetInfo::ConstraintInfo &Info) const {
5937 switch (*Name) {
5938 default:
5939 return false;
5940
5941 case 'a': // Address register
5942 case 'd': // Data register (equivalent to 'r')
5943 case 'f': // Floating-point register
5944 Info.setAllowsRegister();
5945 return true;
5946
5947 case 'I': // Unsigned 8-bit constant
5948 case 'J': // Unsigned 12-bit constant
5949 case 'K': // Signed 16-bit constant
5950 case 'L': // Signed 20-bit displacement (on all targets we support)
5951 case 'M': // 0x7fffffff
5952 return true;
5953
5954 case 'Q': // Memory with base and unsigned 12-bit displacement
5955 case 'R': // Likewise, plus an index
5956 case 'S': // Memory with base and signed 20-bit displacement
5957 case 'T': // Likewise, plus an index
5958 Info.setAllowsMemory();
5959 return true;
5960 }
5961}
Ulrich Weigand47445072013-05-06 16:26:41 +00005962
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005963 class MSP430TargetInfo : public TargetInfo {
5964 static const char * const GCCRegNames[];
5965 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005966 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005967 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005968 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005969 IntWidth = 16; IntAlign = 16;
5970 LongWidth = 32; LongLongWidth = 64;
5971 LongAlign = LongLongAlign = 16;
5972 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005973 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005974 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005975 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005976 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005977 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005978 SigAtomicType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00005979 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005980 }
5981 void getTargetDefines(const LangOptions &Opts,
5982 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005983 Builder.defineMacro("MSP430");
5984 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005985 // FIXME: defines for different 'flavours' of MCU
5986 }
Craig Topper3164f332014-03-11 03:39:26 +00005987 void getTargetBuiltins(const Builtin::Info *&Records,
5988 unsigned &NumRecords) const override {
5989 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005990 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005991 NumRecords = 0;
5992 }
Craig Topper3164f332014-03-11 03:39:26 +00005993 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005994 return Feature == "msp430";
5995 }
Craig Topper3164f332014-03-11 03:39:26 +00005996 void getGCCRegNames(const char * const *&Names,
5997 unsigned &NumNames) const override;
5998 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5999 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006000 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00006001 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006002 NumAliases = 0;
6003 }
Eric Christopher917e9522014-11-18 22:36:15 +00006004 bool
6005 validateAsmConstraint(const char *&Name,
6006 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006007 // FIXME: implement
6008 switch (*Name) {
6009 case 'K': // the constant 1
6010 case 'L': // constant -1^20 .. 1^19
6011 case 'M': // constant 1-4:
6012 return true;
6013 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00006014 // No target constraints for now.
6015 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006016 }
Craig Topper3164f332014-03-11 03:39:26 +00006017 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006018 // FIXME: Is this really right?
6019 return "";
6020 }
Craig Topper3164f332014-03-11 03:39:26 +00006021 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006022 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00006023 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006024 }
6025 };
6026
6027 const char * const MSP430TargetInfo::GCCRegNames[] = {
6028 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6029 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
6030 };
6031
6032 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
6033 unsigned &NumNames) const {
6034 Names = GCCRegNames;
6035 NumNames = llvm::array_lengthof(GCCRegNames);
6036 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00006037
Mike Stump11289f42009-09-09 15:08:12 +00006038 // LLVM and Clang cannot be used directly to output native binaries for
6039 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00006040 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00006041 //
6042 // TCE uses the llvm bitcode as input and uses it for generating customized
6043 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00006044 // publicly available in http://tce.cs.tut.fi
6045
Eli Friedman1f191002011-10-07 19:51:42 +00006046 static const unsigned TCEOpenCLAddrSpaceMap[] = {
6047 3, // opencl_global
6048 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00006049 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006050 // FIXME: generic has to be added to the target
6051 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00006052 0, // cuda_device
6053 0, // cuda_constant
6054 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00006055 };
6056
Eli Friedmana9c3d712009-08-19 20:47:07 +00006057 class TCETargetInfo : public TargetInfo{
6058 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006059 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00006060 TLSSupported = false;
6061 IntWidth = 32;
6062 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006063 PointerWidth = 32;
6064 IntAlign = 32;
6065 LongAlign = LongLongAlign = 32;
6066 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006067 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006068 SizeType = UnsignedInt;
6069 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006070 IntPtrType = SignedInt;
6071 PtrDiffType = SignedInt;
6072 FloatWidth = 32;
6073 FloatAlign = 32;
6074 DoubleWidth = 32;
6075 DoubleAlign = 32;
6076 LongDoubleWidth = 32;
6077 LongDoubleAlign = 32;
6078 FloatFormat = &llvm::APFloat::IEEEsingle;
6079 DoubleFormat = &llvm::APFloat::IEEEsingle;
6080 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Eric Christopher964a5f32015-08-05 23:48:05 +00006081 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6082 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00006083 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006084 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006085 }
6086
Craig Topper3164f332014-03-11 03:39:26 +00006087 void getTargetDefines(const LangOptions &Opts,
6088 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006089 DefineStd(Builder, "tce", Opts);
6090 Builder.defineMacro("__TCE__");
6091 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00006092 }
Craig Topper3164f332014-03-11 03:39:26 +00006093 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006094 return Feature == "tce";
6095 }
Craig Topper3164f332014-03-11 03:39:26 +00006096
6097 void getTargetBuiltins(const Builtin::Info *&Records,
6098 unsigned &NumRecords) const override {}
6099 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00006100 return "";
6101 }
Craig Topper3164f332014-03-11 03:39:26 +00006102 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006103 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006104 }
Craig Topper3164f332014-03-11 03:39:26 +00006105 void getGCCRegNames(const char * const *&Names,
6106 unsigned &NumNames) const override {}
6107 bool validateAsmConstraint(const char *&Name,
6108 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00006109 return true;
6110 }
Craig Topper3164f332014-03-11 03:39:26 +00006111 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6112 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00006113 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00006114
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006115class BPFTargetInfo : public TargetInfo {
6116public:
6117 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6118 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6119 SizeType = UnsignedLong;
6120 PtrDiffType = SignedLong;
6121 IntPtrType = SignedLong;
6122 IntMaxType = SignedLong;
6123 Int64Type = SignedLong;
6124 RegParmMax = 5;
6125 if (Triple.getArch() == llvm::Triple::bpfeb) {
6126 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006127 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006128 } else {
6129 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006130 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006131 }
6132 MaxAtomicPromoteWidth = 64;
6133 MaxAtomicInlineWidth = 64;
6134 TLSSupported = false;
6135 }
6136 void getTargetDefines(const LangOptions &Opts,
6137 MacroBuilder &Builder) const override {
6138 DefineStd(Builder, "bpf", Opts);
6139 Builder.defineMacro("__BPF__");
6140 }
6141 bool hasFeature(StringRef Feature) const override {
6142 return Feature == "bpf";
6143 }
6144
6145 void getTargetBuiltins(const Builtin::Info *&Records,
6146 unsigned &NumRecords) const override {}
6147 const char *getClobbers() const override {
6148 return "";
6149 }
6150 BuiltinVaListKind getBuiltinVaListKind() const override {
6151 return TargetInfo::VoidPtrBuiltinVaList;
6152 }
6153 void getGCCRegNames(const char * const *&Names,
6154 unsigned &NumNames) const override {
6155 Names = nullptr;
6156 NumNames = 0;
6157 }
6158 bool validateAsmConstraint(const char *&Name,
6159 TargetInfo::ConstraintInfo &info) const override {
6160 return true;
6161 }
6162 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6163 unsigned &NumAliases) const override {
6164 Aliases = nullptr;
6165 NumAliases = 0;
6166 }
6167};
6168
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006169class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006170 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006171
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006172 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006173 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006174 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006175 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006176 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006177 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006178 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006179 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006180 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006181 enum DspRevEnum {
6182 NoDSP, DSP1, DSP2
6183 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006184 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006185
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006186protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006187 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006188 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006189
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006190public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006191 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6192 const std::string &CPUStr)
6193 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006194 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006195 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6196 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6197 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006198
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006199 bool isNaN2008Default() const {
6200 return CPU == "mips32r6" || CPU == "mips64r6";
6201 }
6202
6203 bool isFP64Default() const {
6204 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6205 }
6206
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006207 bool isNan2008() const override {
6208 return IsNan2008;
6209 }
6210
Alp Toker4925ba72014-06-07 23:30:42 +00006211 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006212 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006213 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6214 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006215 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006216 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006217 .Case("mips1", IsMips32)
6218 .Case("mips2", IsMips32)
6219 .Case("mips3", true)
6220 .Case("mips4", true)
6221 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006222 .Case("mips32", IsMips32)
6223 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006224 .Case("mips32r3", IsMips32)
6225 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006226 .Case("mips32r6", IsMips32)
6227 .Case("mips64", true)
6228 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006229 .Case("mips64r3", true)
6230 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006231 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006232 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006233 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006234 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006235 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00006236 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006237 if (CPU == "octeon")
6238 Features["mips64r2"] = Features["cnmips"] = true;
6239 else
6240 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00006241 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006242
Craig Topper3164f332014-03-11 03:39:26 +00006243 void getTargetDefines(const LangOptions &Opts,
6244 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006245 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006246 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006247 if (Opts.GNUMode)
6248 Builder.defineMacro("mips");
6249
Simon Atanasyan683535b2012-08-29 19:14:58 +00006250 Builder.defineMacro("__REGISTER_PREFIX__", "");
6251
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006252 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006253 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006254 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006255 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006256 case SoftFloat:
6257 Builder.defineMacro("__mips_soft_float", Twine(1));
6258 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006259 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006260
Simon Atanasyan16071912013-04-14 14:07:30 +00006261 if (IsSingleFloat)
6262 Builder.defineMacro("__mips_single_float", Twine(1));
6263
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006264 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6265 Builder.defineMacro("_MIPS_FPSET",
6266 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6267
Simon Atanasyan72244b62012-07-05 16:06:06 +00006268 if (IsMips16)
6269 Builder.defineMacro("__mips16", Twine(1));
6270
Simon Atanasyan60777612013-04-14 14:07:51 +00006271 if (IsMicromips)
6272 Builder.defineMacro("__mips_micromips", Twine(1));
6273
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006274 if (IsNan2008)
6275 Builder.defineMacro("__mips_nan2008", Twine(1));
6276
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006277 switch (DspRev) {
6278 default:
6279 break;
6280 case DSP1:
6281 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6282 Builder.defineMacro("__mips_dsp", Twine(1));
6283 break;
6284 case DSP2:
6285 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6286 Builder.defineMacro("__mips_dspr2", Twine(1));
6287 Builder.defineMacro("__mips_dsp", Twine(1));
6288 break;
6289 }
6290
Jack Carter44ff1e52013-08-12 17:20:29 +00006291 if (HasMSA)
6292 Builder.defineMacro("__mips_msa", Twine(1));
6293
Simon Atanasyan26f19672012-04-05 19:28:31 +00006294 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6295 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6296 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006297
6298 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6299 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006300 }
6301
Craig Topper3164f332014-03-11 03:39:26 +00006302 void getTargetBuiltins(const Builtin::Info *&Records,
6303 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006304 Records = BuiltinInfo;
6305 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006306 }
Craig Topper3164f332014-03-11 03:39:26 +00006307 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006308 return llvm::StringSwitch<bool>(Feature)
6309 .Case("mips", true)
6310 .Case("fp64", HasFP64)
6311 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006312 }
Craig Topper3164f332014-03-11 03:39:26 +00006313 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006314 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006315 }
Craig Topper3164f332014-03-11 03:39:26 +00006316 void getGCCRegNames(const char * const *&Names,
6317 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006318 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006319 // CPU register names
6320 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006321 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6322 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6323 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006324 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6325 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006326 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6327 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6328 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6329 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006330 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006331 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006332 "$fcc5","$fcc6","$fcc7",
6333 // MSA register names
6334 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6335 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6336 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6337 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6338 // MSA control register names
6339 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6340 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006341 };
6342 Names = GCCRegNames;
6343 NumNames = llvm::array_lengthof(GCCRegNames);
6344 }
Craig Topper3164f332014-03-11 03:39:26 +00006345 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6346 unsigned &NumAliases) const override = 0;
6347 bool validateAsmConstraint(const char *&Name,
6348 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006349 switch (*Name) {
6350 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006351 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006352 case 'r': // CPU registers.
6353 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006354 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006355 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006356 case 'c': // $25 for indirect jumps
6357 case 'l': // lo register
6358 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006359 Info.setAllowsRegister();
6360 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006361 case 'I': // Signed 16-bit constant
6362 case 'J': // Integer 0
6363 case 'K': // Unsigned 16-bit constant
6364 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6365 case 'M': // Constants not loadable via lui, addiu, or ori
6366 case 'N': // Constant -1 to -65535
6367 case 'O': // A signed 15-bit constant
6368 case 'P': // A constant between 1 go 65535
6369 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006370 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006371 Info.setAllowsMemory();
6372 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006373 case 'Z':
6374 if (Name[1] == 'C') { // An address usable by ll, and sc.
6375 Info.setAllowsMemory();
6376 Name++; // Skip over 'Z'.
6377 return true;
6378 }
6379 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006380 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006381 }
6382
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006383 std::string convertConstraint(const char *&Constraint) const override {
6384 std::string R;
6385 switch (*Constraint) {
6386 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6387 if (Constraint[1] == 'C') {
6388 R = std::string("^") + std::string(Constraint, 2);
6389 Constraint++;
6390 return R;
6391 }
6392 break;
6393 }
6394 return TargetInfo::convertConstraint(Constraint);
6395 }
6396
Craig Topper3164f332014-03-11 03:39:26 +00006397 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006398 // In GCC, $1 is not widely used in generated code (it's used only in a few
6399 // specific situations), so there is no real need for users to add it to
6400 // the clobbers list if they want to use it in their inline assembly code.
6401 //
6402 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6403 // code generation, so using it in inline assembly without adding it to the
6404 // clobbers list can cause conflicts between the inline assembly code and
6405 // the surrounding generated code.
6406 //
6407 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6408 // operands, which will conflict with the ".set at" assembler option (which
6409 // we use only for inline assembly, in order to maintain compatibility with
6410 // GCC) and will also conflict with the user's usage of $1.
6411 //
6412 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6413 // register for generated code is to automatically clobber $1 for all inline
6414 // assembly code.
6415 //
6416 // FIXME: We should automatically clobber $1 only for inline assembly code
6417 // which actually uses it. This would allow LLVM to use $1 for inline
6418 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006419 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006420 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006421
Craig Topper3164f332014-03-11 03:39:26 +00006422 bool handleTargetFeatures(std::vector<std::string> &Features,
6423 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006424 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006425 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006426 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006427 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006428 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006429 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006430 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006431
6432 for (std::vector<std::string>::iterator it = Features.begin(),
6433 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006434 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006435 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006436 else if (*it == "+soft-float")
6437 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006438 else if (*it == "+mips16")
6439 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00006440 else if (*it == "+micromips")
6441 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006442 else if (*it == "+dsp")
6443 DspRev = std::max(DspRev, DSP1);
6444 else if (*it == "+dspr2")
6445 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00006446 else if (*it == "+msa")
6447 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006448 else if (*it == "+fp64")
6449 HasFP64 = true;
6450 else if (*it == "-fp64")
6451 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006452 else if (*it == "+nan2008")
6453 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006454 else if (*it == "-nan2008")
6455 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006456 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006457
Eric Christopher964a5f32015-08-05 23:48:05 +00006458 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006459
Rafael Espindolaeb265472013-08-21 21:59:03 +00006460 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006461 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006462
Craig Topper3164f332014-03-11 03:39:26 +00006463 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006464 if (RegNo == 0) return 4;
6465 if (RegNo == 1) return 5;
6466 return -1;
6467 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006468
6469 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006470};
6471
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006472const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
6473#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6474#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6475 ALL_LANGUAGES },
6476#include "clang/Basic/BuiltinsMips.def"
6477};
6478
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006479class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006480public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006481 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006482 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006483 SizeType = UnsignedInt;
6484 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006485 Int64Type = SignedLongLong;
6486 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006487 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006488 }
Craig Topper3164f332014-03-11 03:39:26 +00006489 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006490 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006491 ABI = Name;
6492 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006493 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006494 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006495 }
Craig Topper3164f332014-03-11 03:39:26 +00006496 void getTargetDefines(const LangOptions &Opts,
6497 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006498 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006499
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006500 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006501 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6502
6503 const std::string& CPUStr = getCPU();
6504 if (CPUStr == "mips32")
6505 Builder.defineMacro("__mips_isa_rev", "1");
6506 else if (CPUStr == "mips32r2")
6507 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006508 else if (CPUStr == "mips32r3")
6509 Builder.defineMacro("__mips_isa_rev", "3");
6510 else if (CPUStr == "mips32r5")
6511 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006512 else if (CPUStr == "mips32r6")
6513 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006514
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006515 if (ABI == "o32") {
6516 Builder.defineMacro("__mips_o32");
6517 Builder.defineMacro("_ABIO32", "1");
6518 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6519 }
6520 else if (ABI == "eabi")
6521 Builder.defineMacro("__mips_eabi");
6522 else
David Blaikie83d382b2011-09-23 05:06:16 +00006523 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006524 }
Craig Topper3164f332014-03-11 03:39:26 +00006525 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6526 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006527 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6528 { { "at" }, "$1" },
6529 { { "v0" }, "$2" },
6530 { { "v1" }, "$3" },
6531 { { "a0" }, "$4" },
6532 { { "a1" }, "$5" },
6533 { { "a2" }, "$6" },
6534 { { "a3" }, "$7" },
6535 { { "t0" }, "$8" },
6536 { { "t1" }, "$9" },
6537 { { "t2" }, "$10" },
6538 { { "t3" }, "$11" },
6539 { { "t4" }, "$12" },
6540 { { "t5" }, "$13" },
6541 { { "t6" }, "$14" },
6542 { { "t7" }, "$15" },
6543 { { "s0" }, "$16" },
6544 { { "s1" }, "$17" },
6545 { { "s2" }, "$18" },
6546 { { "s3" }, "$19" },
6547 { { "s4" }, "$20" },
6548 { { "s5" }, "$21" },
6549 { { "s6" }, "$22" },
6550 { { "s7" }, "$23" },
6551 { { "t8" }, "$24" },
6552 { { "t9" }, "$25" },
6553 { { "k0" }, "$26" },
6554 { { "k1" }, "$27" },
6555 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006556 { { "sp","$sp" }, "$29" },
6557 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006558 { { "ra" }, "$31" }
6559 };
6560 Aliases = GCCRegAliases;
6561 NumAliases = llvm::array_lengthof(GCCRegAliases);
6562 }
6563};
6564
6565class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006566 void setDataLayoutString() override {
6567 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006568 }
6569
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006570public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006571 Mips32EBTargetInfo(const llvm::Triple &Triple)
6572 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006573 }
Craig Topper3164f332014-03-11 03:39:26 +00006574 void getTargetDefines(const LangOptions &Opts,
6575 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006576 DefineStd(Builder, "MIPSEB", Opts);
6577 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006578 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006579 }
6580};
6581
6582class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006583 void setDataLayoutString() override {
6584 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006585 }
6586
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006587public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006588 Mips32ELTargetInfo(const llvm::Triple &Triple)
6589 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006590 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006591 }
Craig Topper3164f332014-03-11 03:39:26 +00006592 void getTargetDefines(const LangOptions &Opts,
6593 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006594 DefineStd(Builder, "MIPSEL", Opts);
6595 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006596 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006597 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006598};
Akira Hatanakabef17452011-09-20 19:21:49 +00006599
6600class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006601public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006602 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006603 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006604 LongDoubleWidth = LongDoubleAlign = 128;
6605 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006606 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6607 LongDoubleWidth = LongDoubleAlign = 64;
6608 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6609 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006610 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006611 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006612 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006613 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006614
6615 void setN64ABITypes() {
6616 LongWidth = LongAlign = 64;
6617 PointerWidth = PointerAlign = 64;
6618 SizeType = UnsignedLong;
6619 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006620 Int64Type = SignedLong;
6621 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006622 }
6623
6624 void setN32ABITypes() {
6625 LongWidth = LongAlign = 32;
6626 PointerWidth = PointerAlign = 32;
6627 SizeType = UnsignedInt;
6628 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006629 Int64Type = SignedLongLong;
6630 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006631 }
6632
Craig Topper3164f332014-03-11 03:39:26 +00006633 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006634 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006635 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006636 ABI = Name;
6637 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006638 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006639 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006640 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006641 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006642 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006643 }
6644 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006645 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006646
Craig Topper3164f332014-03-11 03:39:26 +00006647 void getTargetDefines(const LangOptions &Opts,
6648 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006649 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006650
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006651 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006652 Builder.defineMacro("__mips64");
6653 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006654 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6655
6656 const std::string& CPUStr = getCPU();
6657 if (CPUStr == "mips64")
6658 Builder.defineMacro("__mips_isa_rev", "1");
6659 else if (CPUStr == "mips64r2")
6660 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006661 else if (CPUStr == "mips64r3")
6662 Builder.defineMacro("__mips_isa_rev", "3");
6663 else if (CPUStr == "mips64r5")
6664 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006665 else if (CPUStr == "mips64r6")
6666 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006667
Akira Hatanakabef17452011-09-20 19:21:49 +00006668 if (ABI == "n32") {
6669 Builder.defineMacro("__mips_n32");
6670 Builder.defineMacro("_ABIN32", "2");
6671 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6672 }
6673 else if (ABI == "n64") {
6674 Builder.defineMacro("__mips_n64");
6675 Builder.defineMacro("_ABI64", "3");
6676 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6677 }
6678 else
David Blaikie83d382b2011-09-23 05:06:16 +00006679 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006680 }
Craig Topper3164f332014-03-11 03:39:26 +00006681 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6682 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006683 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6684 { { "at" }, "$1" },
6685 { { "v0" }, "$2" },
6686 { { "v1" }, "$3" },
6687 { { "a0" }, "$4" },
6688 { { "a1" }, "$5" },
6689 { { "a2" }, "$6" },
6690 { { "a3" }, "$7" },
6691 { { "a4" }, "$8" },
6692 { { "a5" }, "$9" },
6693 { { "a6" }, "$10" },
6694 { { "a7" }, "$11" },
6695 { { "t0" }, "$12" },
6696 { { "t1" }, "$13" },
6697 { { "t2" }, "$14" },
6698 { { "t3" }, "$15" },
6699 { { "s0" }, "$16" },
6700 { { "s1" }, "$17" },
6701 { { "s2" }, "$18" },
6702 { { "s3" }, "$19" },
6703 { { "s4" }, "$20" },
6704 { { "s5" }, "$21" },
6705 { { "s6" }, "$22" },
6706 { { "s7" }, "$23" },
6707 { { "t8" }, "$24" },
6708 { { "t9" }, "$25" },
6709 { { "k0" }, "$26" },
6710 { { "k1" }, "$27" },
6711 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006712 { { "sp","$sp" }, "$29" },
6713 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006714 { { "ra" }, "$31" }
6715 };
6716 Aliases = GCCRegAliases;
6717 NumAliases = llvm::array_lengthof(GCCRegAliases);
6718 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006719
6720 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006721};
6722
6723class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006724 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006725 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006726 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 +00006727 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006728 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006729
Akira Hatanakabef17452011-09-20 19:21:49 +00006730 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006731
Akira Hatanakabef17452011-09-20 19:21:49 +00006732public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006733 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006734 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006735 void getTargetDefines(const LangOptions &Opts,
6736 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006737 DefineStd(Builder, "MIPSEB", Opts);
6738 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006739 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006740 }
6741};
6742
6743class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006744 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006745 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006746 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 +00006747 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006748 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006749 }
6750public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006751 Mips64ELTargetInfo(const llvm::Triple &Triple)
6752 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006753 // Default ABI is n64.
6754 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006755 }
Craig Topper3164f332014-03-11 03:39:26 +00006756 void getTargetDefines(const LangOptions &Opts,
6757 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006758 DefineStd(Builder, "MIPSEL", Opts);
6759 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006760 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006761 }
6762};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006763
Ivan Krasindd7403e2011-08-24 20:22:22 +00006764class PNaClTargetInfo : public TargetInfo {
6765public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006766 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006767 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006768 this->UserLabelPrefix = "";
6769 this->LongAlign = 32;
6770 this->LongWidth = 32;
6771 this->PointerAlign = 32;
6772 this->PointerWidth = 32;
6773 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006774 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006775 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006776 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006777 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006778 this->SizeType = TargetInfo::UnsignedInt;
6779 this->PtrDiffType = TargetInfo::SignedInt;
6780 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006781 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006782 }
6783
Craig Topper3164f332014-03-11 03:39:26 +00006784 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006785 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006786 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006787 Builder.defineMacro("__le32__");
6788 Builder.defineMacro("__pnacl__");
6789 }
Craig Topper3164f332014-03-11 03:39:26 +00006790 void getTargetDefines(const LangOptions &Opts,
6791 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006792 getArchDefines(Opts, Builder);
6793 }
Craig Topper3164f332014-03-11 03:39:26 +00006794 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006795 return Feature == "pnacl";
6796 }
Craig Topper3164f332014-03-11 03:39:26 +00006797 void getTargetBuiltins(const Builtin::Info *&Records,
6798 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006799 }
Craig Topper3164f332014-03-11 03:39:26 +00006800 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006801 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006802 }
Craig Topper3164f332014-03-11 03:39:26 +00006803 void getGCCRegNames(const char * const *&Names,
6804 unsigned &NumNames) const override;
6805 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6806 unsigned &NumAliases) const override;
6807 bool validateAsmConstraint(const char *&Name,
6808 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006809 return false;
6810 }
6811
Craig Topper3164f332014-03-11 03:39:26 +00006812 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006813 return "";
6814 }
6815};
6816
6817void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6818 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006819 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006820 NumNames = 0;
6821}
6822
6823void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6824 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006825 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006826 NumAliases = 0;
6827}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006828
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006829// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6830class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6831public:
6832 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
6833 Mips32ELTargetInfo(Triple) {
6834 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 0;
6835 }
6836
6837 BuiltinVaListKind getBuiltinVaListKind() const override {
6838 return TargetInfo::PNaClABIBuiltinVaList;
6839 }
6840};
6841
JF Bastien643817d2014-09-12 17:52:47 +00006842class Le64TargetInfo : public TargetInfo {
6843 static const Builtin::Info BuiltinInfo[];
6844
6845public:
6846 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6847 BigEndian = false;
6848 NoAsmVariants = true;
6849 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6850 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006851 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006852 }
6853
6854 void getTargetDefines(const LangOptions &Opts,
6855 MacroBuilder &Builder) const override {
6856 DefineStd(Builder, "unix", Opts);
6857 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6858 Builder.defineMacro("__ELF__");
6859 }
6860 void getTargetBuiltins(const Builtin::Info *&Records,
6861 unsigned &NumRecords) const override {
6862 Records = BuiltinInfo;
6863 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6864 }
6865 BuiltinVaListKind getBuiltinVaListKind() const override {
6866 return TargetInfo::PNaClABIBuiltinVaList;
6867 }
6868 const char *getClobbers() const override { return ""; }
6869 void getGCCRegNames(const char *const *&Names,
6870 unsigned &NumNames) const override {
6871 Names = nullptr;
6872 NumNames = 0;
6873 }
6874 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6875 unsigned &NumAliases) const override {
6876 Aliases = nullptr;
6877 NumAliases = 0;
6878 }
6879 bool validateAsmConstraint(const char *&Name,
6880 TargetInfo::ConstraintInfo &Info) const override {
6881 return false;
6882 }
6883
6884 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006885};
6886} // end anonymous namespace.
6887
6888const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6889#define BUILTIN(ID, TYPE, ATTRS) \
6890 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6891#include "clang/Basic/BuiltinsLe64.def"
6892};
6893
6894namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006895 static const unsigned SPIRAddrSpaceMap[] = {
6896 1, // opencl_global
6897 3, // opencl_local
6898 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006899 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006900 0, // cuda_device
6901 0, // cuda_constant
6902 0 // cuda_shared
6903 };
6904 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006905 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006906 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006907 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6908 "SPIR target must use unknown OS");
6909 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6910 "SPIR target must use unknown environment type");
6911 BigEndian = false;
6912 TLSSupported = false;
6913 LongWidth = LongAlign = 64;
6914 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006915 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006916 // Define available target features
6917 // These must be defined in sorted order!
6918 NoAsmVariants = true;
6919 }
Craig Topper3164f332014-03-11 03:39:26 +00006920 void getTargetDefines(const LangOptions &Opts,
6921 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006922 DefineStd(Builder, "SPIR", Opts);
6923 }
Craig Topper3164f332014-03-11 03:39:26 +00006924 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006925 return Feature == "spir";
6926 }
Craig Topper3164f332014-03-11 03:39:26 +00006927
6928 void getTargetBuiltins(const Builtin::Info *&Records,
6929 unsigned &NumRecords) const override {}
6930 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006931 return "";
6932 }
Craig Topper3164f332014-03-11 03:39:26 +00006933 void getGCCRegNames(const char * const *&Names,
6934 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006935 bool
6936 validateAsmConstraint(const char *&Name,
6937 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006938 return true;
6939 }
Craig Topper3164f332014-03-11 03:39:26 +00006940 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6941 unsigned &NumAliases) const override {}
6942 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006943 return TargetInfo::VoidPtrBuiltinVaList;
6944 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006945
6946 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6947 return (CC == CC_SpirFunction ||
6948 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6949 }
6950
6951 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6952 return CC_SpirFunction;
6953 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006954 };
6955
6956
6957 class SPIR32TargetInfo : public SPIRTargetInfo {
6958 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006959 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006960 PointerWidth = PointerAlign = 32;
6961 SizeType = TargetInfo::UnsignedInt;
6962 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +00006963 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6964 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006965 }
Craig Topper3164f332014-03-11 03:39:26 +00006966 void getTargetDefines(const LangOptions &Opts,
6967 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006968 DefineStd(Builder, "SPIR32", Opts);
6969 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006970 };
6971
6972 class SPIR64TargetInfo : public SPIRTargetInfo {
6973 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006974 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006975 PointerWidth = PointerAlign = 64;
6976 SizeType = TargetInfo::UnsignedLong;
6977 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00006978 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6979 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006980 }
Craig Topper3164f332014-03-11 03:39:26 +00006981 void getTargetDefines(const LangOptions &Opts,
6982 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006983 DefineStd(Builder, "SPIR64", Opts);
6984 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006985 };
Guy Benyeib798fc92012-12-11 21:38:14 +00006986
Robert Lytton0e076492013-08-13 09:43:10 +00006987class XCoreTargetInfo : public TargetInfo {
6988 static const Builtin::Info BuiltinInfo[];
6989public:
6990 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6991 BigEndian = false;
6992 NoAsmVariants = true;
6993 LongLongAlign = 32;
6994 SuitableAlign = 32;
6995 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006996 SizeType = UnsignedInt;
6997 PtrDiffType = SignedInt;
6998 IntPtrType = SignedInt;
6999 WCharType = UnsignedChar;
7000 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007001 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007002 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7003 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007004 }
Craig Topper3164f332014-03-11 03:39:26 +00007005 void getTargetDefines(const LangOptions &Opts,
7006 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007007 Builder.defineMacro("__XS1B__");
7008 }
Craig Topper3164f332014-03-11 03:39:26 +00007009 void getTargetBuiltins(const Builtin::Info *&Records,
7010 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007011 Records = BuiltinInfo;
7012 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
7013 }
Craig Topper3164f332014-03-11 03:39:26 +00007014 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007015 return TargetInfo::VoidPtrBuiltinVaList;
7016 }
Craig Topper3164f332014-03-11 03:39:26 +00007017 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007018 return "";
7019 }
Craig Topper3164f332014-03-11 03:39:26 +00007020 void getGCCRegNames(const char * const *&Names,
7021 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007022 static const char * const GCCRegNames[] = {
7023 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7024 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7025 };
7026 Names = GCCRegNames;
7027 NumNames = llvm::array_lengthof(GCCRegNames);
7028 }
Craig Topper3164f332014-03-11 03:39:26 +00007029 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7030 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00007031 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00007032 NumAliases = 0;
7033 }
Craig Topper3164f332014-03-11 03:39:26 +00007034 bool validateAsmConstraint(const char *&Name,
7035 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007036 return false;
7037 }
Craig Topper3164f332014-03-11 03:39:26 +00007038 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007039 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7040 return (RegNo < 2)? RegNo : -1;
7041 }
Robert Lytton0e076492013-08-13 09:43:10 +00007042};
7043
7044const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
7045#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
7046#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
7047 ALL_LANGUAGES },
7048#include "clang/Basic/BuiltinsXCore.def"
7049};
7050} // end anonymous namespace.
7051
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007052namespace {
7053// x86_32 Android target
7054class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7055public:
7056 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7057 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7058 SuitableAlign = 32;
7059 LongDoubleWidth = 64;
7060 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7061 }
7062};
7063} // end anonymous namespace
7064
7065namespace {
7066// x86_64 Android target
7067class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7068public:
7069 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7070 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7071 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7072 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007073
7074 bool useFloat128ManglingForLongDouble() const override {
7075 return true;
7076 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007077};
7078} // end anonymous namespace
7079
Ivan Krasindd7403e2011-08-24 20:22:22 +00007080
Chris Lattner5ba61f02006-10-14 07:39:34 +00007081//===----------------------------------------------------------------------===//
7082// Driver code
7083//===----------------------------------------------------------------------===//
7084
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007085static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007086 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007087
Daniel Dunbar52322032009-08-18 05:47:58 +00007088 switch (Triple.getArch()) {
7089 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007090 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007091
Tim Northover2a0783d2014-05-30 14:14:07 +00007092 case llvm::Triple::xcore:
7093 return new XCoreTargetInfo(Triple);
7094
7095 case llvm::Triple::hexagon:
7096 return new HexagonTargetInfo(Triple);
7097
7098 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007099 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007100 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007101
7102 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007103 case llvm::Triple::FreeBSD:
7104 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007105 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007106 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007107 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007108 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007109 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007110 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007111 }
7112
Christian Pirker9b019ae2014-02-25 13:51:00 +00007113 case llvm::Triple::aarch64_be:
7114 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007115 case llvm::Triple::FreeBSD:
7116 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007117 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007118 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007119 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007120 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007121 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007122 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007123 }
7124
Daniel Dunbar52322032009-08-18 05:47:58 +00007125 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007126 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007127 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007128 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007129
Daniel Dunbar52322032009-08-18 05:47:58 +00007130 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007131 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007132 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007133 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007134 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007135 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007136 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007137 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007138 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007139 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007140 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007141 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007142 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007143 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007144 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007145 case llvm::Triple::Win32:
7146 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007147 case llvm::Triple::Cygnus:
7148 return new CygwinARMTargetInfo(Triple);
7149 case llvm::Triple::GNU:
7150 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007151 case llvm::Triple::Itanium:
7152 return new ItaniumWindowsARMleTargetInfo(Triple);
7153 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007154 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007155 return new MicrosoftARMleTargetInfo(Triple);
7156 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007157 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007158 return new ARMleTargetInfo(Triple);
7159 }
7160
7161 case llvm::Triple::armeb:
7162 case llvm::Triple::thumbeb:
7163 if (Triple.isOSDarwin())
7164 return new DarwinARMTargetInfo(Triple);
7165
7166 switch (os) {
7167 case llvm::Triple::Linux:
7168 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7169 case llvm::Triple::FreeBSD:
7170 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7171 case llvm::Triple::NetBSD:
7172 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7173 case llvm::Triple::OpenBSD:
7174 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7175 case llvm::Triple::Bitrig:
7176 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7177 case llvm::Triple::RTEMS:
7178 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7179 case llvm::Triple::NaCl:
7180 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7181 default:
7182 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007183 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007184
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007185 case llvm::Triple::bpfeb:
7186 case llvm::Triple::bpfel:
7187 return new BPFTargetInfo(Triple);
7188
Daniel Dunbar52322032009-08-18 05:47:58 +00007189 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007190 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007191
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007192 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007193 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007194 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007195 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007196 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007197 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007198 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007199 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007200 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007201 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007202 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007203 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007204 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007205
7206 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007207 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007208 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007209 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007210 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007211 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007212 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007213 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007214 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007215 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007216 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007217 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007218 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007219 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007220 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007221
Akira Hatanakabef17452011-09-20 19:21:49 +00007222 case llvm::Triple::mips64:
7223 switch (os) {
7224 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007225 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007226 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007227 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007228 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007229 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007230 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007231 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007232 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007233 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007234 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007235 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007236 }
7237
7238 case llvm::Triple::mips64el:
7239 switch (os) {
7240 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007241 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007242 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007243 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007244 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007245 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007246 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007247 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007248 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007249 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007250 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007251 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007252 }
7253
Ivan Krasindd7403e2011-08-24 20:22:22 +00007254 case llvm::Triple::le32:
7255 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007256 case llvm::Triple::NaCl:
7257 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7258 default:
7259 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007260 }
7261
JF Bastien643817d2014-09-12 17:52:47 +00007262 case llvm::Triple::le64:
7263 return new Le64TargetInfo(Triple);
7264
Daniel Dunbar52322032009-08-18 05:47:58 +00007265 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007266 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007267 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007268 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007269 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007270 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007271 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007272 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007273 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007274 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007275 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007276 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007277 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007278 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007279 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007280 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007281 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007282
7283 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007284 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007285 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007286 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007287 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007288 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007289 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007290 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007291 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007292 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007293 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007294 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007295 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007296 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007297 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007298
Bill Schmidt778d3872013-07-26 01:36:11 +00007299 case llvm::Triple::ppc64le:
7300 switch (os) {
7301 case llvm::Triple::Linux:
7302 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007303 case llvm::Triple::NetBSD:
7304 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007305 default:
7306 return new PPC64TargetInfo(Triple);
7307 }
7308
Peter Collingbournec947aae2012-05-20 23:28:41 +00007309 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007310 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007311 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007312 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007313
Tom Stellardd8e38a32015-01-06 20:34:47 +00007314 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007315 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007316 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007317
Daniel Dunbar52322032009-08-18 05:47:58 +00007318 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007319 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007320 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007321 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007322 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007323 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007324 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007325 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007326 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007327 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007328 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007329 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007330 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007331 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007332 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007333
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007334 // The 'sparcel' architecture copies all the above cases except for Solaris.
7335 case llvm::Triple::sparcel:
7336 switch (os) {
7337 case llvm::Triple::Linux:
7338 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7339 case llvm::Triple::NetBSD:
7340 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7341 case llvm::Triple::OpenBSD:
7342 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7343 case llvm::Triple::RTEMS:
7344 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7345 default:
7346 return new SparcV8elTargetInfo(Triple);
7347 }
7348
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007349 case llvm::Triple::sparcv9:
7350 switch (os) {
7351 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007352 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007353 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007354 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007355 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007356 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007357 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007358 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007359 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007360 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007361 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007362 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007363 }
7364
Ulrich Weigand47445072013-05-06 16:26:41 +00007365 case llvm::Triple::systemz:
7366 switch (os) {
7367 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007368 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007369 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007370 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007371 }
7372
Eli Friedmana9c3d712009-08-19 20:47:07 +00007373 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007374 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007375
Daniel Dunbar52322032009-08-18 05:47:58 +00007376 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007377 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007378 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007379
Daniel Dunbar52322032009-08-18 05:47:58 +00007380 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007381 case llvm::Triple::CloudABI:
7382 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007383 case llvm::Triple::Linux: {
7384 switch (Triple.getEnvironment()) {
7385 default:
7386 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7387 case llvm::Triple::Android:
7388 return new AndroidX86_32TargetInfo(Triple);
7389 }
7390 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007391 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007392 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007393 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007394 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007395 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007396 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007397 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007398 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007399 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007400 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007401 case llvm::Triple::KFreeBSD:
7402 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007403 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007404 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007405 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007406 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007407 case llvm::Triple::Win32: {
7408 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007409 case llvm::Triple::Cygnus:
7410 return new CygwinX86_32TargetInfo(Triple);
7411 case llvm::Triple::GNU:
7412 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007413 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007414 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007415 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007416 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007417 }
7418 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007419 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007420 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007421 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007422 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007423 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007424 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007425 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007426 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007427 }
7428
7429 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007430 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007431 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007432
Daniel Dunbar52322032009-08-18 05:47:58 +00007433 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007434 case llvm::Triple::CloudABI:
7435 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007436 case llvm::Triple::Linux: {
7437 switch (Triple.getEnvironment()) {
7438 default:
7439 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7440 case llvm::Triple::Android:
7441 return new AndroidX86_64TargetInfo(Triple);
7442 }
7443 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007444 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007445 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007446 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007447 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007448 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007449 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007450 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007451 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007452 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007453 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007454 case llvm::Triple::KFreeBSD:
7455 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007456 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007457 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007458 case llvm::Triple::Win32: {
7459 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007460 case llvm::Triple::Cygnus:
7461 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007462 case llvm::Triple::GNU:
7463 return new MinGWX86_64TargetInfo(Triple);
7464 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007465 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007466 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007467 }
7468 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007469 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007470 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007471 case llvm::Triple::PS4:
7472 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007473 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007474 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007475 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007476
Douglas Katzman78d7c542015-05-12 21:18:10 +00007477 case llvm::Triple::spir: {
7478 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7479 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7480 return nullptr;
7481 return new SPIR32TargetInfo(Triple);
7482 }
7483 case llvm::Triple::spir64: {
7484 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7485 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7486 return nullptr;
7487 return new SPIR64TargetInfo(Triple);
7488 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007489 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007490}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007491
7492/// CreateTargetInfo - Return the target info object for the specified target
7493/// triple.
Alp Toker80758082014-07-06 05:26:44 +00007494TargetInfo *
7495TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7496 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007497 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007498
7499 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007500 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007501 if (!Target) {
7502 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007503 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007504 }
Alp Toker80758082014-07-06 05:26:44 +00007505 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007506
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007507 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007508 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7509 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007510 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007511 }
7512
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007513 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007514 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7515 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007516 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007517 }
7518
Rafael Espindolaeb265472013-08-21 21:59:03 +00007519 // Set the fp math unit.
7520 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7521 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007522 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007523 }
7524
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007525 // Compute the default target features, we need the target to handle this
7526 // because features may have dependencies on one another.
7527 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00007528 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007529
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007530 // Apply the user specified deltas.
7531 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
7532 I < N; ++I) {
7533 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00007534 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007535 bool Enabled = Name[0] == '+';
7536 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007537 }
7538
7539 // Add the features to the compile options.
7540 //
7541 // FIXME: If we are completely confident that we have the right set, we only
7542 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007543 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007544 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
7545 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00007546 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00007547 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007548 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007549
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007550 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007551}