blob: 993f48ded3831711031e422b6381f2af5c16c556 [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 },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002004#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
2005 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES },
2006#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2007 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002008#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002009};
Eli Friedmanb5366062008-05-20 14:21:01 +00002010
Nuno Lopescfca1f02009-12-23 17:49:57 +00002011static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002012 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2013 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002014 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002015 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2016 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2017 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002018 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002019 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2020 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002021};
2022
Eric Christophercdd36352011-06-21 00:05:20 +00002023const TargetInfo::AddlRegName AddlRegNames[] = {
2024 { { "al", "ah", "eax", "rax" }, 0 },
2025 { { "bl", "bh", "ebx", "rbx" }, 3 },
2026 { { "cl", "ch", "ecx", "rcx" }, 2 },
2027 { { "dl", "dh", "edx", "rdx" }, 1 },
2028 { { "esi", "rsi" }, 4 },
2029 { { "edi", "rdi" }, 5 },
2030 { { "esp", "rsp" }, 7 },
2031 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002032};
2033
2034// X86 target abstract base class; x86-32 and x86-64 are very close, so
2035// most of the implementation can be shared.
2036class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002037 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002038 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00002039 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00002040 enum MMX3DNowEnum {
2041 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
2042 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002043 enum XOPEnum {
2044 NoXOP,
2045 SSE4A,
2046 FMA4,
2047 XOP
2048 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00002049
Eric Christophere1ddaf92010-04-02 23:50:19 +00002050 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00002051 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00002052 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00002053 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00002054 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00002055 bool HasBMI;
2056 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00002057 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00002058 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00002059 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00002060 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00002061 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002062 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00002063 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00002064 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00002065 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
2066 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00002067 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00002068 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002069
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002070 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2071 ///
2072 /// Each enumeration represents a particular CPU supported by Clang. These
2073 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2074 enum CPUKind {
2075 CK_Generic,
2076
2077 /// \name i386
2078 /// i386-generation processors.
2079 //@{
2080 CK_i386,
2081 //@}
2082
2083 /// \name i486
2084 /// i486-generation processors.
2085 //@{
2086 CK_i486,
2087 CK_WinChipC6,
2088 CK_WinChip2,
2089 CK_C3,
2090 //@}
2091
2092 /// \name i586
2093 /// i586-generation processors, P5 microarchitecture based.
2094 //@{
2095 CK_i586,
2096 CK_Pentium,
2097 CK_PentiumMMX,
2098 //@}
2099
2100 /// \name i686
2101 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2102 //@{
2103 CK_i686,
2104 CK_PentiumPro,
2105 CK_Pentium2,
2106 CK_Pentium3,
2107 CK_Pentium3M,
2108 CK_PentiumM,
2109 CK_C3_2,
2110
2111 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2112 /// Clang however has some logic to suport this.
2113 // FIXME: Warn, deprecate, and potentially remove this.
2114 CK_Yonah,
2115 //@}
2116
2117 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002118 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002119 //@{
2120 CK_Pentium4,
2121 CK_Pentium4M,
2122 CK_Prescott,
2123 CK_Nocona,
2124 //@}
2125
2126 /// \name Core
2127 /// Core microarchitecture based processors.
2128 //@{
2129 CK_Core2,
2130
2131 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2132 /// codename which GCC no longer accepts as an option to -march, but Clang
2133 /// has some logic for recognizing it.
2134 // FIXME: Warn, deprecate, and potentially remove this.
2135 CK_Penryn,
2136 //@}
2137
2138 /// \name Atom
2139 /// Atom processors
2140 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002141 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002142 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002143 //@}
2144
2145 /// \name Nehalem
2146 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002147 CK_Nehalem,
2148
2149 /// \name Westmere
2150 /// Westmere microarchitecture based processors.
2151 CK_Westmere,
2152
2153 /// \name Sandy Bridge
2154 /// Sandy Bridge microarchitecture based processors.
2155 CK_SandyBridge,
2156
2157 /// \name Ivy Bridge
2158 /// Ivy Bridge microarchitecture based processors.
2159 CK_IvyBridge,
2160
2161 /// \name Haswell
2162 /// Haswell microarchitecture based processors.
2163 CK_Haswell,
2164
2165 /// \name Broadwell
2166 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002167 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002168
2169 /// \name Skylake
2170 /// Skylake microarchitecture based processors.
2171 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002172
Craig Topper449314e2013-08-20 07:09:39 +00002173 /// \name Knights Landing
2174 /// Knights Landing processor.
2175 CK_KNL,
2176
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002177 /// \name K6
2178 /// K6 architecture processors.
2179 //@{
2180 CK_K6,
2181 CK_K6_2,
2182 CK_K6_3,
2183 //@}
2184
2185 /// \name K7
2186 /// K7 architecture processors.
2187 //@{
2188 CK_Athlon,
2189 CK_AthlonThunderbird,
2190 CK_Athlon4,
2191 CK_AthlonXP,
2192 CK_AthlonMP,
2193 //@}
2194
2195 /// \name K8
2196 /// K8 architecture processors.
2197 //@{
2198 CK_Athlon64,
2199 CK_Athlon64SSE3,
2200 CK_AthlonFX,
2201 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002202 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002203 CK_Opteron,
2204 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002205 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002206 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002207
Benjamin Kramer569f2152012-01-10 11:50:18 +00002208 /// \name Bobcat
2209 /// Bobcat architecture processors.
2210 //@{
2211 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002212 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002213 //@}
2214
2215 /// \name Bulldozer
2216 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002217 //@{
2218 CK_BDVER1,
2219 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002220 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002221 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002222 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002223
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002224 /// This specification is deprecated and will be removed in the future.
2225 /// Users should prefer \see CK_K8.
2226 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002227 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002228 CK_x86_64,
2229 //@}
2230
2231 /// \name Geode
2232 /// Geode processors.
2233 //@{
2234 CK_Geode
2235 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002236 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002237
Rafael Espindolaeb265472013-08-21 21:59:03 +00002238 enum FPMathKind {
2239 FP_Default,
2240 FP_SSE,
2241 FP_387
2242 } FPMath;
2243
Eli Friedman3fd920a2008-08-20 02:34:37 +00002244public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002245 X86TargetInfo(const llvm::Triple &Triple)
2246 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002247 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002248 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2249 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2250 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2251 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2252 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2253 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002254 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002255 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002256 }
Craig Topper3164f332014-03-11 03:39:26 +00002257 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002258 // X87 evaluates with 80 bits "long double" precision.
2259 return SSELevel == NoSSE ? 2 : 0;
2260 }
Craig Topper3164f332014-03-11 03:39:26 +00002261 void getTargetBuiltins(const Builtin::Info *&Records,
2262 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002263 Records = BuiltinInfo;
2264 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002265 }
Craig Topper3164f332014-03-11 03:39:26 +00002266 void getGCCRegNames(const char * const *&Names,
2267 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002268 Names = GCCRegNames;
2269 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002270 }
Craig Topper3164f332014-03-11 03:39:26 +00002271 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2272 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002273 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002274 NumAliases = 0;
2275 }
Craig Topper3164f332014-03-11 03:39:26 +00002276 void getGCCAddlRegNames(const AddlRegName *&Names,
2277 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002278 Names = AddlRegNames;
2279 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002280 }
Eric Christopherd9832702015-06-29 21:00:05 +00002281 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002282 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002283 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002284
Akira Hatanaka974131e2014-09-18 18:17:18 +00002285 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2286
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002287 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2288
Akira Hatanaka974131e2014-09-18 18:17:18 +00002289 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2290
Craig Topper3164f332014-03-11 03:39:26 +00002291 std::string convertConstraint(const char *&Constraint) const override;
2292 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002293 return "~{dirflag},~{fpsr},~{flags}";
2294 }
Craig Topper3164f332014-03-11 03:39:26 +00002295 void getTargetDefines(const LangOptions &Opts,
2296 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002297 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2298 bool Enabled);
2299 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2300 bool Enabled);
2301 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2302 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002303 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2304 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002305 setFeatureEnabledImpl(Features, Name, Enabled);
2306 }
2307 // This exists purely to cut down on the number of virtual calls in
2308 // getDefaultFeatures which calls this repeatedly.
2309 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2310 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002311 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2312 bool hasFeature(StringRef Feature) const override;
2313 bool handleTargetFeatures(std::vector<std::string> &Features,
2314 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002315 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002316 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2317 return "avx512";
2318 else if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002319 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002320 else if (getTriple().getArch() == llvm::Triple::x86 &&
2321 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002322 return "no-mmx";
2323 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002324 }
Craig Topper3164f332014-03-11 03:39:26 +00002325 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002326 CPU = llvm::StringSwitch<CPUKind>(Name)
2327 .Case("i386", CK_i386)
2328 .Case("i486", CK_i486)
2329 .Case("winchip-c6", CK_WinChipC6)
2330 .Case("winchip2", CK_WinChip2)
2331 .Case("c3", CK_C3)
2332 .Case("i586", CK_i586)
2333 .Case("pentium", CK_Pentium)
2334 .Case("pentium-mmx", CK_PentiumMMX)
2335 .Case("i686", CK_i686)
2336 .Case("pentiumpro", CK_PentiumPro)
2337 .Case("pentium2", CK_Pentium2)
2338 .Case("pentium3", CK_Pentium3)
2339 .Case("pentium3m", CK_Pentium3M)
2340 .Case("pentium-m", CK_PentiumM)
2341 .Case("c3-2", CK_C3_2)
2342 .Case("yonah", CK_Yonah)
2343 .Case("pentium4", CK_Pentium4)
2344 .Case("pentium4m", CK_Pentium4M)
2345 .Case("prescott", CK_Prescott)
2346 .Case("nocona", CK_Nocona)
2347 .Case("core2", CK_Core2)
2348 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002349 .Case("bonnell", CK_Bonnell)
2350 .Case("atom", CK_Bonnell) // Legacy name.
2351 .Case("silvermont", CK_Silvermont)
2352 .Case("slm", CK_Silvermont) // Legacy name.
2353 .Case("nehalem", CK_Nehalem)
2354 .Case("corei7", CK_Nehalem) // Legacy name.
2355 .Case("westmere", CK_Westmere)
2356 .Case("sandybridge", CK_SandyBridge)
2357 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2358 .Case("ivybridge", CK_IvyBridge)
2359 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2360 .Case("haswell", CK_Haswell)
2361 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002362 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002363 .Case("skylake", CK_Skylake)
2364 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002365 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002366 .Case("k6", CK_K6)
2367 .Case("k6-2", CK_K6_2)
2368 .Case("k6-3", CK_K6_3)
2369 .Case("athlon", CK_Athlon)
2370 .Case("athlon-tbird", CK_AthlonThunderbird)
2371 .Case("athlon-4", CK_Athlon4)
2372 .Case("athlon-xp", CK_AthlonXP)
2373 .Case("athlon-mp", CK_AthlonMP)
2374 .Case("athlon64", CK_Athlon64)
2375 .Case("athlon64-sse3", CK_Athlon64SSE3)
2376 .Case("athlon-fx", CK_AthlonFX)
2377 .Case("k8", CK_K8)
2378 .Case("k8-sse3", CK_K8SSE3)
2379 .Case("opteron", CK_Opteron)
2380 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002381 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002382 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002383 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002384 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002385 .Case("bdver1", CK_BDVER1)
2386 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002387 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002388 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002389 .Case("x86-64", CK_x86_64)
2390 .Case("geode", CK_Geode)
2391 .Default(CK_Generic);
2392
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002393 // Perform any per-CPU checks necessary to determine if this CPU is
2394 // acceptable.
2395 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2396 // invalid without explaining *why*.
2397 switch (CPU) {
2398 case CK_Generic:
2399 // No processor selected!
2400 return false;
2401
2402 case CK_i386:
2403 case CK_i486:
2404 case CK_WinChipC6:
2405 case CK_WinChip2:
2406 case CK_C3:
2407 case CK_i586:
2408 case CK_Pentium:
2409 case CK_PentiumMMX:
2410 case CK_i686:
2411 case CK_PentiumPro:
2412 case CK_Pentium2:
2413 case CK_Pentium3:
2414 case CK_Pentium3M:
2415 case CK_PentiumM:
2416 case CK_Yonah:
2417 case CK_C3_2:
2418 case CK_Pentium4:
2419 case CK_Pentium4M:
2420 case CK_Prescott:
2421 case CK_K6:
2422 case CK_K6_2:
2423 case CK_K6_3:
2424 case CK_Athlon:
2425 case CK_AthlonThunderbird:
2426 case CK_Athlon4:
2427 case CK_AthlonXP:
2428 case CK_AthlonMP:
2429 case CK_Geode:
2430 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002431 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002432 return false;
2433
2434 // Fallthrough
2435 case CK_Nocona:
2436 case CK_Core2:
2437 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002438 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002439 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002440 case CK_Nehalem:
2441 case CK_Westmere:
2442 case CK_SandyBridge:
2443 case CK_IvyBridge:
2444 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002445 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002446 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002447 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002448 case CK_Athlon64:
2449 case CK_Athlon64SSE3:
2450 case CK_AthlonFX:
2451 case CK_K8:
2452 case CK_K8SSE3:
2453 case CK_Opteron:
2454 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002455 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002456 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002457 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002458 case CK_BDVER1:
2459 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002460 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002461 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002462 case CK_x86_64:
2463 return true;
2464 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002465 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002466 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002467
Craig Topper3164f332014-03-11 03:39:26 +00002468 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002469
Craig Topper3164f332014-03-11 03:39:26 +00002470 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002471 // We accept all non-ARM calling conventions
2472 return (CC == CC_X86ThisCall ||
2473 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002474 CC == CC_X86StdCall ||
2475 CC == CC_X86VectorCall ||
2476 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002477 CC == CC_X86Pascal ||
2478 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002479 }
2480
Craig Topper3164f332014-03-11 03:39:26 +00002481 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002482 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002483 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002484
2485 bool hasSjLjLowering() const override {
2486 return true;
2487 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002488};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002489
Rafael Espindolaeb265472013-08-21 21:59:03 +00002490bool X86TargetInfo::setFPMath(StringRef Name) {
2491 if (Name == "387") {
2492 FPMath = FP_387;
2493 return true;
2494 }
2495 if (Name == "sse") {
2496 FPMath = FP_SSE;
2497 return true;
2498 }
2499 return false;
2500}
2501
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002502void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002503 // FIXME: This *really* should not be here.
2504
2505 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002506 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002507 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002508
Chandler Carruth212334f2011-09-28 08:55:37 +00002509 switch (CPU) {
2510 case CK_Generic:
2511 case CK_i386:
2512 case CK_i486:
2513 case CK_i586:
2514 case CK_Pentium:
2515 case CK_i686:
2516 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002517 break;
2518 case CK_PentiumMMX:
2519 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002520 case CK_K6:
2521 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002522 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002523 break;
2524 case CK_Pentium3:
2525 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002526 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002527 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002528 break;
2529 case CK_PentiumM:
2530 case CK_Pentium4:
2531 case CK_Pentium4M:
2532 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002533 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002534 break;
2535 case CK_Yonah:
2536 case CK_Prescott:
2537 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002538 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002539 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002540 break;
2541 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002542 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002543 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002544 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002545 break;
2546 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002547 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002548 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002549 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002550 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002551 setFeatureEnabledImpl(Features, "avx512f", true);
2552 setFeatureEnabledImpl(Features, "avx512cd", true);
2553 setFeatureEnabledImpl(Features, "avx512dq", true);
2554 setFeatureEnabledImpl(Features, "avx512bw", true);
2555 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002556 // FALLTHROUGH
2557 case CK_Broadwell:
2558 setFeatureEnabledImpl(Features, "rdseed", true);
2559 setFeatureEnabledImpl(Features, "adx", true);
2560 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002561 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002562 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002563 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002564 setFeatureEnabledImpl(Features, "bmi", true);
2565 setFeatureEnabledImpl(Features, "bmi2", true);
2566 setFeatureEnabledImpl(Features, "rtm", true);
2567 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002568 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002569 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002570 setFeatureEnabledImpl(Features, "rdrnd", true);
2571 setFeatureEnabledImpl(Features, "f16c", true);
2572 setFeatureEnabledImpl(Features, "fsgsbase", true);
2573 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002574 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002575 setFeatureEnabledImpl(Features, "avx", true);
2576 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002577 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002578 case CK_Silvermont:
2579 setFeatureEnabledImpl(Features, "aes", true);
2580 setFeatureEnabledImpl(Features, "pclmul", true);
2581 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002582 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002583 setFeatureEnabledImpl(Features, "sse4.2", true);
2584 setFeatureEnabledImpl(Features, "cx16", true);
2585 break;
2586 case CK_KNL:
2587 setFeatureEnabledImpl(Features, "avx512f", true);
2588 setFeatureEnabledImpl(Features, "avx512cd", true);
2589 setFeatureEnabledImpl(Features, "avx512er", true);
2590 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002591 setFeatureEnabledImpl(Features, "rdseed", true);
2592 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002593 setFeatureEnabledImpl(Features, "lzcnt", true);
2594 setFeatureEnabledImpl(Features, "bmi", true);
2595 setFeatureEnabledImpl(Features, "bmi2", true);
2596 setFeatureEnabledImpl(Features, "rtm", true);
2597 setFeatureEnabledImpl(Features, "fma", true);
2598 setFeatureEnabledImpl(Features, "rdrnd", true);
2599 setFeatureEnabledImpl(Features, "f16c", true);
2600 setFeatureEnabledImpl(Features, "fsgsbase", true);
2601 setFeatureEnabledImpl(Features, "aes", true);
2602 setFeatureEnabledImpl(Features, "pclmul", true);
2603 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002604 break;
2605 case CK_K6_2:
2606 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002607 case CK_WinChip2:
2608 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002609 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002610 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002611 case CK_Athlon:
2612 case CK_AthlonThunderbird:
2613 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002614 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002615 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002616 case CK_Athlon4:
2617 case CK_AthlonXP:
2618 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002619 setFeatureEnabledImpl(Features, "sse", true);
2620 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002621 break;
2622 case CK_K8:
2623 case CK_Opteron:
2624 case CK_Athlon64:
2625 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002626 setFeatureEnabledImpl(Features, "sse2", true);
2627 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002628 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002629 case CK_AMDFAM10:
2630 setFeatureEnabledImpl(Features, "sse4a", true);
2631 setFeatureEnabledImpl(Features, "lzcnt", true);
2632 setFeatureEnabledImpl(Features, "popcnt", true);
2633 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002634 case CK_K8SSE3:
2635 case CK_OpteronSSE3:
2636 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002637 setFeatureEnabledImpl(Features, "sse3", true);
2638 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002639 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002640 case CK_BTVER2:
2641 setFeatureEnabledImpl(Features, "avx", true);
2642 setFeatureEnabledImpl(Features, "aes", true);
2643 setFeatureEnabledImpl(Features, "pclmul", true);
2644 setFeatureEnabledImpl(Features, "bmi", true);
2645 setFeatureEnabledImpl(Features, "f16c", true);
2646 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002647 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002648 setFeatureEnabledImpl(Features, "ssse3", true);
2649 setFeatureEnabledImpl(Features, "sse4a", true);
2650 setFeatureEnabledImpl(Features, "lzcnt", true);
2651 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002652 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002653 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002654 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002655 case CK_BDVER4:
2656 setFeatureEnabledImpl(Features, "avx2", true);
2657 setFeatureEnabledImpl(Features, "bmi2", true);
2658 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002659 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002660 setFeatureEnabledImpl(Features, "fsgsbase", true);
2661 // FALLTHROUGH
2662 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002663 setFeatureEnabledImpl(Features, "bmi", true);
2664 setFeatureEnabledImpl(Features, "fma", true);
2665 setFeatureEnabledImpl(Features, "f16c", true);
2666 setFeatureEnabledImpl(Features, "tbm", true);
2667 // FALLTHROUGH
2668 case CK_BDVER1:
2669 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002670 setFeatureEnabledImpl(Features, "xop", true);
2671 setFeatureEnabledImpl(Features, "lzcnt", true);
2672 setFeatureEnabledImpl(Features, "aes", true);
2673 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002674 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002675 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002676 break;
Eli Friedman33465822011-07-08 23:31:17 +00002677 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002678}
2679
Rafael Espindolae62e2792013-08-20 13:44:29 +00002680void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002681 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002682 if (Enabled) {
2683 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002684 case AVX512F:
2685 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002686 case AVX2:
2687 Features["avx2"] = true;
2688 case AVX:
2689 Features["avx"] = true;
2690 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002691 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002692 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002693 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002694 case SSSE3:
2695 Features["ssse3"] = true;
2696 case SSE3:
2697 Features["sse3"] = true;
2698 case SSE2:
2699 Features["sse2"] = true;
2700 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002701 Features["sse"] = true;
2702 case NoSSE:
2703 break;
2704 }
2705 return;
2706 }
2707
2708 switch (Level) {
2709 case NoSSE:
2710 case SSE1:
2711 Features["sse"] = false;
2712 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002713 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2714 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002715 case SSE3:
2716 Features["sse3"] = false;
2717 setXOPLevel(Features, NoXOP, false);
2718 case SSSE3:
2719 Features["ssse3"] = false;
2720 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002721 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002722 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002723 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002724 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002725 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002726 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002727 case AVX2:
2728 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002729 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002730 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002731 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2732 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002733 }
2734}
2735
2736void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002737 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002738 if (Enabled) {
2739 switch (Level) {
2740 case AMD3DNowAthlon:
2741 Features["3dnowa"] = true;
2742 case AMD3DNow:
2743 Features["3dnow"] = true;
2744 case MMX:
2745 Features["mmx"] = true;
2746 case NoMMX3DNow:
2747 break;
2748 }
2749 return;
2750 }
2751
2752 switch (Level) {
2753 case NoMMX3DNow:
2754 case MMX:
2755 Features["mmx"] = false;
2756 case AMD3DNow:
2757 Features["3dnow"] = false;
2758 case AMD3DNowAthlon:
2759 Features["3dnowa"] = false;
2760 }
2761}
2762
2763void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002764 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002765 if (Enabled) {
2766 switch (Level) {
2767 case XOP:
2768 Features["xop"] = true;
2769 case FMA4:
2770 Features["fma4"] = true;
2771 setSSELevel(Features, AVX, true);
2772 case SSE4A:
2773 Features["sse4a"] = true;
2774 setSSELevel(Features, SSE3, true);
2775 case NoXOP:
2776 break;
2777 }
2778 return;
2779 }
2780
2781 switch (Level) {
2782 case NoXOP:
2783 case SSE4A:
2784 Features["sse4a"] = false;
2785 case FMA4:
2786 Features["fma4"] = false;
2787 case XOP:
2788 Features["xop"] = false;
2789 }
2790}
2791
Craig Topper86d79ef2013-09-17 04:51:29 +00002792void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2793 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002794 // This is a bit of a hack to deal with the sse4 target feature when used
2795 // as part of the target attribute. We handle sse4 correctly everywhere
2796 // else. See below for more information on how we handle the sse4 options.
2797 if (Name != "sse4")
2798 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002799
Craig Topper29561122013-09-19 01:13:07 +00002800 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002801 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002802 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002803 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002804 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002805 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002806 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002807 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002808 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002809 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002810 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002811 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002812 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002813 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002814 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002815 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002816 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002817 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002818 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002819 if (Enabled)
2820 setSSELevel(Features, SSE2, Enabled);
2821 } else if (Name == "pclmul") {
2822 if (Enabled)
2823 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002824 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002825 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002826 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002827 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002828 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002829 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002830 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2831 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002832 if (Enabled)
2833 setSSELevel(Features, AVX512F, Enabled);
2834 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002835 if (Enabled)
2836 setSSELevel(Features, AVX, Enabled);
2837 } else if (Name == "fma4") {
2838 setXOPLevel(Features, FMA4, Enabled);
2839 } else if (Name == "xop") {
2840 setXOPLevel(Features, XOP, Enabled);
2841 } else if (Name == "sse4a") {
2842 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002843 } else if (Name == "f16c") {
2844 if (Enabled)
2845 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002846 } else if (Name == "sha") {
2847 if (Enabled)
2848 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002849 } else if (Name == "sse4") {
2850 // We can get here via the __target__ attribute since that's not controlled
2851 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2852 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2853 // disabled.
2854 if (Enabled)
2855 setSSELevel(Features, SSE42, Enabled);
2856 else
2857 setSSELevel(Features, SSE41, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002858 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002859}
2860
Eric Christopher3ff21b32013-10-16 21:26:26 +00002861/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002862/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002863bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002864 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002865 // Remember the maximum enabled sselevel.
2866 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2867 // Ignore disabled features.
2868 if (Features[i][0] == '-')
2869 continue;
2870
Benjamin Kramer27402c62012-03-05 15:10:44 +00002871 StringRef Feature = StringRef(Features[i]).substr(1);
2872
2873 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002874 HasAES = true;
2875 continue;
2876 }
2877
Craig Topper3f122a72012-05-31 05:18:48 +00002878 if (Feature == "pclmul") {
2879 HasPCLMUL = true;
2880 continue;
2881 }
2882
Benjamin Kramer27402c62012-03-05 15:10:44 +00002883 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002884 HasLZCNT = true;
2885 continue;
2886 }
2887
Rafael Espindola89049822013-08-23 20:21:37 +00002888 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002889 HasRDRND = true;
2890 continue;
2891 }
2892
Craig Topper8c7f2512014-11-03 06:51:41 +00002893 if (Feature == "fsgsbase") {
2894 HasFSGSBASE = true;
2895 continue;
2896 }
2897
Benjamin Kramer27402c62012-03-05 15:10:44 +00002898 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002899 HasBMI = true;
2900 continue;
2901 }
2902
Benjamin Kramer27402c62012-03-05 15:10:44 +00002903 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002904 HasBMI2 = true;
2905 continue;
2906 }
2907
Benjamin Kramer27402c62012-03-05 15:10:44 +00002908 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002909 HasPOPCNT = true;
2910 continue;
2911 }
2912
Michael Liao625a8752012-11-10 05:17:46 +00002913 if (Feature == "rtm") {
2914 HasRTM = true;
2915 continue;
2916 }
2917
Michael Liao74f4eaf2013-03-26 17:52:08 +00002918 if (Feature == "prfchw") {
2919 HasPRFCHW = true;
2920 continue;
2921 }
2922
Michael Liaoffaae352013-03-29 05:17:55 +00002923 if (Feature == "rdseed") {
2924 HasRDSEED = true;
2925 continue;
2926 }
2927
Robert Khasanov50e6f582014-09-19 09:53:48 +00002928 if (Feature == "adx") {
2929 HasADX = true;
2930 continue;
2931 }
2932
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002933 if (Feature == "tbm") {
2934 HasTBM = true;
2935 continue;
2936 }
2937
Craig Topperbba778b2012-06-03 21:46:30 +00002938 if (Feature == "fma") {
2939 HasFMA = true;
2940 continue;
2941 }
2942
Manman Rena45358c2012-10-11 00:59:55 +00002943 if (Feature == "f16c") {
2944 HasF16C = true;
2945 continue;
2946 }
2947
Craig Topper679b53a2013-08-21 05:29:10 +00002948 if (Feature == "avx512cd") {
2949 HasAVX512CD = true;
2950 continue;
2951 }
2952
2953 if (Feature == "avx512er") {
2954 HasAVX512ER = true;
2955 continue;
2956 }
2957
2958 if (Feature == "avx512pf") {
2959 HasAVX512PF = true;
2960 continue;
2961 }
2962
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002963 if (Feature == "avx512dq") {
2964 HasAVX512DQ = true;
2965 continue;
2966 }
2967
2968 if (Feature == "avx512bw") {
2969 HasAVX512BW = true;
2970 continue;
2971 }
2972
2973 if (Feature == "avx512vl") {
2974 HasAVX512VL = true;
2975 continue;
2976 }
2977
Ben Langmuir58078d02013-09-19 13:22:04 +00002978 if (Feature == "sha") {
2979 HasSHA = true;
2980 continue;
2981 }
2982
Nick Lewycky50e8f482013-10-05 20:14:27 +00002983 if (Feature == "cx16") {
2984 HasCX16 = true;
2985 continue;
2986 }
2987
Daniel Dunbar979586e2009-11-11 09:38:56 +00002988 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002989 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002990 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002991 .Case("avx2", AVX2)
2992 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002993 .Case("sse4.2", SSE42)
2994 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002995 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002996 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002997 .Case("sse2", SSE2)
2998 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002999 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003000 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003001
Eli Friedman33465822011-07-08 23:31:17 +00003002 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003003 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00003004 .Case("3dnowa", AMD3DNowAthlon)
3005 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00003006 .Case("mmx", MMX)
3007 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003008 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003009
3010 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
3011 .Case("xop", XOP)
3012 .Case("fma4", FMA4)
3013 .Case("sse4a", SSE4A)
3014 .Default(NoXOP);
3015 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003016 }
Eli Friedman33465822011-07-08 23:31:17 +00003017
Craig Topper7481d8a2013-09-10 06:55:47 +00003018 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3019 // Can't do this earlier because we need to be able to explicitly enable
3020 // popcnt and still disable sse4.2.
3021 if (!HasPOPCNT && SSELevel >= SSE42 &&
3022 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
3023 HasPOPCNT = true;
3024 Features.push_back("+popcnt");
3025 }
3026
Yunzhong Gao61089362013-10-16 19:07:02 +00003027 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3028 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
3029 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
3030 HasPRFCHW = true;
3031 Features.push_back("+prfchw");
3032 }
3033
Rafael Espindolaeb265472013-08-21 21:59:03 +00003034 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3035 // matches the selected sse level.
3036 if (FPMath == FP_SSE && SSELevel < SSE1) {
3037 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
3038 return false;
3039 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
3040 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
3041 return false;
3042 }
3043
Eli Friedman33465822011-07-08 23:31:17 +00003044 // Don't tell the backend if we're turning off mmx; it will end up disabling
3045 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00003046 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3047 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00003048 std::vector<std::string>::iterator it;
3049 it = std::find(Features.begin(), Features.end(), "-mmx");
3050 if (it != Features.end())
3051 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00003052 else if (SSELevel > NoSSE)
3053 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Alexey Bataev00396512015-07-02 03:40:19 +00003054
3055 SimdDefaultAlign =
3056 (getABI() == "avx512") ? 512 : (getABI() == "avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003057 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003058}
Chris Lattnerecd49032009-03-02 22:27:17 +00003059
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003060/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3061/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003062void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003063 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003064 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003065 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003066 Builder.defineMacro("__amd64__");
3067 Builder.defineMacro("__amd64");
3068 Builder.defineMacro("__x86_64");
3069 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003070 if (getTriple().getArchName() == "x86_64h") {
3071 Builder.defineMacro("__x86_64h");
3072 Builder.defineMacro("__x86_64h__");
3073 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003074 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003075 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003076 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003077
Chris Lattnerecd49032009-03-02 22:27:17 +00003078 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003079 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3080 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003081 switch (CPU) {
3082 case CK_Generic:
3083 break;
3084 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003085 // The rest are coming from the i386 define above.
3086 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003087 break;
3088 case CK_i486:
3089 case CK_WinChipC6:
3090 case CK_WinChip2:
3091 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003092 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003093 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003094 case CK_PentiumMMX:
3095 Builder.defineMacro("__pentium_mmx__");
3096 Builder.defineMacro("__tune_pentium_mmx__");
3097 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003098 case CK_i586:
3099 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003100 defineCPUMacros(Builder, "i586");
3101 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003102 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003103 case CK_Pentium3:
3104 case CK_Pentium3M:
3105 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003106 Builder.defineMacro("__tune_pentium3__");
3107 // Fallthrough
3108 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003109 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003110 Builder.defineMacro("__tune_pentium2__");
3111 // Fallthrough
3112 case CK_PentiumPro:
3113 Builder.defineMacro("__tune_i686__");
3114 Builder.defineMacro("__tune_pentiumpro__");
3115 // Fallthrough
3116 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003117 Builder.defineMacro("__i686");
3118 Builder.defineMacro("__i686__");
3119 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3120 Builder.defineMacro("__pentiumpro");
3121 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003122 break;
3123 case CK_Pentium4:
3124 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003125 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003126 break;
3127 case CK_Yonah:
3128 case CK_Prescott:
3129 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003130 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003131 break;
3132 case CK_Core2:
3133 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003134 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003135 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003136 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003137 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003138 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003139 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003140 defineCPUMacros(Builder, "slm");
3141 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003142 case CK_Nehalem:
3143 case CK_Westmere:
3144 case CK_SandyBridge:
3145 case CK_IvyBridge:
3146 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003147 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003148 // FIXME: Historically, we defined this legacy name, it would be nice to
3149 // remove it at some point. We've never exposed fine-grained names for
3150 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003151 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003152 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003153 case CK_Skylake:
3154 // FIXME: Historically, we defined this legacy name, it would be nice to
3155 // remove it at some point. This is the only fine-grained CPU macro in the
3156 // main intel CPU line, and it would be better to not have these and force
3157 // people to use ISA macros.
3158 defineCPUMacros(Builder, "skx");
3159 break;
Craig Topper449314e2013-08-20 07:09:39 +00003160 case CK_KNL:
3161 defineCPUMacros(Builder, "knl");
3162 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003163 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003164 Builder.defineMacro("__k6_2__");
3165 Builder.defineMacro("__tune_k6_2__");
3166 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003167 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003168 if (CPU != CK_K6_2) { // In case of fallthrough
3169 // FIXME: GCC may be enabling these in cases where some other k6
3170 // architecture is specified but -m3dnow is explicitly provided. The
3171 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003172 Builder.defineMacro("__k6_3__");
3173 Builder.defineMacro("__tune_k6_3__");
3174 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003175 // Fallthrough
3176 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003177 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003178 break;
3179 case CK_Athlon:
3180 case CK_AthlonThunderbird:
3181 case CK_Athlon4:
3182 case CK_AthlonXP:
3183 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003184 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003185 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003186 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003187 Builder.defineMacro("__tune_athlon_sse__");
3188 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003189 break;
3190 case CK_K8:
3191 case CK_K8SSE3:
3192 case CK_x86_64:
3193 case CK_Opteron:
3194 case CK_OpteronSSE3:
3195 case CK_Athlon64:
3196 case CK_Athlon64SSE3:
3197 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003198 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003199 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003200 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003201 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003202 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003203 case CK_BTVER1:
3204 defineCPUMacros(Builder, "btver1");
3205 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003206 case CK_BTVER2:
3207 defineCPUMacros(Builder, "btver2");
3208 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003209 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003210 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003211 break;
3212 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003213 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003214 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003215 case CK_BDVER3:
3216 defineCPUMacros(Builder, "bdver3");
3217 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003218 case CK_BDVER4:
3219 defineCPUMacros(Builder, "bdver4");
3220 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003221 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003222 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003223 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003224 }
Chris Lattner96e43572009-03-02 22:40:39 +00003225
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003226 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003227 Builder.defineMacro("__REGISTER_PREFIX__", "");
3228
Chris Lattner6df41af2009-04-19 17:32:33 +00003229 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3230 // functions in glibc header files that use FP Stack inline asm which the
3231 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003232 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003233
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003234 if (HasAES)
3235 Builder.defineMacro("__AES__");
3236
Craig Topper3f122a72012-05-31 05:18:48 +00003237 if (HasPCLMUL)
3238 Builder.defineMacro("__PCLMUL__");
3239
Craig Topper22967d42011-12-25 05:06:45 +00003240 if (HasLZCNT)
3241 Builder.defineMacro("__LZCNT__");
3242
Benjamin Kramer1e250392012-07-07 09:39:18 +00003243 if (HasRDRND)
3244 Builder.defineMacro("__RDRND__");
3245
Craig Topper8c7f2512014-11-03 06:51:41 +00003246 if (HasFSGSBASE)
3247 Builder.defineMacro("__FSGSBASE__");
3248
Craig Topper22967d42011-12-25 05:06:45 +00003249 if (HasBMI)
3250 Builder.defineMacro("__BMI__");
3251
3252 if (HasBMI2)
3253 Builder.defineMacro("__BMI2__");
3254
Craig Topper1de83482011-12-29 16:10:46 +00003255 if (HasPOPCNT)
3256 Builder.defineMacro("__POPCNT__");
3257
Michael Liao625a8752012-11-10 05:17:46 +00003258 if (HasRTM)
3259 Builder.defineMacro("__RTM__");
3260
Michael Liao74f4eaf2013-03-26 17:52:08 +00003261 if (HasPRFCHW)
3262 Builder.defineMacro("__PRFCHW__");
3263
Michael Liaoffaae352013-03-29 05:17:55 +00003264 if (HasRDSEED)
3265 Builder.defineMacro("__RDSEED__");
3266
Robert Khasanov50e6f582014-09-19 09:53:48 +00003267 if (HasADX)
3268 Builder.defineMacro("__ADX__");
3269
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003270 if (HasTBM)
3271 Builder.defineMacro("__TBM__");
3272
Rafael Espindolae62e2792013-08-20 13:44:29 +00003273 switch (XOPLevel) {
3274 case XOP:
3275 Builder.defineMacro("__XOP__");
3276 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003277 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003278 case SSE4A:
3279 Builder.defineMacro("__SSE4A__");
3280 case NoXOP:
3281 break;
3282 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003283
Craig Topperbba778b2012-06-03 21:46:30 +00003284 if (HasFMA)
3285 Builder.defineMacro("__FMA__");
3286
Manman Rena45358c2012-10-11 00:59:55 +00003287 if (HasF16C)
3288 Builder.defineMacro("__F16C__");
3289
Craig Topper679b53a2013-08-21 05:29:10 +00003290 if (HasAVX512CD)
3291 Builder.defineMacro("__AVX512CD__");
3292 if (HasAVX512ER)
3293 Builder.defineMacro("__AVX512ER__");
3294 if (HasAVX512PF)
3295 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003296 if (HasAVX512DQ)
3297 Builder.defineMacro("__AVX512DQ__");
3298 if (HasAVX512BW)
3299 Builder.defineMacro("__AVX512BW__");
3300 if (HasAVX512VL)
3301 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003302
Ben Langmuir58078d02013-09-19 13:22:04 +00003303 if (HasSHA)
3304 Builder.defineMacro("__SHA__");
3305
Nick Lewycky50e8f482013-10-05 20:14:27 +00003306 if (HasCX16)
3307 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3308
Chris Lattner96e43572009-03-02 22:40:39 +00003309 // Each case falls through to the previous one here.
3310 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003311 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003312 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003313 case AVX2:
3314 Builder.defineMacro("__AVX2__");
3315 case AVX:
3316 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003317 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003318 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003319 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003320 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003321 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003322 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003323 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003324 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003325 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003326 Builder.defineMacro("__SSE2__");
3327 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003328 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003329 Builder.defineMacro("__SSE__");
3330 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003331 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003332 break;
3333 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003334
Derek Schuffc7dd7222012-10-11 15:52:22 +00003335 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003336 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003337 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003338 case AVX2:
3339 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003340 case SSE42:
3341 case SSE41:
3342 case SSSE3:
3343 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003344 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003345 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003346 break;
3347 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003348 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003349 break;
3350 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003351 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003352 }
3353 }
3354
Anders Carlssone437c682010-01-27 03:47:49 +00003355 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003356 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003357 case AMD3DNowAthlon:
3358 Builder.defineMacro("__3dNOW_A__");
3359 case AMD3DNow:
3360 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003361 case MMX:
3362 Builder.defineMacro("__MMX__");
3363 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003364 break;
3365 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003366
3367 if (CPU >= CK_i486) {
3368 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3369 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3370 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3371 }
3372 if (CPU >= CK_i586)
3373 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003374}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003375
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003376bool X86TargetInfo::hasFeature(StringRef Feature) const {
3377 return llvm::StringSwitch<bool>(Feature)
3378 .Case("aes", HasAES)
3379 .Case("avx", SSELevel >= AVX)
3380 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003381 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003382 .Case("avx512cd", HasAVX512CD)
3383 .Case("avx512er", HasAVX512ER)
3384 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003385 .Case("avx512dq", HasAVX512DQ)
3386 .Case("avx512bw", HasAVX512BW)
3387 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003388 .Case("bmi", HasBMI)
3389 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003390 .Case("cx16", HasCX16)
3391 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003392 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003393 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003394 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003395 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003396 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3397 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3398 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003399 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003400 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003401 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003402 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003403 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003404 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003405 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003406 .Case("sse", SSELevel >= SSE1)
3407 .Case("sse2", SSELevel >= SSE2)
3408 .Case("sse3", SSELevel >= SSE3)
3409 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003410 .Case("sse4.1", SSELevel >= SSE41)
3411 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003412 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003413 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003414 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003415 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3416 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003417 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003418 .Default(false);
3419}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003420
Eric Christopherd9832702015-06-29 21:00:05 +00003421// We can't use a generic validation scheme for the features accepted here
3422// versus subtarget features accepted in the target attribute because the
3423// bitfield structure that's initialized in the runtime only supports the
3424// below currently rather than the full range of subtarget features. (See
3425// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3426bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3427 return llvm::StringSwitch<bool>(FeatureStr)
3428 .Case("cmov", true)
3429 .Case("mmx", true)
3430 .Case("popcnt", true)
3431 .Case("sse", true)
3432 .Case("sse2", true)
3433 .Case("sse3", true)
3434 .Case("sse4.1", true)
3435 .Case("sse4.2", true)
3436 .Case("avx", true)
3437 .Case("avx2", true)
3438 .Case("sse4a", true)
3439 .Case("fma4", true)
3440 .Case("xop", true)
3441 .Case("fma", true)
3442 .Case("avx512f", true)
3443 .Case("bmi", true)
3444 .Case("bmi2", true)
3445 .Default(false);
3446}
3447
Eli Friedman3fd920a2008-08-20 02:34:37 +00003448bool
Anders Carlsson58436352009-02-28 17:11:49 +00003449X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003450 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003451 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003452 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003453 // Constant constraints.
3454 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3455 // instructions.
3456 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3457 // x86_64 instructions.
3458 case 's':
3459 Info.setRequiresImmediate();
3460 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003461 case 'I':
3462 Info.setRequiresImmediate(0, 31);
3463 return true;
3464 case 'J':
3465 Info.setRequiresImmediate(0, 63);
3466 return true;
3467 case 'K':
3468 Info.setRequiresImmediate(-128, 127);
3469 return true;
3470 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003471 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003472 return true;
3473 case 'M':
3474 Info.setRequiresImmediate(0, 3);
3475 return true;
3476 case 'N':
3477 Info.setRequiresImmediate(0, 255);
3478 return true;
3479 case 'O':
3480 Info.setRequiresImmediate(0, 127);
3481 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003482 // Register constraints.
3483 case 'Y': // 'Y' is the first character for several 2-character constraints.
3484 // Shift the pointer to the second character of the constraint.
3485 Name++;
3486 switch (*Name) {
3487 default:
3488 return false;
3489 case '0': // First SSE register.
3490 case 't': // Any SSE register, when SSE2 is enabled.
3491 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3492 case 'm': // Any MMX register, when inter-unit moves enabled.
3493 Info.setAllowsRegister();
3494 return true;
3495 }
3496 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003497 // Constraint 'f' cannot be used for output operands.
3498 if (Info.ConstraintStr[0] == '=')
3499 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003500 Info.setAllowsRegister();
3501 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003502 case 'a': // eax.
3503 case 'b': // ebx.
3504 case 'c': // ecx.
3505 case 'd': // edx.
3506 case 'S': // esi.
3507 case 'D': // edi.
3508 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003509 case 't': // Top of floating point stack.
3510 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003511 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003512 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003513 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003514 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003515 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3516 case 'l': // "Index" registers: any general register that can be used as an
3517 // index in a base+index memory access.
3518 Info.setAllowsRegister();
3519 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003520 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003521 case 'C': // SSE floating point constant.
3522 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003523 return true;
3524 }
3525}
3526
Akira Hatanaka974131e2014-09-18 18:17:18 +00003527bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3528 unsigned Size) const {
3529 // Strip off constraint modifiers.
3530 while (Constraint[0] == '=' ||
3531 Constraint[0] == '+' ||
3532 Constraint[0] == '&')
3533 Constraint = Constraint.substr(1);
3534
3535 return validateOperandSize(Constraint, Size);
3536}
3537
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003538bool X86TargetInfo::validateInputSize(StringRef Constraint,
3539 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003540 return validateOperandSize(Constraint, Size);
3541}
3542
3543bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3544 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003545 switch (Constraint[0]) {
3546 default: break;
3547 case 'y':
3548 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003549 case 'f':
3550 case 't':
3551 case 'u':
3552 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003553 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003554 if (SSELevel >= AVX512F)
3555 // 512-bit zmm registers can be used if target supports AVX512F.
3556 return Size <= 512U;
3557 else if (SSELevel >= AVX)
3558 // 256-bit ymm registers can be used if target supports AVX.
3559 return Size <= 256U;
3560 return Size <= 128U;
3561 case 'Y':
3562 // 'Y' is the first character for several 2-character constraints.
3563 switch (Constraint[1]) {
3564 default: break;
3565 case 'm':
3566 // 'Ym' is synonymous with 'y'.
3567 return Size <= 64;
3568 case 'i':
3569 case 't':
3570 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3571 if (SSELevel >= AVX512F)
3572 return Size <= 512U;
3573 else if (SSELevel >= AVX)
3574 return Size <= 256U;
3575 return SSELevel >= SSE2 && Size <= 128U;
3576 }
3577
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003578 }
3579
3580 return true;
3581}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003582
Eli Friedman3fd920a2008-08-20 02:34:37 +00003583std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003584X86TargetInfo::convertConstraint(const char *&Constraint) const {
3585 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003586 case 'a': return std::string("{ax}");
3587 case 'b': return std::string("{bx}");
3588 case 'c': return std::string("{cx}");
3589 case 'd': return std::string("{dx}");
3590 case 'S': return std::string("{si}");
3591 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003592 case 'p': // address
3593 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003594 case 't': // top of floating point stack.
3595 return std::string("{st}");
3596 case 'u': // second from top of floating point stack.
3597 return std::string("{st(1)}"); // second from top of floating point stack.
3598 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003599 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003600 }
3601}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003602
Eli Friedman3fd920a2008-08-20 02:34:37 +00003603// X86-32 generic target
3604class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003605public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003606 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003607 DoubleAlign = LongLongAlign = 32;
3608 LongDoubleWidth = 96;
3609 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003610 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003611 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003612 SizeType = UnsignedInt;
3613 PtrDiffType = SignedInt;
3614 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003615 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003616
3617 // Use fpret for all types.
3618 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3619 (1 << TargetInfo::Double) |
3620 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003621
3622 // x86-32 has atomics up to 8 bytes
3623 // FIXME: Check that we actually have cmpxchg8b before setting
3624 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3625 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003626 }
Craig Topper3164f332014-03-11 03:39:26 +00003627 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003628 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003629 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003630
Craig Topper3164f332014-03-11 03:39:26 +00003631 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003632 if (RegNo == 0) return 0;
3633 if (RegNo == 1) return 2;
3634 return -1;
3635 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003636 bool validateOperandSize(StringRef Constraint,
3637 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003638 switch (Constraint[0]) {
3639 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003640 case 'R':
3641 case 'q':
3642 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003643 case 'a':
3644 case 'b':
3645 case 'c':
3646 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003647 case 'S':
3648 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003649 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003650 case 'A':
3651 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003652 }
3653
Akira Hatanaka974131e2014-09-18 18:17:18 +00003654 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003655 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003656};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003657
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003658class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3659public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003660 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3661 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003662
Craig Topper3164f332014-03-11 03:39:26 +00003663 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003664 unsigned Major, Minor, Micro;
3665 getTriple().getOSVersion(Major, Minor, Micro);
3666 // New NetBSD uses the default rounding mode.
3667 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3668 return X86_32TargetInfo::getFloatEvalMethod();
3669 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003670 return 1;
3671 }
3672};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003673
Eli Friedmane3aa4542009-07-05 18:47:56 +00003674class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3675public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003676 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3677 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003678 SizeType = UnsignedLong;
3679 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003680 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003681 }
3682};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003683
Eli Friedman9fa28852012-08-08 23:57:20 +00003684class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3685public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003686 BitrigI386TargetInfo(const llvm::Triple &Triple)
3687 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003688 SizeType = UnsignedLong;
3689 IntPtrType = SignedLong;
3690 PtrDiffType = SignedLong;
3691 }
3692};
Eli Friedman9fa28852012-08-08 23:57:20 +00003693
Torok Edwinb2b37c62009-06-30 17:10:35 +00003694class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003695public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003696 DarwinI386TargetInfo(const llvm::Triple &Triple)
3697 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003698 LongDoubleWidth = 128;
3699 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003700 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003701 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003702 SizeType = UnsignedLong;
3703 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003704 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003705 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003706 }
3707
Eli Friedman3fd920a2008-08-20 02:34:37 +00003708};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003709
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003710// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003711class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003712public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003713 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3714 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003715 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003716 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003717 bool IsWinCOFF =
3718 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003719 DataLayoutString = IsWinCOFF
3720 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3721 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003722 }
Craig Topper3164f332014-03-11 03:39:26 +00003723 void getTargetDefines(const LangOptions &Opts,
3724 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003725 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3726 }
3727};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003728
3729// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003730class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003731public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003732 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003733 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003734 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003735 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3736 }
Craig Topper3164f332014-03-11 03:39:26 +00003737 void getTargetDefines(const LangOptions &Opts,
3738 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003739 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3740 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3741 // The value of the following reflects processor type.
3742 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3743 // We lost the original triple, so we use the default.
3744 Builder.defineMacro("_M_IX86", "600");
3745 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003746};
3747} // end anonymous namespace
3748
David Majnemerae1ed0e2015-05-28 04:36:18 +00003749static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3750 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang supports
Reid Kleckner47606832014-04-21 20:58:00 +00003751 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3752 // macro anyway for pre-processor compatibility.
3753 if (Opts.MicrosoftExt)
3754 Builder.defineMacro("__declspec", "__declspec");
3755 else
3756 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3757
3758 if (!Opts.MicrosoftExt) {
3759 // Provide macros for all the calling convention keywords. Provide both
3760 // single and double underscore prefixed variants. These are available on
3761 // x64 as well as x86, even though they have no effect.
3762 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3763 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003764 std::string GCCSpelling = "__attribute__((__";
3765 GCCSpelling += CC;
3766 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003767 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3768 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3769 }
3770 }
3771}
3772
David Majnemerae1ed0e2015-05-28 04:36:18 +00003773static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3774 Builder.defineMacro("__MSVCRT__");
3775 Builder.defineMacro("__MINGW32__");
3776 addCygMingDefines(Opts, Builder);
3777}
3778
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003779namespace {
3780// x86-32 MinGW target
3781class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3782public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003783 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3784 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003785 void getTargetDefines(const LangOptions &Opts,
3786 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003787 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003788 DefineStd(Builder, "WIN32", Opts);
3789 DefineStd(Builder, "WINNT", Opts);
3790 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003791 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003792 }
3793};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003794
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003795// x86-32 Cygwin target
3796class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3797public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003798 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3799 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003800 TLSSupported = false;
3801 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003802 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003803 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 +00003804 }
Craig Topper3164f332014-03-11 03:39:26 +00003805 void getTargetDefines(const LangOptions &Opts,
3806 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003807 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003808 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003809 Builder.defineMacro("__CYGWIN__");
3810 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003811 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003812 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003813 if (Opts.CPlusPlus)
3814 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003815 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003816};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003817
Chris Lattnerb986aba2010-04-11 19:29:39 +00003818// x86-32 Haiku target
3819class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3820public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003821 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003822 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003823 IntPtrType = SignedLong;
3824 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003825 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003826 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003827 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003828 }
Craig Topper3164f332014-03-11 03:39:26 +00003829 void getTargetDefines(const LangOptions &Opts,
3830 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003831 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3832 Builder.defineMacro("__INTEL__");
3833 Builder.defineMacro("__HAIKU__");
3834 }
3835};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003836
Douglas Gregor9fabd852011-07-01 22:41:14 +00003837// RTEMS Target
3838template<typename Target>
3839class RTEMSTargetInfo : public OSTargetInfo<Target> {
3840protected:
Craig Topper3164f332014-03-11 03:39:26 +00003841 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3842 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003843 // RTEMS defines; list based off of gcc output
3844
Douglas Gregor9fabd852011-07-01 22:41:14 +00003845 Builder.defineMacro("__rtems__");
3846 Builder.defineMacro("__ELF__");
3847 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003848
Douglas Gregor9fabd852011-07-01 22:41:14 +00003849public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003850 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3851 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003852
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003853 switch (Triple.getArch()) {
3854 default:
3855 case llvm::Triple::x86:
3856 // this->MCountName = ".mcount";
3857 break;
3858 case llvm::Triple::mips:
3859 case llvm::Triple::mipsel:
3860 case llvm::Triple::ppc:
3861 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003862 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003863 // this->MCountName = "_mcount";
3864 break;
3865 case llvm::Triple::arm:
3866 // this->MCountName = "__mcount";
3867 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003868 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003869 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003870};
3871
Douglas Gregor9fabd852011-07-01 22:41:14 +00003872// x86-32 RTEMS target
3873class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3874public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003875 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003876 SizeType = UnsignedLong;
3877 IntPtrType = SignedLong;
3878 PtrDiffType = SignedLong;
3879 this->UserLabelPrefix = "";
3880 }
Craig Topper3164f332014-03-11 03:39:26 +00003881 void getTargetDefines(const LangOptions &Opts,
3882 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003883 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3884 Builder.defineMacro("__INTEL__");
3885 Builder.defineMacro("__rtems__");
3886 }
3887};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003888
Eli Friedman3fd920a2008-08-20 02:34:37 +00003889// x86-64 generic target
3890class X86_64TargetInfo : public X86TargetInfo {
3891public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003892 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003893 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003894 bool IsWinCOFF =
3895 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003896 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003897 LongDoubleWidth = 128;
3898 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003899 LargeArrayMinWidth = 128;
3900 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003901 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003902 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3903 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3904 IntPtrType = IsX32 ? SignedInt : SignedLong;
3905 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003906 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003907 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003908
Eric Christopher917e9522014-11-18 22:36:15 +00003909 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003910 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3911 : IsWinCOFF
3912 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3913 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003914
3915 // Use fpret only for long double.
3916 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003917
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003918 // Use fp2ret for _Complex long double.
3919 ComplexLongDoubleUsesFP2Ret = true;
3920
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003921 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003922 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003923 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003924 }
Craig Topper3164f332014-03-11 03:39:26 +00003925 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003926 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003927 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003928
Craig Topper3164f332014-03-11 03:39:26 +00003929 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003930 if (RegNo == 0) return 0;
3931 if (RegNo == 1) return 1;
3932 return -1;
3933 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003934
Craig Topper3164f332014-03-11 03:39:26 +00003935 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003936 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003937 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003938 CC == CC_IntelOclBicc ||
3939 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003940 }
3941
Craig Topper3164f332014-03-11 03:39:26 +00003942 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003943 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003944 }
3945
Pavel Chupinfd223e12014-08-04 12:39:43 +00003946 // for x32 we need it here explicitly
3947 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003948};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003949
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003950// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003951class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003952public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003953 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3954 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003955 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003956 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003957 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003958 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003959 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003960 SizeType = UnsignedLongLong;
3961 PtrDiffType = SignedLongLong;
3962 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003963 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003964 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003965
Craig Topper3164f332014-03-11 03:39:26 +00003966 void getTargetDefines(const LangOptions &Opts,
3967 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003968 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003969 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003970 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003971
Craig Topper3164f332014-03-11 03:39:26 +00003972 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003973 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003974 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003975
Craig Topper3164f332014-03-11 03:39:26 +00003976 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003977 switch (CC) {
3978 case CC_X86StdCall:
3979 case CC_X86ThisCall:
3980 case CC_X86FastCall:
3981 return CCCR_Ignore;
3982 case CC_C:
3983 case CC_X86VectorCall:
3984 case CC_IntelOclBicc:
3985 case CC_X86_64SysV:
3986 return CCCR_OK;
3987 default:
3988 return CCCR_Warning;
3989 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003990 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003991};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003992
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003993// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003994class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003995public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003996 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003997 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003998 LongDoubleWidth = LongDoubleAlign = 64;
3999 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004000 }
Craig Topper3164f332014-03-11 03:39:26 +00004001 void getTargetDefines(const LangOptions &Opts,
4002 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004003 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4004 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004005 Builder.defineMacro("_M_X64", "100");
4006 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004007 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004008};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004009
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004010// x86-64 MinGW target
4011class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4012public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004013 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
4014 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00004015 void getTargetDefines(const LangOptions &Opts,
4016 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004017 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004018 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004019 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004020 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004021
4022 // GCC defines this macro when it is using __gxx_personality_seh0.
4023 if (!Opts.SjLjExceptions)
4024 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004025 }
4026};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004027
Yaron Kerend030d112015-07-22 17:38:19 +00004028// x86-64 Cygwin target
4029class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4030public:
4031 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4032 : X86_64TargetInfo(Triple) {
4033 TLSSupported = false;
4034 WCharType = UnsignedShort;
4035 }
4036 void getTargetDefines(const LangOptions &Opts,
4037 MacroBuilder &Builder) const override {
4038 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4039 Builder.defineMacro("__x86_64__");
4040 Builder.defineMacro("__CYGWIN__");
4041 Builder.defineMacro("__CYGWIN64__");
4042 addCygMingDefines(Opts, Builder);
4043 DefineStd(Builder, "unix", Opts);
4044 if (Opts.CPlusPlus)
4045 Builder.defineMacro("_GNU_SOURCE");
4046
4047 // GCC defines this macro when it is using __gxx_personality_seh0.
4048 if (!Opts.SjLjExceptions)
4049 Builder.defineMacro("__SEH__");
4050 }
4051};
4052
Eli Friedman2857ccb2009-07-01 03:36:11 +00004053class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4054public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004055 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4056 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004057 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00004058 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00004059 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4060 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004061 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004062 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004063 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004064 }
4065};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004066
Eli Friedman245f2292009-07-05 22:31:18 +00004067class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4068public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004069 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4070 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004071 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004072 Int64Type = SignedLongLong;
4073 }
4074};
Eli Friedman245f2292009-07-05 22:31:18 +00004075
Eli Friedman9fa28852012-08-08 23:57:20 +00004076class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4077public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004078 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4079 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4080 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004081 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004082 }
4083};
Tim Northover9bb857a2013-01-31 12:13:10 +00004084
Eli Friedmanf05b7722008-08-20 07:44:10 +00004085class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004086 // Possible FPU choices.
4087 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004088 VFP2FPU = (1 << 0),
4089 VFP3FPU = (1 << 1),
4090 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004091 NeonFPU = (1 << 3),
4092 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004093 };
4094
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004095 // Possible HWDiv features.
4096 enum HWDivMode {
4097 HWDivThumb = (1 << 0),
4098 HWDivARM = (1 << 1)
4099 };
4100
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004101 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004102 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004103 }
4104
4105 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4106 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004107
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004108 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004109
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004110 StringRef DefaultCPU;
4111 StringRef CPUProfile;
4112 StringRef CPUAttr;
4113
Rafael Espindolaeb265472013-08-21 21:59:03 +00004114 enum {
4115 FP_Default,
4116 FP_VFP,
4117 FP_Neon
4118 } FPMath;
4119
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004120 unsigned ArchISA;
4121 unsigned ArchKind;
4122 unsigned ArchProfile;
4123 unsigned ArchVersion;
4124
Bernard Ogdenda13af32013-10-24 18:32:51 +00004125 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004126
Logan Chien57086ce2012-10-10 06:56:20 +00004127 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004128 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004129
4130 // Initialized via features.
4131 unsigned SoftFloat : 1;
4132 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004133
Bernard Ogden18b57012013-10-29 09:47:51 +00004134 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004135 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00004136
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004137 // ACLE 6.5.1 Hardware floating point
4138 enum {
4139 HW_FP_HP = (1 << 1), /// half (16-bit)
4140 HW_FP_SP = (1 << 2), /// single (32-bit)
4141 HW_FP_DP = (1 << 3), /// double (64-bit)
4142 };
4143 uint32_t HW_FP;
4144
Chris Lattner5cc15e02010-03-03 19:03:45 +00004145 static const Builtin::Info BuiltinInfo[];
4146
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004147 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004148 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004149
4150 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004151 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004152
Renato Golin9ba39232015-02-27 16:35:48 +00004153 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4154 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4155 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004156 SizeType = UnsignedLong;
4157 else
4158 SizeType = UnsignedInt;
4159
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004160 switch (T.getOS()) {
4161 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004162 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004163 break;
4164 case llvm::Triple::Win32:
4165 WCharType = UnsignedShort;
4166 break;
4167 case llvm::Triple::Linux:
4168 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004169 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4170 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004171 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004172 }
4173
4174 UseBitFieldTypeAlignment = true;
4175
4176 ZeroLengthBitfieldBoundary = 0;
4177
Tim Northover147cd2f2014-10-14 22:12:21 +00004178 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4179 // so set preferred for small types to 32.
4180 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004181 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004182 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4183 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4184 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004185 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004186 DataLayoutString = "e"
4187 "-m:w"
4188 "-p:32:32"
4189 "-i64:64"
4190 "-v128:64:128"
4191 "-a:0:32"
4192 "-n32"
4193 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004194 } else if (T.isOSNaCl()) {
4195 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004196 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004197 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004198 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004199 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4200 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004201 }
4202
4203 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004204 }
4205
4206 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004207 const llvm::Triple &T = getTriple();
4208
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004209 IsAAPCS = false;
4210
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004211 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004212
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004213 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004214 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004215 SizeType = UnsignedInt;
4216 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004217 SizeType = UnsignedLong;
4218
4219 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4220 WCharType = SignedInt;
4221
4222 // Do not respect the alignment of bit-field types when laying out
4223 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4224 UseBitFieldTypeAlignment = false;
4225
4226 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4227 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4228 /// gcc.
4229 ZeroLengthBitfieldBoundary = 32;
4230
Tim Northover147cd2f2014-10-14 22:12:21 +00004231 if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004232 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004233 BigEndian
4234 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4235 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4236 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004237 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004238 BigEndian
4239 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4240 : "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 +00004241
4242 // FIXME: Override "preferred align" for double and long long.
4243 }
4244
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004245 void setArchInfo() {
4246 StringRef ArchName = getTriple().getArchName();
4247
4248 ArchISA = llvm::ARMTargetParser::parseArchISA(ArchName);
4249 DefaultCPU = getDefaultCPU(ArchName);
4250
4251 // SubArch is specified by the target triple
4252 if (!DefaultCPU.empty())
4253 setArchInfo(DefaultCPU);
4254 else
4255 // FIXME ArchInfo should be based on ArchName from triple, not on
4256 // a hard-coded CPU name. Doing so currently causes regressions:
4257 // test/Preprocessor/init.c: __ARM_ARCH_6J__ not defined
4258 setArchInfo(CPU);
4259 }
4260
4261 void setArchInfo(StringRef CPU) {
4262 StringRef SubArch;
4263
4264 // cache TargetParser info
4265 ArchKind = llvm::ARMTargetParser::parseCPUArch(CPU);
4266 SubArch = llvm::ARMTargetParser::getSubArch(ArchKind);
4267 ArchProfile = llvm::ARMTargetParser::parseArchProfile(SubArch);
4268 ArchVersion = llvm::ARMTargetParser::parseArchVersion(SubArch);
4269
4270 // cache CPU related strings
4271 CPUAttr = getCPUAttr();
4272 CPUProfile = getCPUProfile();
4273 }
4274
4275 void setAtomic() {
4276 // when triple does not specify a sub arch,
4277 // then we are not using inline atomics
4278 bool ShouldUseInlineAtomic = DefaultCPU.empty() ?
4279 false :
4280 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4281 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
4282 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4283 if (ArchProfile == llvm::ARM::PK_M) {
4284 MaxAtomicPromoteWidth = 32;
4285 if (ShouldUseInlineAtomic)
4286 MaxAtomicInlineWidth = 32;
4287 }
4288 else {
4289 MaxAtomicPromoteWidth = 64;
4290 if (ShouldUseInlineAtomic)
4291 MaxAtomicInlineWidth = 64;
4292 }
4293 }
4294
4295 bool isThumb() const {
4296 return (ArchISA == llvm::ARM::IK_THUMB);
4297 }
4298
4299 bool supportsThumb() const {
4300 return CPUAttr.count('T') || ArchVersion >= 6;
4301 }
4302
4303 bool supportsThumb2() const {
4304 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4305 }
4306
4307 StringRef getDefaultCPU(StringRef ArchName) const {
4308 const char *DefaultCPU = llvm::ARMTargetParser::getDefaultCPU(ArchName);
4309 return DefaultCPU ? DefaultCPU : "";
4310 }
4311
4312 StringRef getCPUAttr() const {
4313 const char *CPUAttr;
4314 // For most sub-arches, the build attribute CPU name is enough.
4315 // For Cortex variants, it's slightly different.
4316 switch(ArchKind) {
4317 default:
4318 CPUAttr = llvm::ARMTargetParser::getCPUAttr(ArchKind);
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004319 return CPUAttr ? CPUAttr : "";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004320 case llvm::ARM::AK_ARMV6M:
4321 case llvm::ARM::AK_ARMV6SM:
4322 case llvm::ARM::AK_ARMV6HL:
4323 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004324 case llvm::ARM::AK_ARMV7S:
4325 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004326 case llvm::ARM::AK_ARMV7:
4327 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004328 case llvm::ARM::AK_ARMV7L:
4329 case llvm::ARM::AK_ARMV7HL:
4330 return "7A";
4331 case llvm::ARM::AK_ARMV7R:
4332 return "7R";
4333 case llvm::ARM::AK_ARMV7M:
4334 return "7M";
4335 case llvm::ARM::AK_ARMV7EM:
4336 return "7EM";
4337 case llvm::ARM::AK_ARMV8A:
4338 return "8A";
4339 case llvm::ARM::AK_ARMV8_1A:
4340 return "8_1A";
4341 }
4342 }
4343
4344 StringRef getCPUProfile() const {
4345 switch(ArchProfile) {
4346 case llvm::ARM::PK_A:
4347 return "A";
4348 case llvm::ARM::PK_R:
4349 return "R";
4350 case llvm::ARM::PK_M:
4351 return "M";
4352 default:
4353 return "";
4354 }
4355 }
4356
Chris Lattner17df24e2008-04-21 18:56:49 +00004357public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004358 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004359 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004360 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004361 BigEndian = IsBigEndian;
4362
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004363 switch (getTriple().getOS()) {
4364 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004365 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004366 break;
4367 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004368 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004369 break;
4370 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004371
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004372 // cache arch related info
4373 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004374
Chris Lattner1a8f3942010-04-23 16:29:58 +00004375 // {} in inline assembly are neon specifiers, not assembly variant
4376 // specifiers.
4377 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004378
Eric Christopher0e261882014-12-05 01:06:59 +00004379 // FIXME: This duplicates code from the driver that sets the -target-abi
4380 // option - this code is used if -target-abi isn't passed and should
4381 // be unified in some way.
4382 if (Triple.isOSBinFormatMachO()) {
4383 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4384 // the frontend matches that.
4385 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4386 Triple.getOS() == llvm::Triple::UnknownOS ||
4387 StringRef(CPU).startswith("cortex-m")) {
4388 setABI("aapcs");
4389 } else {
4390 setABI("apcs-gnu");
4391 }
4392 } else if (Triple.isOSWindows()) {
4393 // FIXME: this is invalid for WindowsCE
4394 setABI("aapcs");
4395 } else {
4396 // Select the default based on the platform.
4397 switch (Triple.getEnvironment()) {
4398 case llvm::Triple::Android:
4399 case llvm::Triple::GNUEABI:
4400 case llvm::Triple::GNUEABIHF:
4401 setABI("aapcs-linux");
4402 break;
4403 case llvm::Triple::EABIHF:
4404 case llvm::Triple::EABI:
4405 setABI("aapcs");
4406 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004407 case llvm::Triple::GNU:
4408 setABI("apcs-gnu");
4409 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004410 default:
4411 if (Triple.getOS() == llvm::Triple::NetBSD)
4412 setABI("apcs-gnu");
4413 else
4414 setABI("aapcs");
4415 break;
4416 }
4417 }
John McCall86353412010-08-21 22:46:04 +00004418
4419 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004420 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004421
Renato Golin15b86152015-07-03 16:41:13 +00004422 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004423 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004424
James Molloya7139222012-03-12 09:14:10 +00004425 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004426 // the alignment of the zero-length bitfield is greater than the member
4427 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004428 // zero length bitfield.
4429 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004430 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004431
Alp Toker4925ba72014-06-07 23:30:42 +00004432 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004433
Craig Topper3164f332014-03-11 03:39:26 +00004434 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004435 ABI = Name;
4436
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004437 // The defaults (above) are for AAPCS, check if we need to change them.
4438 //
4439 // FIXME: We need support for -meabi... we could just mangle it into the
4440 // name.
4441 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004442 setABIAPCS();
4443 return true;
4444 }
4445 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4446 setABIAAPCS();
4447 return true;
4448 }
4449 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004450 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004451
Renato Golinf5c4dec2015-05-27 13:33:00 +00004452 // FIXME: This should be based on Arch attributes, not CPU names.
Craig Topper3164f332014-03-11 03:39:26 +00004453 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004454 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4455 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004456 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004457 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004458 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004459 }
4460 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004461 Features["vfp4"] = true;
4462 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004463 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4464 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004465 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004466 Features["vfp4"] = true;
4467 Features["neon"] = true;
4468 Features["hwdiv"] = true;
4469 Features["hwdiv-arm"] = true;
Tim Northoverf9b517c2015-05-01 21:17:25 +00004470 } else if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
4471 CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004472 Features["fp-armv8"] = true;
4473 Features["neon"] = true;
4474 Features["hwdiv"] = true;
4475 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004476 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004477 Features["crypto"] = true;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004478 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" || ArchVersion == 8) {
Silviu Barangae5690462013-10-21 10:59:33 +00004479 Features["hwdiv"] = true;
4480 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004481 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
Javed Absar879d18b82015-04-09 14:12:10 +00004482 CPU == "sc300" || CPU == "cortex-r4" || CPU == "cortex-r4f") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004483 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004484 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004485 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004486
Craig Topper3164f332014-03-11 03:39:26 +00004487 bool handleTargetFeatures(std::vector<std::string> &Features,
4488 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004489 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004490 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004491 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004492 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004493 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004494
Ranjeet Singhac08e532015-06-24 23:39:25 +00004495 // This does not diagnose illegal cases like having both
4496 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4497 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004498 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004499 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004500 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004501 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004502 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004503 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004504 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004505 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004506 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004507 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004508 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004509 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004510 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004511 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004512 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004513 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004514 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004515 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004516 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004517 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004518 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004519 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004520 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004521 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004522 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004523 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004524 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004525 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004526 } else if (Feature == "+fp-only-sp") {
Ranjeet Singhac08e532015-06-24 23:39:25 +00004527 HW_FP_remove |= HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004528 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004529 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004530 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004531
Rafael Espindolaeb265472013-08-21 21:59:03 +00004532 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4533 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4534 return false;
4535 }
4536
4537 if (FPMath == FP_Neon)
4538 Features.push_back("+neonfp");
4539 else if (FPMath == FP_VFP)
4540 Features.push_back("-neonfp");
4541
Daniel Dunbar893d4752009-12-19 04:15:38 +00004542 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004543 auto Feature =
4544 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4545 if (Feature != Features.end())
4546 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004547
Rafael Espindolaeb265472013-08-21 21:59:03 +00004548 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004549 }
4550
Craig Topper3164f332014-03-11 03:39:26 +00004551 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004552 return llvm::StringSwitch<bool>(Feature)
4553 .Case("arm", true)
4554 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004555 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004556 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004557 .Case("hwdiv", HWDiv & HWDivThumb)
4558 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004559 .Default(false);
4560 }
Renato Golin15b86152015-07-03 16:41:13 +00004561
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004562 bool setCPU(const std::string &Name) override {
Renato Golin15b86152015-07-03 16:41:13 +00004563 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(Name);
4564 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004565 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004566 setArchInfo(Name);
4567 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004568 CPU = Name;
4569 return true;
4570 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004571
Craig Topper3164f332014-03-11 03:39:26 +00004572 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004573
Craig Topper3164f332014-03-11 03:39:26 +00004574 void getTargetDefines(const LangOptions &Opts,
4575 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004576 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004577 Builder.defineMacro("__arm");
4578 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004579
Chris Lattnerecd49032009-03-02 22:27:17 +00004580 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004581 Builder.defineMacro("__REGISTER_PREFIX__", "");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004582 if (!CPUAttr.empty())
4583 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004584
4585 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004586 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004587 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004588 if (ArchVersion >= 8) {
Eric Christopher917e9522014-11-18 22:36:15 +00004589 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4590 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004591 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004592
4593 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4594 // is not defined for the M-profile.
4595 // NOTE that the deffault profile is assumed to be 'A'
4596 if (CPUProfile.empty() || CPUProfile != "M")
4597 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4598
4599 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4600 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4601 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004602 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004603 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004604 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004605 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4606
4607 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4608 // instruction set such as ARM or Thumb.
4609 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4610
4611 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4612
4613 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004614 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004615 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004616
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004617 // ACLE 6.5.1 Hardware Floating Point
4618 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004619 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004620
Yi Konga44c4d72014-06-27 21:25:42 +00004621 // ACLE predefines.
4622 Builder.defineMacro("__ARM_ACLE", "200");
4623
Mike Stump9d54bd72009-04-08 02:07:04 +00004624 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004625
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004626 // FIXME: It's more complicated than this and we don't really support
4627 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004628 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004629 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004630 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004631
David Tweed8f676532012-10-25 13:33:01 +00004632 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004633 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004634 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4635 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004636 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004637 Builder.defineMacro("__ARM_PCS", "1");
4638
David Tweed8f676532012-10-25 13:33:01 +00004639 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004640 Builder.defineMacro("__ARM_PCS_VFP", "1");
4641 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004642
Daniel Dunbar893d4752009-12-19 04:15:38 +00004643 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004644 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004645
4646 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004647 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004648
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004649 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004650 Builder.defineMacro("__THUMBEL__");
4651 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004652 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004653 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004654 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004655 if (((HWDiv & HWDivThumb) && isThumb()) || ((HWDiv & HWDivARM) && !isThumb()))
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004656 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004657
4658 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004659 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004660
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004661 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004662 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004663 if (FPU & VFP2FPU)
4664 Builder.defineMacro("__ARM_VFPV2__");
4665 if (FPU & VFP3FPU)
4666 Builder.defineMacro("__ARM_VFPV3__");
4667 if (FPU & VFP4FPU)
4668 Builder.defineMacro("__ARM_VFPV4__");
4669 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004670
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004671 // This only gets set when Neon instructions are actually available, unlike
4672 // the VFP define, hence the soft float and arch check. This is subtly
4673 // different from gcc, we follow the intent which was that it should be set
4674 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004675 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Tim Northover5bb34ca2013-11-21 12:36:34 +00004676 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004677 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004678 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004679
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004680 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4681 Opts.ShortWChar ? "2" : "4");
4682
4683 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4684 Opts.ShortEnums ? "1" : "4");
4685
Bernard Ogden18b57012013-10-29 09:47:51 +00004686 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004687 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004688
Tim Northover02e38602014-02-03 17:28:04 +00004689 if (Crypto)
4690 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4691
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004692 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004693 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4694 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4695 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4696 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4697 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004698
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004699 bool is5EOrAbove = (ArchVersion >= 6 ||
4700 (ArchVersion == 5 && CPUAttr.count('E')));
4701 // FIXME: We are not getting all 32-bit ARM architectures
4702 bool is32Bit = (!isThumb() || supportsThumb2());
4703 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUAttr == "7EM"))
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004704 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004705 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004706
Craig Topper3164f332014-03-11 03:39:26 +00004707 void getTargetBuiltins(const Builtin::Info *&Records,
4708 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004709 Records = BuiltinInfo;
4710 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004711 }
Craig Topper3164f332014-03-11 03:39:26 +00004712 bool isCLZForZeroUndef() const override { return false; }
4713 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004714 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004715 }
Craig Topper3164f332014-03-11 03:39:26 +00004716 void getGCCRegNames(const char * const *&Names,
4717 unsigned &NumNames) const override;
4718 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4719 unsigned &NumAliases) const override;
4720 bool validateAsmConstraint(const char *&Name,
4721 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004722 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004723 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004724 case 'l': // r0-r7
4725 case 'h': // r8-r15
4726 case 'w': // VFP Floating point register single precision
4727 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004728 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004729 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004730 case 'I':
4731 case 'J':
4732 case 'K':
4733 case 'L':
4734 case 'M':
4735 // FIXME
4736 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004737 case 'Q': // A memory address that is a single base register.
4738 Info.setAllowsMemory();
4739 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004740 case 'U': // a memory reference...
4741 switch (Name[1]) {
4742 case 'q': // ...ARMV4 ldrsb
4743 case 'v': // ...VFP load/store (reg+constant offset)
4744 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004745 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004746 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004747 case 'n': // valid address for Neon doubleword vector load/store
4748 case 'm': // valid address for Neon element and structure load/store
4749 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004750 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004751 Info.setAllowsMemory();
4752 Name++;
4753 return true;
4754 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004755 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004756 return false;
4757 }
Craig Topper3164f332014-03-11 03:39:26 +00004758 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004759 std::string R;
4760 switch (*Constraint) {
4761 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004762 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004763 Constraint++;
4764 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004765 case 'p': // 'p' should be translated to 'r' by default.
4766 R = std::string("r");
4767 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004768 default:
4769 return std::string(1, *Constraint);
4770 }
4771 return R;
4772 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004773 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004774 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004775 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004776 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004777 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004778
Bill Wendling9d1ee112012-10-25 23:28:48 +00004779 // Strip off constraint modifiers.
4780 while (Constraint[0] == '=' ||
4781 Constraint[0] == '+' ||
4782 Constraint[0] == '&')
4783 Constraint = Constraint.substr(1);
4784
4785 switch (Constraint[0]) {
4786 default: break;
4787 case 'r': {
4788 switch (Modifier) {
4789 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004790 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004791 case 'q':
4792 // A register of size 32 cannot fit a vector type.
4793 return false;
4794 }
4795 }
4796 }
4797
4798 return true;
4799 }
Craig Topper3164f332014-03-11 03:39:26 +00004800 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004801 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004802 return "";
4803 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004804
Craig Topper3164f332014-03-11 03:39:26 +00004805 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004806 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4807 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004808
Craig Topper3164f332014-03-11 03:39:26 +00004809 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004810 if (RegNo == 0) return 0;
4811 if (RegNo == 1) return 1;
4812 return -1;
4813 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004814
4815 bool hasSjLjLowering() const override {
4816 return true;
4817 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004818};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004819
Rafael Espindolaeb265472013-08-21 21:59:03 +00004820bool ARMTargetInfo::setFPMath(StringRef Name) {
4821 if (Name == "neon") {
4822 FPMath = FP_Neon;
4823 return true;
4824 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4825 Name == "vfp4") {
4826 FPMath = FP_VFP;
4827 return true;
4828 }
4829 return false;
4830}
4831
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004832const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004833 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004834 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004835 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4836
4837 // Float registers
4838 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4839 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4840 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004841 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004842
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004843 // Double registers
4844 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4845 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004846 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4847 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004848
4849 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004850 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4851 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004852};
4853
4854void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004855 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004856 Names = GCCRegNames;
4857 NumNames = llvm::array_lengthof(GCCRegNames);
4858}
4859
4860const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004861 { { "a1" }, "r0" },
4862 { { "a2" }, "r1" },
4863 { { "a3" }, "r2" },
4864 { { "a4" }, "r3" },
4865 { { "v1" }, "r4" },
4866 { { "v2" }, "r5" },
4867 { { "v3" }, "r6" },
4868 { { "v4" }, "r7" },
4869 { { "v5" }, "r8" },
4870 { { "v6", "rfp" }, "r9" },
4871 { { "sl" }, "r10" },
4872 { { "fp" }, "r11" },
4873 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004874 { { "r13" }, "sp" },
4875 { { "r14" }, "lr" },
4876 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004877 // The S, D and Q registers overlap, but aren't really aliases; we
4878 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004879};
4880
4881void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4882 unsigned &NumAliases) const {
4883 Aliases = GCCRegAliases;
4884 NumAliases = llvm::array_lengthof(GCCRegAliases);
4885}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004886
4887const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004888#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004889#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004890 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004891#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004892
4893#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004894#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004895#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4896 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004897#include "clang/Basic/BuiltinsARM.def"
4898};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004899
4900class ARMleTargetInfo : public ARMTargetInfo {
4901public:
4902 ARMleTargetInfo(const llvm::Triple &Triple)
4903 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004904 void getTargetDefines(const LangOptions &Opts,
4905 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004906 Builder.defineMacro("__ARMEL__");
4907 ARMTargetInfo::getTargetDefines(Opts, Builder);
4908 }
4909};
4910
4911class ARMbeTargetInfo : public ARMTargetInfo {
4912public:
4913 ARMbeTargetInfo(const llvm::Triple &Triple)
4914 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004915 void getTargetDefines(const LangOptions &Opts,
4916 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004917 Builder.defineMacro("__ARMEB__");
4918 Builder.defineMacro("__ARM_BIG_ENDIAN");
4919 ARMTargetInfo::getTargetDefines(Opts, Builder);
4920 }
4921};
Chris Lattner17df24e2008-04-21 18:56:49 +00004922
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004923class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4924 const llvm::Triple Triple;
4925public:
4926 WindowsARMTargetInfo(const llvm::Triple &Triple)
4927 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4928 TLSSupported = false;
4929 WCharType = UnsignedShort;
4930 SizeType = UnsignedInt;
4931 UserLabelPrefix = "";
4932 }
4933 void getVisualStudioDefines(const LangOptions &Opts,
4934 MacroBuilder &Builder) const {
4935 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4936
4937 // FIXME: this is invalid for WindowsCE
4938 Builder.defineMacro("_M_ARM_NT", "1");
4939 Builder.defineMacro("_M_ARMT", "_M_ARM");
4940 Builder.defineMacro("_M_THUMB", "_M_ARM");
4941
4942 assert((Triple.getArch() == llvm::Triple::arm ||
4943 Triple.getArch() == llvm::Triple::thumb) &&
4944 "invalid architecture for Windows ARM target info");
4945 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4946 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4947
4948 // TODO map the complete set of values
4949 // 31: VFPv3 40: VFPv4
4950 Builder.defineMacro("_M_ARM_FP", "31");
4951 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004952 BuiltinVaListKind getBuiltinVaListKind() const override {
4953 return TargetInfo::CharPtrBuiltinVaList;
4954 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004955};
4956
4957// Windows ARM + Itanium C++ ABI Target
4958class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4959public:
4960 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4961 : WindowsARMTargetInfo(Triple) {
4962 TheCXXABI.set(TargetCXXABI::GenericARM);
4963 }
4964
4965 void getTargetDefines(const LangOptions &Opts,
4966 MacroBuilder &Builder) const override {
4967 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4968
4969 if (Opts.MSVCCompat)
4970 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4971 }
4972};
4973
4974// Windows ARM, MS (C++) ABI
4975class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4976public:
4977 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4978 : WindowsARMTargetInfo(Triple) {
4979 TheCXXABI.set(TargetCXXABI::Microsoft);
4980 }
4981
4982 void getTargetDefines(const LangOptions &Opts,
4983 MacroBuilder &Builder) const override {
4984 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4985 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4986 }
4987};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004988
Yaron Keren321249c2015-07-15 13:32:23 +00004989// ARM MinGW target
4990class MinGWARMTargetInfo : public WindowsARMTargetInfo {
4991public:
4992 MinGWARMTargetInfo(const llvm::Triple &Triple)
4993 : WindowsARMTargetInfo(Triple) {
4994 TheCXXABI.set(TargetCXXABI::GenericARM);
4995 }
4996
4997 void getTargetDefines(const LangOptions &Opts,
4998 MacroBuilder &Builder) const override {
4999 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5000 DefineStd(Builder, "WIN32", Opts);
5001 DefineStd(Builder, "WINNT", Opts);
5002 Builder.defineMacro("_ARM_");
5003 addMinGWDefines(Opts, Builder);
5004 }
5005};
5006
5007// ARM Cygwin target
5008class CygwinARMTargetInfo : public ARMleTargetInfo {
5009public:
5010 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5011 TLSSupported = false;
5012 WCharType = UnsignedShort;
5013 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005014 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005015 }
5016 void getTargetDefines(const LangOptions &Opts,
5017 MacroBuilder &Builder) const override {
5018 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5019 Builder.defineMacro("_ARM_");
5020 Builder.defineMacro("__CYGWIN__");
5021 Builder.defineMacro("__CYGWIN32__");
5022 DefineStd(Builder, "unix", Opts);
5023 if (Opts.CPlusPlus)
5024 Builder.defineMacro("_GNU_SOURCE");
5025 }
5026};
5027
Mike Stump11289f42009-09-09 15:08:12 +00005028class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005029 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005030protected:
Craig Topper3164f332014-03-11 03:39:26 +00005031 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5032 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005033 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005034 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005035
Torok Edwinb2b37c62009-06-30 17:10:35 +00005036public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005037 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005038 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005039 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005040 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005041 // FIXME: This should be based off of the target features in
5042 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005043 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005044
5045 // Darwin on iOS uses a variant of the ARM C++ ABI.
5046 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005047 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005048};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005049
Tim Northover573cbee2014-05-24 12:52:07 +00005050class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005051 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005052 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5053 static const char *const GCCRegNames[];
5054
James Molloy75f5f9e2014-04-16 15:33:48 +00005055 enum FPUModeEnum {
5056 FPUMode,
5057 NeonMode
5058 };
5059
5060 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005061 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005062 unsigned Crypto;
5063
Tim Northovera2ee4332014-03-29 15:09:45 +00005064 static const Builtin::Info BuiltinInfo[];
5065
5066 std::string ABI;
5067
5068public:
Tim Northover573cbee2014-05-24 12:52:07 +00005069 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005070 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005071
5072 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5073 WCharType = SignedInt;
5074
5075 // NetBSD apparently prefers consistency across ARM targets to consistency
5076 // across 64-bit targets.
5077 Int64Type = SignedLongLong;
5078 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005079 } else {
5080 WCharType = UnsignedInt;
5081 Int64Type = SignedLong;
5082 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005083 }
5084
Tim Northovera2ee4332014-03-29 15:09:45 +00005085 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005086 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005087 MaxAtomicInlineWidth = 128;
5088 MaxAtomicPromoteWidth = 128;
5089
Tim Northovera6a19f12015-02-06 01:25:07 +00005090 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005091 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5092
Tim Northovera2ee4332014-03-29 15:09:45 +00005093 // {} in inline assembly are neon specifiers, not assembly variant
5094 // specifiers.
5095 NoAsmVariants = true;
5096
Tim Northover7ad87af2015-01-16 18:44:04 +00005097 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5098 // contributes to the alignment of the containing aggregate in the same way
5099 // a plain (non bit-field) member of that type would, without exception for
5100 // zero-sized or anonymous bit-fields."
5101 UseBitFieldTypeAlignment = true;
5102 UseZeroLengthBitfieldAlignment = true;
5103
Tim Northover573cbee2014-05-24 12:52:07 +00005104 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005105 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5106 }
5107
Alp Toker4925ba72014-06-07 23:30:42 +00005108 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005109 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005110 if (Name != "aapcs" && Name != "darwinpcs")
5111 return false;
5112
5113 ABI = Name;
5114 return true;
5115 }
5116
David Blaikie1cbb9712014-11-14 19:09:44 +00005117 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005118 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005119 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005120 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005121 .Case("cyclone", true)
5122 .Default(false);
5123 return CPUKnown;
5124 }
5125
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005126 void getTargetDefines(const LangOptions &Opts,
5127 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005128 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005129 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005130
5131 // Target properties.
5132 Builder.defineMacro("_LP64");
5133 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005134
5135 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5136 Builder.defineMacro("__ARM_ACLE", "200");
5137 Builder.defineMacro("__ARM_ARCH", "8");
5138 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5139
5140 Builder.defineMacro("__ARM_64BIT_STATE");
5141 Builder.defineMacro("__ARM_PCS_AAPCS64");
5142 Builder.defineMacro("__ARM_ARCH_ISA_A64");
5143
5144 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
5145 Builder.defineMacro("__ARM_FEATURE_CLZ");
5146 Builder.defineMacro("__ARM_FEATURE_FMA");
5147 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00005148 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
5149 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
5150 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
5151 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00005152
5153 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5154
5155 // 0xe implies support for half, single and double precision operations.
5156 Builder.defineMacro("__ARM_FP", "0xe");
5157
5158 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5159 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
5160 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
5161
5162 if (Opts.FastMath || Opts.FiniteMathOnly)
5163 Builder.defineMacro("__ARM_FP_FAST");
5164
Richard Smithab506ad2014-10-20 23:26:58 +00005165 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00005166 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
5167
5168 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5169
5170 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5171 Opts.ShortEnums ? "1" : "4");
5172
James Molloy75f5f9e2014-04-16 15:33:48 +00005173 if (FPU == NeonMode) {
5174 Builder.defineMacro("__ARM_NEON");
5175 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00005176 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00005177 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005178
Bradley Smith418c5932014-05-02 15:17:51 +00005179 if (CRC)
5180 Builder.defineMacro("__ARM_FEATURE_CRC32");
5181
James Molloy75f5f9e2014-04-16 15:33:48 +00005182 if (Crypto)
5183 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Reid Klecknerd167d422015-05-06 15:31:46 +00005184
5185 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5186 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5187 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5188 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5189 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005190 }
5191
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005192 void getTargetBuiltins(const Builtin::Info *&Records,
5193 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005194 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00005195 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00005196 }
5197
David Blaikie1cbb9712014-11-14 19:09:44 +00005198 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005199 return Feature == "aarch64" ||
5200 Feature == "arm64" ||
5201 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005202 }
5203
James Molloy5e73df52014-04-16 15:06:20 +00005204 bool handleTargetFeatures(std::vector<std::string> &Features,
5205 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005206 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005207 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005208 Crypto = 0;
5209 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5210 if (Features[i] == "+neon")
5211 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005212 if (Features[i] == "+crc")
5213 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005214 if (Features[i] == "+crypto")
5215 Crypto = 1;
5216 }
5217
Eric Christopher964a5f32015-08-05 23:48:05 +00005218 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005219
5220 return true;
5221 }
5222
David Blaikie1cbb9712014-11-14 19:09:44 +00005223 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005224
David Blaikie1cbb9712014-11-14 19:09:44 +00005225 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005226 return TargetInfo::AArch64ABIBuiltinVaList;
5227 }
5228
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005229 void getGCCRegNames(const char *const *&Names,
5230 unsigned &NumNames) const override;
5231 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5232 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005233
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005234 bool validateAsmConstraint(const char *&Name,
5235 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005236 switch (*Name) {
5237 default:
5238 return false;
5239 case 'w': // Floating point and SIMD registers (V0-V31)
5240 Info.setAllowsRegister();
5241 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005242 case 'I': // Constant that can be used with an ADD instruction
5243 case 'J': // Constant that can be used with a SUB instruction
5244 case 'K': // Constant that can be used with a 32-bit logical instruction
5245 case 'L': // Constant that can be used with a 64-bit logical instruction
5246 case 'M': // Constant that can be used as a 32-bit MOV immediate
5247 case 'N': // Constant that can be used as a 64-bit MOV immediate
5248 case 'Y': // Floating point constant zero
5249 case 'Z': // Integer constant zero
5250 return true;
5251 case 'Q': // A memory reference with base register and no offset
5252 Info.setAllowsMemory();
5253 return true;
5254 case 'S': // A symbolic address
5255 Info.setAllowsRegister();
5256 return true;
5257 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005258 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5259 // Utf: A memory address suitable for ldp/stp in TF mode.
5260 // Usa: An absolute symbolic address.
5261 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5262 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005263 case 'z': // Zero register, wzr or xzr
5264 Info.setAllowsRegister();
5265 return true;
5266 case 'x': // Floating point and SIMD registers (V0-V15)
5267 Info.setAllowsRegister();
5268 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005269 }
5270 return false;
5271 }
5272
Akira Hatanaka987f1862014-08-22 06:05:21 +00005273 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005274 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005275 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005276 // Strip off constraint modifiers.
5277 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5278 Constraint = Constraint.substr(1);
5279
5280 switch (Constraint[0]) {
5281 default:
5282 return true;
5283 case 'z':
5284 case 'r': {
5285 switch (Modifier) {
5286 case 'x':
5287 case 'w':
5288 // For now assume that the person knows what they're
5289 // doing with the modifier.
5290 return true;
5291 default:
5292 // By default an 'r' constraint will be in the 'x'
5293 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005294 if (Size == 64)
5295 return true;
5296
5297 SuggestedModifier = "w";
5298 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005299 }
5300 }
5301 }
5302 }
5303
David Blaikie1cbb9712014-11-14 19:09:44 +00005304 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005305
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005306 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005307 if (RegNo == 0)
5308 return 0;
5309 if (RegNo == 1)
5310 return 1;
5311 return -1;
5312 }
5313};
5314
Tim Northover573cbee2014-05-24 12:52:07 +00005315const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005316 // 32-bit Integer registers
5317 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5318 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5319 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5320
5321 // 64-bit Integer registers
5322 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5323 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5324 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5325
5326 // 32-bit floating point regsisters
5327 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5328 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5329 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5330
5331 // 64-bit floating point regsisters
5332 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5333 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5334 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5335
5336 // Vector registers
5337 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5338 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5339 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5340};
5341
Tim Northover573cbee2014-05-24 12:52:07 +00005342void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005343 unsigned &NumNames) const {
5344 Names = GCCRegNames;
5345 NumNames = llvm::array_lengthof(GCCRegNames);
5346}
5347
Tim Northover573cbee2014-05-24 12:52:07 +00005348const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005349 { { "w31" }, "wsp" },
5350 { { "x29" }, "fp" },
5351 { { "x30" }, "lr" },
5352 { { "x31" }, "sp" },
5353 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5354 // don't want to substitute one of these for a different-sized one.
5355};
5356
Tim Northover573cbee2014-05-24 12:52:07 +00005357void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005358 unsigned &NumAliases) const {
5359 Aliases = GCCRegAliases;
5360 NumAliases = llvm::array_lengthof(GCCRegAliases);
5361}
5362
Tim Northover573cbee2014-05-24 12:52:07 +00005363const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005364#define BUILTIN(ID, TYPE, ATTRS) \
5365 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5366#include "clang/Basic/BuiltinsNEON.def"
5367
5368#define BUILTIN(ID, TYPE, ATTRS) \
5369 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00005370#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005371};
James Molloy5e73df52014-04-16 15:06:20 +00005372
Tim Northover573cbee2014-05-24 12:52:07 +00005373class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005374 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005375 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005376 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005377 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005378 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005379 }
5380
5381public:
Tim Northover573cbee2014-05-24 12:52:07 +00005382 AArch64leTargetInfo(const llvm::Triple &Triple)
5383 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005384 BigEndian = false;
5385 }
5386 void getTargetDefines(const LangOptions &Opts,
5387 MacroBuilder &Builder) const override {
5388 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005389 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005390 }
5391};
5392
Tim Northover573cbee2014-05-24 12:52:07 +00005393class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005394 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005395 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005396 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005397 }
5398
5399public:
Tim Northover573cbee2014-05-24 12:52:07 +00005400 AArch64beTargetInfo(const llvm::Triple &Triple)
5401 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005402 void getTargetDefines(const LangOptions &Opts,
5403 MacroBuilder &Builder) const override {
5404 Builder.defineMacro("__AARCH64EB__");
5405 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5406 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005407 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005408 }
5409};
Tim Northovera2ee4332014-03-29 15:09:45 +00005410
Tim Northover573cbee2014-05-24 12:52:07 +00005411class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005412protected:
5413 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5414 MacroBuilder &Builder) const override {
5415 Builder.defineMacro("__AARCH64_SIMD__");
5416 Builder.defineMacro("__ARM64_ARCH_8__");
5417 Builder.defineMacro("__ARM_NEON__");
5418 Builder.defineMacro("__LITTLE_ENDIAN__");
5419 Builder.defineMacro("__REGISTER_PREFIX__", "");
5420 Builder.defineMacro("__arm64", "1");
5421 Builder.defineMacro("__arm64__", "1");
5422
5423 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5424 }
5425
Tim Northovera2ee4332014-03-29 15:09:45 +00005426public:
Tim Northover573cbee2014-05-24 12:52:07 +00005427 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5428 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005429 Int64Type = SignedLongLong;
5430 WCharType = SignedInt;
5431 UseSignedCharForObjCBool = false;
5432
Tim Northovera6a19f12015-02-06 01:25:07 +00005433 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005434 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5435
5436 TheCXXABI.set(TargetCXXABI::iOS64);
5437 }
5438
David Blaikie1cbb9712014-11-14 19:09:44 +00005439 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005440 return TargetInfo::CharPtrBuiltinVaList;
5441 }
5442};
Tim Northovera2ee4332014-03-29 15:09:45 +00005443
Tony Linthicum76329bf2011-12-12 21:14:55 +00005444// Hexagon abstract base class
5445class HexagonTargetInfo : public TargetInfo {
5446 static const Builtin::Info BuiltinInfo[];
5447 static const char * const GCCRegNames[];
5448 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5449 std::string CPU;
5450public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005451 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005452 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00005453 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005454
5455 // {} in inline assembly are packet specifiers, not assembly variant
5456 // specifiers.
5457 NoAsmVariants = true;
5458 }
5459
Craig Topper3164f332014-03-11 03:39:26 +00005460 void getTargetBuiltins(const Builtin::Info *&Records,
5461 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005462 Records = BuiltinInfo;
5463 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5464 }
5465
Craig Topper3164f332014-03-11 03:39:26 +00005466 bool validateAsmConstraint(const char *&Name,
5467 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005468 return true;
5469 }
5470
Craig Topper3164f332014-03-11 03:39:26 +00005471 void getTargetDefines(const LangOptions &Opts,
5472 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005473
Craig Topper3164f332014-03-11 03:39:26 +00005474 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005475 return Feature == "hexagon";
5476 }
Craig Topper3164f332014-03-11 03:39:26 +00005477
5478 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005479 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005480 }
Craig Topper3164f332014-03-11 03:39:26 +00005481 void getGCCRegNames(const char * const *&Names,
5482 unsigned &NumNames) const override;
5483 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5484 unsigned &NumAliases) const override;
5485 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005486 return "";
5487 }
Sebastian Pop86500282012-01-13 20:37:10 +00005488
5489 static const char *getHexagonCPUSuffix(StringRef Name) {
5490 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005491 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005492 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005493 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005494 }
5495
Craig Topper3164f332014-03-11 03:39:26 +00005496 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005497 if (!getHexagonCPUSuffix(Name))
5498 return false;
5499
Tony Linthicum76329bf2011-12-12 21:14:55 +00005500 CPU = Name;
5501 return true;
5502 }
5503};
5504
5505void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5506 MacroBuilder &Builder) const {
5507 Builder.defineMacro("qdsp6");
5508 Builder.defineMacro("__qdsp6", "1");
5509 Builder.defineMacro("__qdsp6__", "1");
5510
5511 Builder.defineMacro("hexagon");
5512 Builder.defineMacro("__hexagon", "1");
5513 Builder.defineMacro("__hexagon__", "1");
5514
5515 if(CPU == "hexagonv1") {
5516 Builder.defineMacro("__HEXAGON_V1__");
5517 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5518 if(Opts.HexagonQdsp6Compat) {
5519 Builder.defineMacro("__QDSP6_V1__");
5520 Builder.defineMacro("__QDSP6_ARCH__", "1");
5521 }
5522 }
5523 else if(CPU == "hexagonv2") {
5524 Builder.defineMacro("__HEXAGON_V2__");
5525 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5526 if(Opts.HexagonQdsp6Compat) {
5527 Builder.defineMacro("__QDSP6_V2__");
5528 Builder.defineMacro("__QDSP6_ARCH__", "2");
5529 }
5530 }
5531 else if(CPU == "hexagonv3") {
5532 Builder.defineMacro("__HEXAGON_V3__");
5533 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5534 if(Opts.HexagonQdsp6Compat) {
5535 Builder.defineMacro("__QDSP6_V3__");
5536 Builder.defineMacro("__QDSP6_ARCH__", "3");
5537 }
5538 }
5539 else if(CPU == "hexagonv4") {
5540 Builder.defineMacro("__HEXAGON_V4__");
5541 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5542 if(Opts.HexagonQdsp6Compat) {
5543 Builder.defineMacro("__QDSP6_V4__");
5544 Builder.defineMacro("__QDSP6_ARCH__", "4");
5545 }
5546 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005547 else if(CPU == "hexagonv5") {
5548 Builder.defineMacro("__HEXAGON_V5__");
5549 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5550 if(Opts.HexagonQdsp6Compat) {
5551 Builder.defineMacro("__QDSP6_V5__");
5552 Builder.defineMacro("__QDSP6_ARCH__", "5");
5553 }
5554 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005555}
5556
5557const char * const HexagonTargetInfo::GCCRegNames[] = {
5558 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5559 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5560 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5561 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5562 "p0", "p1", "p2", "p3",
5563 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5564};
5565
5566void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5567 unsigned &NumNames) const {
5568 Names = GCCRegNames;
5569 NumNames = llvm::array_lengthof(GCCRegNames);
5570}
5571
5572
5573const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5574 { { "sp" }, "r29" },
5575 { { "fp" }, "r30" },
5576 { { "lr" }, "r31" },
5577 };
5578
5579void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5580 unsigned &NumAliases) const {
5581 Aliases = GCCRegAliases;
5582 NumAliases = llvm::array_lengthof(GCCRegAliases);
5583}
5584
5585
5586const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5587#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5588#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5589 ALL_LANGUAGES },
5590#include "clang/Basic/BuiltinsHexagon.def"
5591};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005592
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005593// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5594class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005595 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5596 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005597 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005598public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005599 SparcTargetInfo(const llvm::Triple &Triple)
5600 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005601
Craig Topper3164f332014-03-11 03:39:26 +00005602 bool handleTargetFeatures(std::vector<std::string> &Features,
5603 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005604 // The backend doesn't actually handle soft float yet, but in case someone
5605 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005606 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5607 if (Feature != Features.end()) {
5608 SoftFloat = true;
5609 Features.erase(Feature);
5610 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005611 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005612 }
Craig Topper3164f332014-03-11 03:39:26 +00005613 void getTargetDefines(const LangOptions &Opts,
5614 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005615 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005616 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005617
5618 if (SoftFloat)
5619 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005620 }
Craig Topper3164f332014-03-11 03:39:26 +00005621
5622 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005623 return llvm::StringSwitch<bool>(Feature)
5624 .Case("softfloat", SoftFloat)
5625 .Case("sparc", true)
5626 .Default(false);
5627 }
Craig Topper3164f332014-03-11 03:39:26 +00005628
5629 void getTargetBuiltins(const Builtin::Info *&Records,
5630 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005631 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005632 }
Craig Topper3164f332014-03-11 03:39:26 +00005633 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005634 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005635 }
Craig Topper3164f332014-03-11 03:39:26 +00005636 void getGCCRegNames(const char * const *&Names,
5637 unsigned &NumNames) const override;
5638 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5639 unsigned &NumAliases) const override;
5640 bool validateAsmConstraint(const char *&Name,
5641 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005642 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005643 switch (*Name) {
5644 case 'I': // Signed 13-bit constant
5645 case 'J': // Zero
5646 case 'K': // 32-bit constant with the low 12 bits clear
5647 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5648 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5649 case 'N': // Same as 'K' but zext (required for SIMode)
5650 case 'O': // The constant 4096
5651 return true;
5652 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005653 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005654 }
Craig Topper3164f332014-03-11 03:39:26 +00005655 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005656 // FIXME: Implement!
5657 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005658 }
5659};
5660
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005661const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005662 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5663 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5664 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5665 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5666};
5667
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005668void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5669 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005670 Names = GCCRegNames;
5671 NumNames = llvm::array_lengthof(GCCRegNames);
5672}
5673
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005674const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005675 { { "g0" }, "r0" },
5676 { { "g1" }, "r1" },
5677 { { "g2" }, "r2" },
5678 { { "g3" }, "r3" },
5679 { { "g4" }, "r4" },
5680 { { "g5" }, "r5" },
5681 { { "g6" }, "r6" },
5682 { { "g7" }, "r7" },
5683 { { "o0" }, "r8" },
5684 { { "o1" }, "r9" },
5685 { { "o2" }, "r10" },
5686 { { "o3" }, "r11" },
5687 { { "o4" }, "r12" },
5688 { { "o5" }, "r13" },
5689 { { "o6", "sp" }, "r14" },
5690 { { "o7" }, "r15" },
5691 { { "l0" }, "r16" },
5692 { { "l1" }, "r17" },
5693 { { "l2" }, "r18" },
5694 { { "l3" }, "r19" },
5695 { { "l4" }, "r20" },
5696 { { "l5" }, "r21" },
5697 { { "l6" }, "r22" },
5698 { { "l7" }, "r23" },
5699 { { "i0" }, "r24" },
5700 { { "i1" }, "r25" },
5701 { { "i2" }, "r26" },
5702 { { "i3" }, "r27" },
5703 { { "i4" }, "r28" },
5704 { { "i5" }, "r29" },
5705 { { "i6", "fp" }, "r30" },
5706 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005707};
5708
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005709void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5710 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005711 Aliases = GCCRegAliases;
5712 NumAliases = llvm::array_lengthof(GCCRegAliases);
5713}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005714
5715// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5716class SparcV8TargetInfo : public SparcTargetInfo {
5717public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005718 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005719 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
James Y Knight4b4d19e2015-06-04 15:36:29 +00005720 // NetBSD uses long (same as llvm default); everyone else uses int.
5721 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5722 SizeType = UnsignedLong;
5723 IntPtrType = SignedLong;
5724 PtrDiffType = SignedLong;
5725 } else {
5726 SizeType = UnsignedInt;
5727 IntPtrType = SignedInt;
5728 PtrDiffType = SignedInt;
5729 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005730 }
5731
Craig Topper3164f332014-03-11 03:39:26 +00005732 void getTargetDefines(const LangOptions &Opts,
5733 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005734 SparcTargetInfo::getTargetDefines(Opts, Builder);
5735 Builder.defineMacro("__sparcv8");
5736 }
5737};
5738
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005739// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5740class SparcV8elTargetInfo : public SparcV8TargetInfo {
5741 public:
5742 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005743 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005744 BigEndian = false;
5745 }
5746};
5747
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005748// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5749class SparcV9TargetInfo : public SparcTargetInfo {
5750public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005751 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005752 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00005753 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005754 // This is an LP64 platform.
5755 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005756
5757 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005758 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005759 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005760 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005761 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005762 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005763
5764 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5765 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5766 LongDoubleWidth = 128;
5767 LongDoubleAlign = 128;
5768 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005769 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005770 }
5771
Craig Topper3164f332014-03-11 03:39:26 +00005772 void getTargetDefines(const LangOptions &Opts,
5773 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005774 SparcTargetInfo::getTargetDefines(Opts, Builder);
5775 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005776 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005777 // Solaris doesn't need these variants, but the BSDs do.
5778 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005779 Builder.defineMacro("__sparc64__");
5780 Builder.defineMacro("__sparc_v9__");
5781 Builder.defineMacro("__sparcv9__");
5782 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005783 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005784
Craig Topper3164f332014-03-11 03:39:26 +00005785 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005786 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5787 .Case("v9", true)
5788 .Case("ultrasparc", true)
5789 .Case("ultrasparc3", true)
5790 .Case("niagara", true)
5791 .Case("niagara2", true)
5792 .Case("niagara3", true)
5793 .Case("niagara4", true)
5794 .Default(false);
5795
5796 // No need to store the CPU yet. There aren't any CPU-specific
5797 // macros to define.
5798 return CPUKnown;
5799 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005800};
5801
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005802class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005803 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005804 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005805 std::string CPU;
5806 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005807 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005808
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005809public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005810 SystemZTargetInfo(const llvm::Triple &Triple)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005811 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005812 IntMaxType = SignedLong;
5813 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005814 TLSSupported = true;
5815 IntWidth = IntAlign = 32;
5816 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5817 PointerWidth = PointerAlign = 64;
5818 LongDoubleWidth = 128;
5819 LongDoubleAlign = 64;
5820 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005821 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005822 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00005823 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 +00005824 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5825 }
5826 void getTargetDefines(const LangOptions &Opts,
5827 MacroBuilder &Builder) const override {
5828 Builder.defineMacro("__s390__");
5829 Builder.defineMacro("__s390x__");
5830 Builder.defineMacro("__zarch__");
5831 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005832 if (HasTransactionalExecution)
5833 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005834 if (Opts.ZVector)
5835 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005836 }
5837 void getTargetBuiltins(const Builtin::Info *&Records,
5838 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005839 Records = BuiltinInfo;
5840 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005841 }
5842
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005843 void getGCCRegNames(const char *const *&Names,
5844 unsigned &NumNames) const override;
5845 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5846 unsigned &NumAliases) const override {
5847 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005848 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005849 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005850 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005851 bool validateAsmConstraint(const char *&Name,
5852 TargetInfo::ConstraintInfo &info) const override;
5853 const char *getClobbers() const override {
5854 // FIXME: Is this really right?
5855 return "";
5856 }
5857 BuiltinVaListKind getBuiltinVaListKind() const override {
5858 return TargetInfo::SystemZBuiltinVaList;
5859 }
5860 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005861 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005862 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5863 .Case("z10", true)
5864 .Case("z196", true)
5865 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005866 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005867 .Default(false);
5868
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005869 return CPUKnown;
5870 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005871 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5872 if (CPU == "zEC12")
5873 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005874 if (CPU == "z13") {
5875 Features["transactional-execution"] = true;
5876 Features["vector"] = true;
5877 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005878 }
5879
5880 bool handleTargetFeatures(std::vector<std::string> &Features,
5881 DiagnosticsEngine &Diags) override {
5882 HasTransactionalExecution = false;
5883 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5884 if (Features[i] == "+transactional-execution")
5885 HasTransactionalExecution = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005886 if (Features[i] == "+vector")
5887 HasVector = true;
5888 }
5889 // If we use the vector ABI, vector types are 64-bit aligned.
5890 if (HasVector) {
5891 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005892 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5893 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005894 }
5895 return true;
5896 }
5897
5898 bool hasFeature(StringRef Feature) const override {
5899 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005900 .Case("systemz", true)
5901 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005902 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005903 .Default(false);
5904 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005905
5906 StringRef getABI() const override {
5907 if (HasVector)
5908 return "vector";
5909 return "";
5910 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00005911
5912 bool useFloat128ManglingForLongDouble() const override {
5913 return true;
5914 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005915};
5916
5917const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5918#define BUILTIN(ID, TYPE, ATTRS) \
5919 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5920#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005921};
5922
5923const char *const SystemZTargetInfo::GCCRegNames[] = {
5924 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5925 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5926 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5927 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5928};
5929
5930void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5931 unsigned &NumNames) const {
5932 Names = GCCRegNames;
5933 NumNames = llvm::array_lengthof(GCCRegNames);
5934}
5935
5936bool SystemZTargetInfo::
5937validateAsmConstraint(const char *&Name,
5938 TargetInfo::ConstraintInfo &Info) const {
5939 switch (*Name) {
5940 default:
5941 return false;
5942
5943 case 'a': // Address register
5944 case 'd': // Data register (equivalent to 'r')
5945 case 'f': // Floating-point register
5946 Info.setAllowsRegister();
5947 return true;
5948
5949 case 'I': // Unsigned 8-bit constant
5950 case 'J': // Unsigned 12-bit constant
5951 case 'K': // Signed 16-bit constant
5952 case 'L': // Signed 20-bit displacement (on all targets we support)
5953 case 'M': // 0x7fffffff
5954 return true;
5955
5956 case 'Q': // Memory with base and unsigned 12-bit displacement
5957 case 'R': // Likewise, plus an index
5958 case 'S': // Memory with base and signed 20-bit displacement
5959 case 'T': // Likewise, plus an index
5960 Info.setAllowsMemory();
5961 return true;
5962 }
5963}
Ulrich Weigand47445072013-05-06 16:26:41 +00005964
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005965 class MSP430TargetInfo : public TargetInfo {
5966 static const char * const GCCRegNames[];
5967 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005968 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005969 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005970 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005971 IntWidth = 16; IntAlign = 16;
5972 LongWidth = 32; LongLongWidth = 64;
5973 LongAlign = LongLongAlign = 16;
5974 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005975 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005976 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005977 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005978 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005979 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005980 SigAtomicType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00005981 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005982 }
5983 void getTargetDefines(const LangOptions &Opts,
5984 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005985 Builder.defineMacro("MSP430");
5986 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005987 // FIXME: defines for different 'flavours' of MCU
5988 }
Craig Topper3164f332014-03-11 03:39:26 +00005989 void getTargetBuiltins(const Builtin::Info *&Records,
5990 unsigned &NumRecords) const override {
5991 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005992 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005993 NumRecords = 0;
5994 }
Craig Topper3164f332014-03-11 03:39:26 +00005995 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005996 return Feature == "msp430";
5997 }
Craig Topper3164f332014-03-11 03:39:26 +00005998 void getGCCRegNames(const char * const *&Names,
5999 unsigned &NumNames) const override;
6000 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6001 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006002 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00006003 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006004 NumAliases = 0;
6005 }
Eric Christopher917e9522014-11-18 22:36:15 +00006006 bool
6007 validateAsmConstraint(const char *&Name,
6008 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006009 // FIXME: implement
6010 switch (*Name) {
6011 case 'K': // the constant 1
6012 case 'L': // constant -1^20 .. 1^19
6013 case 'M': // constant 1-4:
6014 return true;
6015 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00006016 // No target constraints for now.
6017 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006018 }
Craig Topper3164f332014-03-11 03:39:26 +00006019 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006020 // FIXME: Is this really right?
6021 return "";
6022 }
Craig Topper3164f332014-03-11 03:39:26 +00006023 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006024 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00006025 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006026 }
6027 };
6028
6029 const char * const MSP430TargetInfo::GCCRegNames[] = {
6030 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6031 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
6032 };
6033
6034 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
6035 unsigned &NumNames) const {
6036 Names = GCCRegNames;
6037 NumNames = llvm::array_lengthof(GCCRegNames);
6038 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00006039
Mike Stump11289f42009-09-09 15:08:12 +00006040 // LLVM and Clang cannot be used directly to output native binaries for
6041 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00006042 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00006043 //
6044 // TCE uses the llvm bitcode as input and uses it for generating customized
6045 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00006046 // publicly available in http://tce.cs.tut.fi
6047
Eli Friedman1f191002011-10-07 19:51:42 +00006048 static const unsigned TCEOpenCLAddrSpaceMap[] = {
6049 3, // opencl_global
6050 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00006051 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006052 // FIXME: generic has to be added to the target
6053 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00006054 0, // cuda_device
6055 0, // cuda_constant
6056 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00006057 };
6058
Eli Friedmana9c3d712009-08-19 20:47:07 +00006059 class TCETargetInfo : public TargetInfo{
6060 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006061 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00006062 TLSSupported = false;
6063 IntWidth = 32;
6064 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006065 PointerWidth = 32;
6066 IntAlign = 32;
6067 LongAlign = LongLongAlign = 32;
6068 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006069 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006070 SizeType = UnsignedInt;
6071 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006072 IntPtrType = SignedInt;
6073 PtrDiffType = SignedInt;
6074 FloatWidth = 32;
6075 FloatAlign = 32;
6076 DoubleWidth = 32;
6077 DoubleAlign = 32;
6078 LongDoubleWidth = 32;
6079 LongDoubleAlign = 32;
6080 FloatFormat = &llvm::APFloat::IEEEsingle;
6081 DoubleFormat = &llvm::APFloat::IEEEsingle;
6082 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Eric Christopher964a5f32015-08-05 23:48:05 +00006083 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6084 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00006085 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006086 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006087 }
6088
Craig Topper3164f332014-03-11 03:39:26 +00006089 void getTargetDefines(const LangOptions &Opts,
6090 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006091 DefineStd(Builder, "tce", Opts);
6092 Builder.defineMacro("__TCE__");
6093 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00006094 }
Craig Topper3164f332014-03-11 03:39:26 +00006095 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006096 return Feature == "tce";
6097 }
Craig Topper3164f332014-03-11 03:39:26 +00006098
6099 void getTargetBuiltins(const Builtin::Info *&Records,
6100 unsigned &NumRecords) const override {}
6101 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00006102 return "";
6103 }
Craig Topper3164f332014-03-11 03:39:26 +00006104 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006105 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006106 }
Craig Topper3164f332014-03-11 03:39:26 +00006107 void getGCCRegNames(const char * const *&Names,
6108 unsigned &NumNames) const override {}
6109 bool validateAsmConstraint(const char *&Name,
6110 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00006111 return true;
6112 }
Craig Topper3164f332014-03-11 03:39:26 +00006113 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6114 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00006115 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00006116
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006117class BPFTargetInfo : public TargetInfo {
6118public:
6119 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6120 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6121 SizeType = UnsignedLong;
6122 PtrDiffType = SignedLong;
6123 IntPtrType = SignedLong;
6124 IntMaxType = SignedLong;
6125 Int64Type = SignedLong;
6126 RegParmMax = 5;
6127 if (Triple.getArch() == llvm::Triple::bpfeb) {
6128 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006129 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006130 } else {
6131 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006132 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006133 }
6134 MaxAtomicPromoteWidth = 64;
6135 MaxAtomicInlineWidth = 64;
6136 TLSSupported = false;
6137 }
6138 void getTargetDefines(const LangOptions &Opts,
6139 MacroBuilder &Builder) const override {
6140 DefineStd(Builder, "bpf", Opts);
6141 Builder.defineMacro("__BPF__");
6142 }
6143 bool hasFeature(StringRef Feature) const override {
6144 return Feature == "bpf";
6145 }
6146
6147 void getTargetBuiltins(const Builtin::Info *&Records,
6148 unsigned &NumRecords) const override {}
6149 const char *getClobbers() const override {
6150 return "";
6151 }
6152 BuiltinVaListKind getBuiltinVaListKind() const override {
6153 return TargetInfo::VoidPtrBuiltinVaList;
6154 }
6155 void getGCCRegNames(const char * const *&Names,
6156 unsigned &NumNames) const override {
6157 Names = nullptr;
6158 NumNames = 0;
6159 }
6160 bool validateAsmConstraint(const char *&Name,
6161 TargetInfo::ConstraintInfo &info) const override {
6162 return true;
6163 }
6164 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6165 unsigned &NumAliases) const override {
6166 Aliases = nullptr;
6167 NumAliases = 0;
6168 }
6169};
6170
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006171class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006172 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006173
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006174 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006175 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006176 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006177 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006178 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006179 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006180 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006181 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006182 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006183 enum DspRevEnum {
6184 NoDSP, DSP1, DSP2
6185 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006186 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006187
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006188protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006189 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006190 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006191
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006192public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006193 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6194 const std::string &CPUStr)
6195 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006196 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006197 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6198 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6199 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006200
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006201 bool isNaN2008Default() const {
6202 return CPU == "mips32r6" || CPU == "mips64r6";
6203 }
6204
6205 bool isFP64Default() const {
6206 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6207 }
6208
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006209 bool isNan2008() const override {
6210 return IsNan2008;
6211 }
6212
Alp Toker4925ba72014-06-07 23:30:42 +00006213 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006214 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006215 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6216 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006217 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006218 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006219 .Case("mips1", IsMips32)
6220 .Case("mips2", IsMips32)
6221 .Case("mips3", true)
6222 .Case("mips4", true)
6223 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006224 .Case("mips32", IsMips32)
6225 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006226 .Case("mips32r3", IsMips32)
6227 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006228 .Case("mips32r6", IsMips32)
6229 .Case("mips64", true)
6230 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006231 .Case("mips64r3", true)
6232 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006233 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006234 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006235 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006236 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006237 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00006238 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006239 if (CPU == "octeon")
6240 Features["mips64r2"] = Features["cnmips"] = true;
6241 else
6242 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00006243 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006244
Craig Topper3164f332014-03-11 03:39:26 +00006245 void getTargetDefines(const LangOptions &Opts,
6246 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006247 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006248 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006249 if (Opts.GNUMode)
6250 Builder.defineMacro("mips");
6251
Simon Atanasyan683535b2012-08-29 19:14:58 +00006252 Builder.defineMacro("__REGISTER_PREFIX__", "");
6253
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006254 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006255 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006256 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006257 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006258 case SoftFloat:
6259 Builder.defineMacro("__mips_soft_float", Twine(1));
6260 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006261 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006262
Simon Atanasyan16071912013-04-14 14:07:30 +00006263 if (IsSingleFloat)
6264 Builder.defineMacro("__mips_single_float", Twine(1));
6265
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006266 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6267 Builder.defineMacro("_MIPS_FPSET",
6268 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6269
Simon Atanasyan72244b62012-07-05 16:06:06 +00006270 if (IsMips16)
6271 Builder.defineMacro("__mips16", Twine(1));
6272
Simon Atanasyan60777612013-04-14 14:07:51 +00006273 if (IsMicromips)
6274 Builder.defineMacro("__mips_micromips", Twine(1));
6275
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006276 if (IsNan2008)
6277 Builder.defineMacro("__mips_nan2008", Twine(1));
6278
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006279 switch (DspRev) {
6280 default:
6281 break;
6282 case DSP1:
6283 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6284 Builder.defineMacro("__mips_dsp", Twine(1));
6285 break;
6286 case DSP2:
6287 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6288 Builder.defineMacro("__mips_dspr2", Twine(1));
6289 Builder.defineMacro("__mips_dsp", Twine(1));
6290 break;
6291 }
6292
Jack Carter44ff1e52013-08-12 17:20:29 +00006293 if (HasMSA)
6294 Builder.defineMacro("__mips_msa", Twine(1));
6295
Simon Atanasyan26f19672012-04-05 19:28:31 +00006296 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6297 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6298 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006299
6300 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6301 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006302 }
6303
Craig Topper3164f332014-03-11 03:39:26 +00006304 void getTargetBuiltins(const Builtin::Info *&Records,
6305 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006306 Records = BuiltinInfo;
6307 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006308 }
Craig Topper3164f332014-03-11 03:39:26 +00006309 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006310 return llvm::StringSwitch<bool>(Feature)
6311 .Case("mips", true)
6312 .Case("fp64", HasFP64)
6313 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006314 }
Craig Topper3164f332014-03-11 03:39:26 +00006315 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006316 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006317 }
Craig Topper3164f332014-03-11 03:39:26 +00006318 void getGCCRegNames(const char * const *&Names,
6319 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006320 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006321 // CPU register names
6322 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006323 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6324 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6325 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006326 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6327 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006328 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6329 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6330 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6331 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006332 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006333 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006334 "$fcc5","$fcc6","$fcc7",
6335 // MSA register names
6336 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6337 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6338 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6339 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6340 // MSA control register names
6341 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6342 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006343 };
6344 Names = GCCRegNames;
6345 NumNames = llvm::array_lengthof(GCCRegNames);
6346 }
Craig Topper3164f332014-03-11 03:39:26 +00006347 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6348 unsigned &NumAliases) const override = 0;
6349 bool validateAsmConstraint(const char *&Name,
6350 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006351 switch (*Name) {
6352 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006353 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006354 case 'r': // CPU registers.
6355 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006356 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006357 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006358 case 'c': // $25 for indirect jumps
6359 case 'l': // lo register
6360 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006361 Info.setAllowsRegister();
6362 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006363 case 'I': // Signed 16-bit constant
6364 case 'J': // Integer 0
6365 case 'K': // Unsigned 16-bit constant
6366 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6367 case 'M': // Constants not loadable via lui, addiu, or ori
6368 case 'N': // Constant -1 to -65535
6369 case 'O': // A signed 15-bit constant
6370 case 'P': // A constant between 1 go 65535
6371 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006372 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006373 Info.setAllowsMemory();
6374 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006375 case 'Z':
6376 if (Name[1] == 'C') { // An address usable by ll, and sc.
6377 Info.setAllowsMemory();
6378 Name++; // Skip over 'Z'.
6379 return true;
6380 }
6381 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006382 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006383 }
6384
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006385 std::string convertConstraint(const char *&Constraint) const override {
6386 std::string R;
6387 switch (*Constraint) {
6388 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6389 if (Constraint[1] == 'C') {
6390 R = std::string("^") + std::string(Constraint, 2);
6391 Constraint++;
6392 return R;
6393 }
6394 break;
6395 }
6396 return TargetInfo::convertConstraint(Constraint);
6397 }
6398
Craig Topper3164f332014-03-11 03:39:26 +00006399 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006400 // In GCC, $1 is not widely used in generated code (it's used only in a few
6401 // specific situations), so there is no real need for users to add it to
6402 // the clobbers list if they want to use it in their inline assembly code.
6403 //
6404 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6405 // code generation, so using it in inline assembly without adding it to the
6406 // clobbers list can cause conflicts between the inline assembly code and
6407 // the surrounding generated code.
6408 //
6409 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6410 // operands, which will conflict with the ".set at" assembler option (which
6411 // we use only for inline assembly, in order to maintain compatibility with
6412 // GCC) and will also conflict with the user's usage of $1.
6413 //
6414 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6415 // register for generated code is to automatically clobber $1 for all inline
6416 // assembly code.
6417 //
6418 // FIXME: We should automatically clobber $1 only for inline assembly code
6419 // which actually uses it. This would allow LLVM to use $1 for inline
6420 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006421 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006422 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006423
Craig Topper3164f332014-03-11 03:39:26 +00006424 bool handleTargetFeatures(std::vector<std::string> &Features,
6425 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006426 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006427 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006428 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006429 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006430 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006431 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006432 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006433
6434 for (std::vector<std::string>::iterator it = Features.begin(),
6435 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006436 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006437 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006438 else if (*it == "+soft-float")
6439 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006440 else if (*it == "+mips16")
6441 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00006442 else if (*it == "+micromips")
6443 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006444 else if (*it == "+dsp")
6445 DspRev = std::max(DspRev, DSP1);
6446 else if (*it == "+dspr2")
6447 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00006448 else if (*it == "+msa")
6449 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006450 else if (*it == "+fp64")
6451 HasFP64 = true;
6452 else if (*it == "-fp64")
6453 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006454 else if (*it == "+nan2008")
6455 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006456 else if (*it == "-nan2008")
6457 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006458 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006459
Eric Christopher964a5f32015-08-05 23:48:05 +00006460 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006461
Rafael Espindolaeb265472013-08-21 21:59:03 +00006462 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006463 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006464
Craig Topper3164f332014-03-11 03:39:26 +00006465 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006466 if (RegNo == 0) return 4;
6467 if (RegNo == 1) return 5;
6468 return -1;
6469 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006470
6471 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006472};
6473
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006474const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
6475#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6476#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6477 ALL_LANGUAGES },
6478#include "clang/Basic/BuiltinsMips.def"
6479};
6480
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006481class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006482public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006483 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006484 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006485 SizeType = UnsignedInt;
6486 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006487 Int64Type = SignedLongLong;
6488 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006489 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006490 }
Craig Topper3164f332014-03-11 03:39:26 +00006491 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006492 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006493 ABI = Name;
6494 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006495 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006496 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006497 }
Craig Topper3164f332014-03-11 03:39:26 +00006498 void getTargetDefines(const LangOptions &Opts,
6499 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006500 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006501
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006502 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006503 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6504
6505 const std::string& CPUStr = getCPU();
6506 if (CPUStr == "mips32")
6507 Builder.defineMacro("__mips_isa_rev", "1");
6508 else if (CPUStr == "mips32r2")
6509 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006510 else if (CPUStr == "mips32r3")
6511 Builder.defineMacro("__mips_isa_rev", "3");
6512 else if (CPUStr == "mips32r5")
6513 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006514 else if (CPUStr == "mips32r6")
6515 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006516
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006517 if (ABI == "o32") {
6518 Builder.defineMacro("__mips_o32");
6519 Builder.defineMacro("_ABIO32", "1");
6520 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6521 }
6522 else if (ABI == "eabi")
6523 Builder.defineMacro("__mips_eabi");
6524 else
David Blaikie83d382b2011-09-23 05:06:16 +00006525 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006526 }
Craig Topper3164f332014-03-11 03:39:26 +00006527 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6528 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006529 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6530 { { "at" }, "$1" },
6531 { { "v0" }, "$2" },
6532 { { "v1" }, "$3" },
6533 { { "a0" }, "$4" },
6534 { { "a1" }, "$5" },
6535 { { "a2" }, "$6" },
6536 { { "a3" }, "$7" },
6537 { { "t0" }, "$8" },
6538 { { "t1" }, "$9" },
6539 { { "t2" }, "$10" },
6540 { { "t3" }, "$11" },
6541 { { "t4" }, "$12" },
6542 { { "t5" }, "$13" },
6543 { { "t6" }, "$14" },
6544 { { "t7" }, "$15" },
6545 { { "s0" }, "$16" },
6546 { { "s1" }, "$17" },
6547 { { "s2" }, "$18" },
6548 { { "s3" }, "$19" },
6549 { { "s4" }, "$20" },
6550 { { "s5" }, "$21" },
6551 { { "s6" }, "$22" },
6552 { { "s7" }, "$23" },
6553 { { "t8" }, "$24" },
6554 { { "t9" }, "$25" },
6555 { { "k0" }, "$26" },
6556 { { "k1" }, "$27" },
6557 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006558 { { "sp","$sp" }, "$29" },
6559 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006560 { { "ra" }, "$31" }
6561 };
6562 Aliases = GCCRegAliases;
6563 NumAliases = llvm::array_lengthof(GCCRegAliases);
6564 }
6565};
6566
6567class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006568 void setDataLayoutString() override {
6569 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006570 }
6571
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006572public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006573 Mips32EBTargetInfo(const llvm::Triple &Triple)
6574 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006575 }
Craig Topper3164f332014-03-11 03:39:26 +00006576 void getTargetDefines(const LangOptions &Opts,
6577 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006578 DefineStd(Builder, "MIPSEB", Opts);
6579 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006580 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006581 }
6582};
6583
6584class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006585 void setDataLayoutString() override {
6586 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006587 }
6588
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006589public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006590 Mips32ELTargetInfo(const llvm::Triple &Triple)
6591 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006592 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006593 }
Craig Topper3164f332014-03-11 03:39:26 +00006594 void getTargetDefines(const LangOptions &Opts,
6595 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006596 DefineStd(Builder, "MIPSEL", Opts);
6597 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006598 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006599 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006600};
Akira Hatanakabef17452011-09-20 19:21:49 +00006601
6602class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006603public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006604 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006605 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006606 LongDoubleWidth = LongDoubleAlign = 128;
6607 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006608 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6609 LongDoubleWidth = LongDoubleAlign = 64;
6610 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6611 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006612 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006613 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006614 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006615 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006616
6617 void setN64ABITypes() {
6618 LongWidth = LongAlign = 64;
6619 PointerWidth = PointerAlign = 64;
6620 SizeType = UnsignedLong;
6621 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006622 Int64Type = SignedLong;
6623 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006624 }
6625
6626 void setN32ABITypes() {
6627 LongWidth = LongAlign = 32;
6628 PointerWidth = PointerAlign = 32;
6629 SizeType = UnsignedInt;
6630 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006631 Int64Type = SignedLongLong;
6632 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006633 }
6634
Craig Topper3164f332014-03-11 03:39:26 +00006635 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006636 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006637 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006638 ABI = Name;
6639 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006640 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006641 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006642 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006643 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006644 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006645 }
6646 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006647 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006648
Craig Topper3164f332014-03-11 03:39:26 +00006649 void getTargetDefines(const LangOptions &Opts,
6650 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006651 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006652
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006653 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006654 Builder.defineMacro("__mips64");
6655 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006656 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6657
6658 const std::string& CPUStr = getCPU();
6659 if (CPUStr == "mips64")
6660 Builder.defineMacro("__mips_isa_rev", "1");
6661 else if (CPUStr == "mips64r2")
6662 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006663 else if (CPUStr == "mips64r3")
6664 Builder.defineMacro("__mips_isa_rev", "3");
6665 else if (CPUStr == "mips64r5")
6666 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006667 else if (CPUStr == "mips64r6")
6668 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006669
Akira Hatanakabef17452011-09-20 19:21:49 +00006670 if (ABI == "n32") {
6671 Builder.defineMacro("__mips_n32");
6672 Builder.defineMacro("_ABIN32", "2");
6673 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6674 }
6675 else if (ABI == "n64") {
6676 Builder.defineMacro("__mips_n64");
6677 Builder.defineMacro("_ABI64", "3");
6678 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6679 }
6680 else
David Blaikie83d382b2011-09-23 05:06:16 +00006681 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006682 }
Craig Topper3164f332014-03-11 03:39:26 +00006683 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6684 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006685 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6686 { { "at" }, "$1" },
6687 { { "v0" }, "$2" },
6688 { { "v1" }, "$3" },
6689 { { "a0" }, "$4" },
6690 { { "a1" }, "$5" },
6691 { { "a2" }, "$6" },
6692 { { "a3" }, "$7" },
6693 { { "a4" }, "$8" },
6694 { { "a5" }, "$9" },
6695 { { "a6" }, "$10" },
6696 { { "a7" }, "$11" },
6697 { { "t0" }, "$12" },
6698 { { "t1" }, "$13" },
6699 { { "t2" }, "$14" },
6700 { { "t3" }, "$15" },
6701 { { "s0" }, "$16" },
6702 { { "s1" }, "$17" },
6703 { { "s2" }, "$18" },
6704 { { "s3" }, "$19" },
6705 { { "s4" }, "$20" },
6706 { { "s5" }, "$21" },
6707 { { "s6" }, "$22" },
6708 { { "s7" }, "$23" },
6709 { { "t8" }, "$24" },
6710 { { "t9" }, "$25" },
6711 { { "k0" }, "$26" },
6712 { { "k1" }, "$27" },
6713 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006714 { { "sp","$sp" }, "$29" },
6715 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006716 { { "ra" }, "$31" }
6717 };
6718 Aliases = GCCRegAliases;
6719 NumAliases = llvm::array_lengthof(GCCRegAliases);
6720 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006721
6722 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006723};
6724
6725class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006726 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006727 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006728 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 +00006729 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006730 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006731
Akira Hatanakabef17452011-09-20 19:21:49 +00006732 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006733
Akira Hatanakabef17452011-09-20 19:21:49 +00006734public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006735 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006736 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006737 void getTargetDefines(const LangOptions &Opts,
6738 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006739 DefineStd(Builder, "MIPSEB", Opts);
6740 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006741 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006742 }
6743};
6744
6745class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006746 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006747 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006748 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 +00006749 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006750 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006751 }
6752public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006753 Mips64ELTargetInfo(const llvm::Triple &Triple)
6754 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006755 // Default ABI is n64.
6756 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006757 }
Craig Topper3164f332014-03-11 03:39:26 +00006758 void getTargetDefines(const LangOptions &Opts,
6759 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006760 DefineStd(Builder, "MIPSEL", Opts);
6761 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006762 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006763 }
6764};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006765
Ivan Krasindd7403e2011-08-24 20:22:22 +00006766class PNaClTargetInfo : public TargetInfo {
6767public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006768 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006769 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006770 this->UserLabelPrefix = "";
6771 this->LongAlign = 32;
6772 this->LongWidth = 32;
6773 this->PointerAlign = 32;
6774 this->PointerWidth = 32;
6775 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006776 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006777 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006778 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006779 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006780 this->SizeType = TargetInfo::UnsignedInt;
6781 this->PtrDiffType = TargetInfo::SignedInt;
6782 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006783 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006784 }
6785
Craig Topper3164f332014-03-11 03:39:26 +00006786 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006787 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006788 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006789 Builder.defineMacro("__le32__");
6790 Builder.defineMacro("__pnacl__");
6791 }
Craig Topper3164f332014-03-11 03:39:26 +00006792 void getTargetDefines(const LangOptions &Opts,
6793 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006794 getArchDefines(Opts, Builder);
6795 }
Craig Topper3164f332014-03-11 03:39:26 +00006796 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006797 return Feature == "pnacl";
6798 }
Craig Topper3164f332014-03-11 03:39:26 +00006799 void getTargetBuiltins(const Builtin::Info *&Records,
6800 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006801 }
Craig Topper3164f332014-03-11 03:39:26 +00006802 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006803 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006804 }
Craig Topper3164f332014-03-11 03:39:26 +00006805 void getGCCRegNames(const char * const *&Names,
6806 unsigned &NumNames) const override;
6807 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6808 unsigned &NumAliases) const override;
6809 bool validateAsmConstraint(const char *&Name,
6810 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006811 return false;
6812 }
6813
Craig Topper3164f332014-03-11 03:39:26 +00006814 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006815 return "";
6816 }
6817};
6818
6819void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6820 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006821 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006822 NumNames = 0;
6823}
6824
6825void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6826 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006827 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006828 NumAliases = 0;
6829}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006830
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006831// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6832class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6833public:
6834 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
6835 Mips32ELTargetInfo(Triple) {
6836 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 0;
6837 }
6838
6839 BuiltinVaListKind getBuiltinVaListKind() const override {
6840 return TargetInfo::PNaClABIBuiltinVaList;
6841 }
6842};
6843
JF Bastien643817d2014-09-12 17:52:47 +00006844class Le64TargetInfo : public TargetInfo {
6845 static const Builtin::Info BuiltinInfo[];
6846
6847public:
6848 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6849 BigEndian = false;
6850 NoAsmVariants = true;
6851 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6852 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006853 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006854 }
6855
6856 void getTargetDefines(const LangOptions &Opts,
6857 MacroBuilder &Builder) const override {
6858 DefineStd(Builder, "unix", Opts);
6859 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6860 Builder.defineMacro("__ELF__");
6861 }
6862 void getTargetBuiltins(const Builtin::Info *&Records,
6863 unsigned &NumRecords) const override {
6864 Records = BuiltinInfo;
6865 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6866 }
6867 BuiltinVaListKind getBuiltinVaListKind() const override {
6868 return TargetInfo::PNaClABIBuiltinVaList;
6869 }
6870 const char *getClobbers() const override { return ""; }
6871 void getGCCRegNames(const char *const *&Names,
6872 unsigned &NumNames) const override {
6873 Names = nullptr;
6874 NumNames = 0;
6875 }
6876 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6877 unsigned &NumAliases) const override {
6878 Aliases = nullptr;
6879 NumAliases = 0;
6880 }
6881 bool validateAsmConstraint(const char *&Name,
6882 TargetInfo::ConstraintInfo &Info) const override {
6883 return false;
6884 }
6885
6886 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006887};
6888} // end anonymous namespace.
6889
6890const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6891#define BUILTIN(ID, TYPE, ATTRS) \
6892 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6893#include "clang/Basic/BuiltinsLe64.def"
6894};
6895
6896namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006897 static const unsigned SPIRAddrSpaceMap[] = {
6898 1, // opencl_global
6899 3, // opencl_local
6900 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006901 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006902 0, // cuda_device
6903 0, // cuda_constant
6904 0 // cuda_shared
6905 };
6906 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006907 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006908 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006909 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6910 "SPIR target must use unknown OS");
6911 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6912 "SPIR target must use unknown environment type");
6913 BigEndian = false;
6914 TLSSupported = false;
6915 LongWidth = LongAlign = 64;
6916 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006917 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006918 // Define available target features
6919 // These must be defined in sorted order!
6920 NoAsmVariants = true;
6921 }
Craig Topper3164f332014-03-11 03:39:26 +00006922 void getTargetDefines(const LangOptions &Opts,
6923 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006924 DefineStd(Builder, "SPIR", Opts);
6925 }
Craig Topper3164f332014-03-11 03:39:26 +00006926 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006927 return Feature == "spir";
6928 }
Craig Topper3164f332014-03-11 03:39:26 +00006929
6930 void getTargetBuiltins(const Builtin::Info *&Records,
6931 unsigned &NumRecords) const override {}
6932 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006933 return "";
6934 }
Craig Topper3164f332014-03-11 03:39:26 +00006935 void getGCCRegNames(const char * const *&Names,
6936 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006937 bool
6938 validateAsmConstraint(const char *&Name,
6939 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006940 return true;
6941 }
Craig Topper3164f332014-03-11 03:39:26 +00006942 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6943 unsigned &NumAliases) const override {}
6944 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006945 return TargetInfo::VoidPtrBuiltinVaList;
6946 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006947
6948 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6949 return (CC == CC_SpirFunction ||
6950 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6951 }
6952
6953 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6954 return CC_SpirFunction;
6955 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006956 };
6957
6958
6959 class SPIR32TargetInfo : public SPIRTargetInfo {
6960 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006961 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006962 PointerWidth = PointerAlign = 32;
6963 SizeType = TargetInfo::UnsignedInt;
6964 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +00006965 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6966 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006967 }
Craig Topper3164f332014-03-11 03:39:26 +00006968 void getTargetDefines(const LangOptions &Opts,
6969 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006970 DefineStd(Builder, "SPIR32", Opts);
6971 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006972 };
6973
6974 class SPIR64TargetInfo : public SPIRTargetInfo {
6975 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006976 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006977 PointerWidth = PointerAlign = 64;
6978 SizeType = TargetInfo::UnsignedLong;
6979 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00006980 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6981 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006982 }
Craig Topper3164f332014-03-11 03:39:26 +00006983 void getTargetDefines(const LangOptions &Opts,
6984 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006985 DefineStd(Builder, "SPIR64", Opts);
6986 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006987 };
Guy Benyeib798fc92012-12-11 21:38:14 +00006988
Robert Lytton0e076492013-08-13 09:43:10 +00006989class XCoreTargetInfo : public TargetInfo {
6990 static const Builtin::Info BuiltinInfo[];
6991public:
6992 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6993 BigEndian = false;
6994 NoAsmVariants = true;
6995 LongLongAlign = 32;
6996 SuitableAlign = 32;
6997 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006998 SizeType = UnsignedInt;
6999 PtrDiffType = SignedInt;
7000 IntPtrType = SignedInt;
7001 WCharType = UnsignedChar;
7002 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007003 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007004 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7005 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007006 }
Craig Topper3164f332014-03-11 03:39:26 +00007007 void getTargetDefines(const LangOptions &Opts,
7008 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007009 Builder.defineMacro("__XS1B__");
7010 }
Craig Topper3164f332014-03-11 03:39:26 +00007011 void getTargetBuiltins(const Builtin::Info *&Records,
7012 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007013 Records = BuiltinInfo;
7014 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
7015 }
Craig Topper3164f332014-03-11 03:39:26 +00007016 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007017 return TargetInfo::VoidPtrBuiltinVaList;
7018 }
Craig Topper3164f332014-03-11 03:39:26 +00007019 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007020 return "";
7021 }
Craig Topper3164f332014-03-11 03:39:26 +00007022 void getGCCRegNames(const char * const *&Names,
7023 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007024 static const char * const GCCRegNames[] = {
7025 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7026 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7027 };
7028 Names = GCCRegNames;
7029 NumNames = llvm::array_lengthof(GCCRegNames);
7030 }
Craig Topper3164f332014-03-11 03:39:26 +00007031 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7032 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00007033 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00007034 NumAliases = 0;
7035 }
Craig Topper3164f332014-03-11 03:39:26 +00007036 bool validateAsmConstraint(const char *&Name,
7037 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007038 return false;
7039 }
Craig Topper3164f332014-03-11 03:39:26 +00007040 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007041 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7042 return (RegNo < 2)? RegNo : -1;
7043 }
Robert Lytton0e076492013-08-13 09:43:10 +00007044};
7045
7046const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
7047#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
7048#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
7049 ALL_LANGUAGES },
7050#include "clang/Basic/BuiltinsXCore.def"
7051};
7052} // end anonymous namespace.
7053
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007054namespace {
7055// x86_32 Android target
7056class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7057public:
7058 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7059 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7060 SuitableAlign = 32;
7061 LongDoubleWidth = 64;
7062 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7063 }
7064};
7065} // end anonymous namespace
7066
7067namespace {
7068// x86_64 Android target
7069class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7070public:
7071 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7072 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7073 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7074 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007075
7076 bool useFloat128ManglingForLongDouble() const override {
7077 return true;
7078 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007079};
7080} // end anonymous namespace
7081
Ivan Krasindd7403e2011-08-24 20:22:22 +00007082
Chris Lattner5ba61f02006-10-14 07:39:34 +00007083//===----------------------------------------------------------------------===//
7084// Driver code
7085//===----------------------------------------------------------------------===//
7086
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007087static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007088 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007089
Daniel Dunbar52322032009-08-18 05:47:58 +00007090 switch (Triple.getArch()) {
7091 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007092 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007093
Tim Northover2a0783d2014-05-30 14:14:07 +00007094 case llvm::Triple::xcore:
7095 return new XCoreTargetInfo(Triple);
7096
7097 case llvm::Triple::hexagon:
7098 return new HexagonTargetInfo(Triple);
7099
7100 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007101 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007102 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007103
7104 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007105 case llvm::Triple::FreeBSD:
7106 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007107 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007108 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007109 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007110 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007111 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007112 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007113 }
7114
Christian Pirker9b019ae2014-02-25 13:51:00 +00007115 case llvm::Triple::aarch64_be:
7116 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007117 case llvm::Triple::FreeBSD:
7118 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007119 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007120 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007121 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007122 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007123 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007124 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007125 }
7126
Daniel Dunbar52322032009-08-18 05:47:58 +00007127 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007128 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007129 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007130 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007131
Daniel Dunbar52322032009-08-18 05:47:58 +00007132 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007133 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007134 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007135 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007136 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007137 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007138 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007139 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007140 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007141 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007142 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007143 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007144 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007145 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007146 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007147 case llvm::Triple::Win32:
7148 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007149 case llvm::Triple::Cygnus:
7150 return new CygwinARMTargetInfo(Triple);
7151 case llvm::Triple::GNU:
7152 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007153 case llvm::Triple::Itanium:
7154 return new ItaniumWindowsARMleTargetInfo(Triple);
7155 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007156 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007157 return new MicrosoftARMleTargetInfo(Triple);
7158 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007159 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007160 return new ARMleTargetInfo(Triple);
7161 }
7162
7163 case llvm::Triple::armeb:
7164 case llvm::Triple::thumbeb:
7165 if (Triple.isOSDarwin())
7166 return new DarwinARMTargetInfo(Triple);
7167
7168 switch (os) {
7169 case llvm::Triple::Linux:
7170 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7171 case llvm::Triple::FreeBSD:
7172 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7173 case llvm::Triple::NetBSD:
7174 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7175 case llvm::Triple::OpenBSD:
7176 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7177 case llvm::Triple::Bitrig:
7178 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7179 case llvm::Triple::RTEMS:
7180 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7181 case llvm::Triple::NaCl:
7182 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7183 default:
7184 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007185 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007186
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007187 case llvm::Triple::bpfeb:
7188 case llvm::Triple::bpfel:
7189 return new BPFTargetInfo(Triple);
7190
Daniel Dunbar52322032009-08-18 05:47:58 +00007191 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007192 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007193
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007194 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007195 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007196 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007197 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007198 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007199 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007200 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007201 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007202 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007203 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007204 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007205 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007206 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007207
7208 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007209 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007210 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007211 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007212 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007213 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007214 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007215 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007216 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007217 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007218 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007219 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007220 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007221 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007222 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007223
Akira Hatanakabef17452011-09-20 19:21:49 +00007224 case llvm::Triple::mips64:
7225 switch (os) {
7226 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007227 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007228 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007229 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007230 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007231 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007232 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007233 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007234 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007235 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007236 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007237 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007238 }
7239
7240 case llvm::Triple::mips64el:
7241 switch (os) {
7242 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007243 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007244 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007245 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007246 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007247 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007248 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007249 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007250 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007251 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007252 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007253 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007254 }
7255
Ivan Krasindd7403e2011-08-24 20:22:22 +00007256 case llvm::Triple::le32:
7257 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007258 case llvm::Triple::NaCl:
7259 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7260 default:
7261 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007262 }
7263
JF Bastien643817d2014-09-12 17:52:47 +00007264 case llvm::Triple::le64:
7265 return new Le64TargetInfo(Triple);
7266
Daniel Dunbar52322032009-08-18 05:47:58 +00007267 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007268 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007269 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007270 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007271 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007272 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007273 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007274 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007275 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007276 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007277 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007278 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007279 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007280 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007281 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007282 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007283 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007284
7285 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007286 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007287 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007288 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007289 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007290 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007291 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007292 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007293 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007294 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007295 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007296 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007297 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007298 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007299 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007300
Bill Schmidt778d3872013-07-26 01:36:11 +00007301 case llvm::Triple::ppc64le:
7302 switch (os) {
7303 case llvm::Triple::Linux:
7304 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007305 case llvm::Triple::NetBSD:
7306 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007307 default:
7308 return new PPC64TargetInfo(Triple);
7309 }
7310
Peter Collingbournec947aae2012-05-20 23:28:41 +00007311 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007312 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007313 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007314 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007315
Tom Stellardd8e38a32015-01-06 20:34:47 +00007316 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007317 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007318 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007319
Daniel Dunbar52322032009-08-18 05:47:58 +00007320 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007321 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007322 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007323 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007324 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007325 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007326 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007327 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007328 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007329 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007330 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007331 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007332 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007333 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007334 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007335
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007336 // The 'sparcel' architecture copies all the above cases except for Solaris.
7337 case llvm::Triple::sparcel:
7338 switch (os) {
7339 case llvm::Triple::Linux:
7340 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7341 case llvm::Triple::NetBSD:
7342 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7343 case llvm::Triple::OpenBSD:
7344 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7345 case llvm::Triple::RTEMS:
7346 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7347 default:
7348 return new SparcV8elTargetInfo(Triple);
7349 }
7350
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007351 case llvm::Triple::sparcv9:
7352 switch (os) {
7353 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007354 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007355 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007356 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007357 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007358 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007359 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007360 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007361 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007362 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007363 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007364 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007365 }
7366
Ulrich Weigand47445072013-05-06 16:26:41 +00007367 case llvm::Triple::systemz:
7368 switch (os) {
7369 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007370 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007371 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007372 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007373 }
7374
Eli Friedmana9c3d712009-08-19 20:47:07 +00007375 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007376 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007377
Daniel Dunbar52322032009-08-18 05:47:58 +00007378 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007379 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007380 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007381
Daniel Dunbar52322032009-08-18 05:47:58 +00007382 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007383 case llvm::Triple::CloudABI:
7384 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007385 case llvm::Triple::Linux: {
7386 switch (Triple.getEnvironment()) {
7387 default:
7388 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7389 case llvm::Triple::Android:
7390 return new AndroidX86_32TargetInfo(Triple);
7391 }
7392 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007393 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007394 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007395 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007396 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007397 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007398 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007399 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007400 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007401 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007402 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007403 case llvm::Triple::KFreeBSD:
7404 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007405 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007406 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007407 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007408 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007409 case llvm::Triple::Win32: {
7410 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007411 case llvm::Triple::Cygnus:
7412 return new CygwinX86_32TargetInfo(Triple);
7413 case llvm::Triple::GNU:
7414 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007415 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007416 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007417 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007418 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007419 }
7420 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007421 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007422 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007423 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007424 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007425 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007426 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007427 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007428 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007429 }
7430
7431 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007432 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007433 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007434
Daniel Dunbar52322032009-08-18 05:47:58 +00007435 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007436 case llvm::Triple::CloudABI:
7437 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007438 case llvm::Triple::Linux: {
7439 switch (Triple.getEnvironment()) {
7440 default:
7441 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7442 case llvm::Triple::Android:
7443 return new AndroidX86_64TargetInfo(Triple);
7444 }
7445 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007446 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007447 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007448 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007449 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007450 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007451 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007452 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007453 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007454 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007455 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007456 case llvm::Triple::KFreeBSD:
7457 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007458 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007459 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007460 case llvm::Triple::Win32: {
7461 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007462 case llvm::Triple::Cygnus:
7463 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007464 case llvm::Triple::GNU:
7465 return new MinGWX86_64TargetInfo(Triple);
7466 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007467 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007468 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007469 }
7470 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007471 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007472 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007473 case llvm::Triple::PS4:
7474 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007475 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007476 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007477 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007478
Douglas Katzman78d7c542015-05-12 21:18:10 +00007479 case llvm::Triple::spir: {
7480 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7481 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7482 return nullptr;
7483 return new SPIR32TargetInfo(Triple);
7484 }
7485 case llvm::Triple::spir64: {
7486 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7487 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7488 return nullptr;
7489 return new SPIR64TargetInfo(Triple);
7490 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007491 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007492}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007493
7494/// CreateTargetInfo - Return the target info object for the specified target
7495/// triple.
Alp Toker80758082014-07-06 05:26:44 +00007496TargetInfo *
7497TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7498 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007499 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007500
7501 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007502 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007503 if (!Target) {
7504 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007505 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007506 }
Alp Toker80758082014-07-06 05:26:44 +00007507 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007508
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007509 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007510 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7511 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007512 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007513 }
7514
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007515 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007516 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7517 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007518 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007519 }
7520
Rafael Espindolaeb265472013-08-21 21:59:03 +00007521 // Set the fp math unit.
7522 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7523 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007524 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007525 }
7526
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007527 // Compute the default target features, we need the target to handle this
7528 // because features may have dependencies on one another.
7529 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00007530 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007531
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007532 // Apply the user specified deltas.
7533 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
7534 I < N; ++I) {
7535 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00007536 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007537 bool Enabled = Name[0] == '+';
7538 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007539 }
7540
7541 // Add the features to the compile options.
7542 //
7543 // FIXME: If we are completely confident that we have the right set, we only
7544 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007545 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007546 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
7547 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00007548 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00007549 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007550 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007551
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007552 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007553}