blob: 9f0bd964be12424fc75bb7bfb8908318f206b2f0 [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)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004554 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004555 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004556 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004557 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004558 .Case("hwdiv", HWDiv & HWDivThumb)
4559 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004560 .Default(false);
4561 }
Renato Golin15b86152015-07-03 16:41:13 +00004562
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004563 bool setCPU(const std::string &Name) override {
Renato Golin15b86152015-07-03 16:41:13 +00004564 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(Name);
4565 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004566 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004567 setArchInfo(Name);
4568 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004569 CPU = Name;
4570 return true;
4571 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004572
Craig Topper3164f332014-03-11 03:39:26 +00004573 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004574
Craig Topper3164f332014-03-11 03:39:26 +00004575 void getTargetDefines(const LangOptions &Opts,
4576 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004577 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004578 Builder.defineMacro("__arm");
4579 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004580
Chris Lattnerecd49032009-03-02 22:27:17 +00004581 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004582 Builder.defineMacro("__REGISTER_PREFIX__", "");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004583 if (!CPUAttr.empty())
4584 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004585
4586 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004587 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Tamas Berghammer15ef9472015-07-17 10:16:11 +00004588 Builder.defineMacro("__ARM_ARCH", llvm::utostr(ArchVersion));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004589 if (ArchVersion >= 8) {
Eric Christopher917e9522014-11-18 22:36:15 +00004590 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4591 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004592 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004593
4594 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4595 // is not defined for the M-profile.
4596 // NOTE that the deffault profile is assumed to be 'A'
4597 if (CPUProfile.empty() || CPUProfile != "M")
4598 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4599
4600 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4601 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4602 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004603 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004604 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004605 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004606 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4607
4608 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4609 // instruction set such as ARM or Thumb.
4610 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4611
4612 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4613
4614 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004615 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004616 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004617
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004618 // ACLE 6.5.1 Hardware Floating Point
4619 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004620 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004621
Yi Konga44c4d72014-06-27 21:25:42 +00004622 // ACLE predefines.
4623 Builder.defineMacro("__ARM_ACLE", "200");
4624
Mike Stump9d54bd72009-04-08 02:07:04 +00004625 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004626
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004627 // FIXME: It's more complicated than this and we don't really support
4628 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004629 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004630 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004631 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004632
David Tweed8f676532012-10-25 13:33:01 +00004633 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004634 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004635 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4636 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004637 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004638 Builder.defineMacro("__ARM_PCS", "1");
4639
David Tweed8f676532012-10-25 13:33:01 +00004640 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004641 Builder.defineMacro("__ARM_PCS_VFP", "1");
4642 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004643
Daniel Dunbar893d4752009-12-19 04:15:38 +00004644 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004645 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004646
4647 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004648 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004649
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004650 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004651 Builder.defineMacro("__THUMBEL__");
4652 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004653 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004654 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004655 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004656 if (((HWDiv & HWDivThumb) && isThumb()) || ((HWDiv & HWDivARM) && !isThumb()))
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004657 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004658
4659 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004660 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004661
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004662 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004663 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004664 if (FPU & VFP2FPU)
4665 Builder.defineMacro("__ARM_VFPV2__");
4666 if (FPU & VFP3FPU)
4667 Builder.defineMacro("__ARM_VFPV3__");
4668 if (FPU & VFP4FPU)
4669 Builder.defineMacro("__ARM_VFPV4__");
4670 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004671
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004672 // This only gets set when Neon instructions are actually available, unlike
4673 // the VFP define, hence the soft float and arch check. This is subtly
4674 // different from gcc, we follow the intent which was that it should be set
4675 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004676 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Tim Northover5bb34ca2013-11-21 12:36:34 +00004677 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004678 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004679 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004680
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004681 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4682 Opts.ShortWChar ? "2" : "4");
4683
4684 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4685 Opts.ShortEnums ? "1" : "4");
4686
Bernard Ogden18b57012013-10-29 09:47:51 +00004687 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004688 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004689
Tim Northover02e38602014-02-03 17:28:04 +00004690 if (Crypto)
4691 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4692
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004693 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004694 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4695 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4696 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4697 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4698 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004699
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004700 bool is5EOrAbove = (ArchVersion >= 6 ||
4701 (ArchVersion == 5 && CPUAttr.count('E')));
4702 // FIXME: We are not getting all 32-bit ARM architectures
4703 bool is32Bit = (!isThumb() || supportsThumb2());
4704 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUAttr == "7EM"))
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004705 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004706 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004707
Craig Topper3164f332014-03-11 03:39:26 +00004708 void getTargetBuiltins(const Builtin::Info *&Records,
4709 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004710 Records = BuiltinInfo;
4711 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004712 }
Craig Topper3164f332014-03-11 03:39:26 +00004713 bool isCLZForZeroUndef() const override { return false; }
4714 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004715 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004716 }
Craig Topper3164f332014-03-11 03:39:26 +00004717 void getGCCRegNames(const char * const *&Names,
4718 unsigned &NumNames) const override;
4719 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4720 unsigned &NumAliases) const override;
4721 bool validateAsmConstraint(const char *&Name,
4722 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004723 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004724 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004725 case 'l': // r0-r7
4726 case 'h': // r8-r15
4727 case 'w': // VFP Floating point register single precision
4728 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004729 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004730 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004731 case 'I':
4732 case 'J':
4733 case 'K':
4734 case 'L':
4735 case 'M':
4736 // FIXME
4737 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004738 case 'Q': // A memory address that is a single base register.
4739 Info.setAllowsMemory();
4740 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004741 case 'U': // a memory reference...
4742 switch (Name[1]) {
4743 case 'q': // ...ARMV4 ldrsb
4744 case 'v': // ...VFP load/store (reg+constant offset)
4745 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004746 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004747 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004748 case 'n': // valid address for Neon doubleword vector load/store
4749 case 'm': // valid address for Neon element and structure load/store
4750 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004751 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004752 Info.setAllowsMemory();
4753 Name++;
4754 return true;
4755 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004756 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004757 return false;
4758 }
Craig Topper3164f332014-03-11 03:39:26 +00004759 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004760 std::string R;
4761 switch (*Constraint) {
4762 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004763 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004764 Constraint++;
4765 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004766 case 'p': // 'p' should be translated to 'r' by default.
4767 R = std::string("r");
4768 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004769 default:
4770 return std::string(1, *Constraint);
4771 }
4772 return R;
4773 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004774 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004775 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004776 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004777 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004778 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004779
Bill Wendling9d1ee112012-10-25 23:28:48 +00004780 // Strip off constraint modifiers.
4781 while (Constraint[0] == '=' ||
4782 Constraint[0] == '+' ||
4783 Constraint[0] == '&')
4784 Constraint = Constraint.substr(1);
4785
4786 switch (Constraint[0]) {
4787 default: break;
4788 case 'r': {
4789 switch (Modifier) {
4790 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004791 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004792 case 'q':
4793 // A register of size 32 cannot fit a vector type.
4794 return false;
4795 }
4796 }
4797 }
4798
4799 return true;
4800 }
Craig Topper3164f332014-03-11 03:39:26 +00004801 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004802 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004803 return "";
4804 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004805
Craig Topper3164f332014-03-11 03:39:26 +00004806 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004807 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4808 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004809
Craig Topper3164f332014-03-11 03:39:26 +00004810 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004811 if (RegNo == 0) return 0;
4812 if (RegNo == 1) return 1;
4813 return -1;
4814 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00004815
4816 bool hasSjLjLowering() const override {
4817 return true;
4818 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004819};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004820
Rafael Espindolaeb265472013-08-21 21:59:03 +00004821bool ARMTargetInfo::setFPMath(StringRef Name) {
4822 if (Name == "neon") {
4823 FPMath = FP_Neon;
4824 return true;
4825 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4826 Name == "vfp4") {
4827 FPMath = FP_VFP;
4828 return true;
4829 }
4830 return false;
4831}
4832
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004833const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004834 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004835 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004836 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4837
4838 // Float registers
4839 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4840 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4841 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004842 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004843
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004844 // Double registers
4845 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4846 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004847 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4848 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004849
4850 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004851 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4852 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004853};
4854
4855void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004856 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004857 Names = GCCRegNames;
4858 NumNames = llvm::array_lengthof(GCCRegNames);
4859}
4860
4861const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004862 { { "a1" }, "r0" },
4863 { { "a2" }, "r1" },
4864 { { "a3" }, "r2" },
4865 { { "a4" }, "r3" },
4866 { { "v1" }, "r4" },
4867 { { "v2" }, "r5" },
4868 { { "v3" }, "r6" },
4869 { { "v4" }, "r7" },
4870 { { "v5" }, "r8" },
4871 { { "v6", "rfp" }, "r9" },
4872 { { "sl" }, "r10" },
4873 { { "fp" }, "r11" },
4874 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004875 { { "r13" }, "sp" },
4876 { { "r14" }, "lr" },
4877 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004878 // The S, D and Q registers overlap, but aren't really aliases; we
4879 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004880};
4881
4882void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4883 unsigned &NumAliases) const {
4884 Aliases = GCCRegAliases;
4885 NumAliases = llvm::array_lengthof(GCCRegAliases);
4886}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004887
4888const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004889#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004890#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004891 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004892#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004893
4894#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004895#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004896#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4897 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004898#include "clang/Basic/BuiltinsARM.def"
4899};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004900
4901class ARMleTargetInfo : public ARMTargetInfo {
4902public:
4903 ARMleTargetInfo(const llvm::Triple &Triple)
4904 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004905 void getTargetDefines(const LangOptions &Opts,
4906 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004907 Builder.defineMacro("__ARMEL__");
4908 ARMTargetInfo::getTargetDefines(Opts, Builder);
4909 }
4910};
4911
4912class ARMbeTargetInfo : public ARMTargetInfo {
4913public:
4914 ARMbeTargetInfo(const llvm::Triple &Triple)
4915 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004916 void getTargetDefines(const LangOptions &Opts,
4917 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004918 Builder.defineMacro("__ARMEB__");
4919 Builder.defineMacro("__ARM_BIG_ENDIAN");
4920 ARMTargetInfo::getTargetDefines(Opts, Builder);
4921 }
4922};
Chris Lattner17df24e2008-04-21 18:56:49 +00004923
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004924class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4925 const llvm::Triple Triple;
4926public:
4927 WindowsARMTargetInfo(const llvm::Triple &Triple)
4928 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4929 TLSSupported = false;
4930 WCharType = UnsignedShort;
4931 SizeType = UnsignedInt;
4932 UserLabelPrefix = "";
4933 }
4934 void getVisualStudioDefines(const LangOptions &Opts,
4935 MacroBuilder &Builder) const {
4936 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4937
4938 // FIXME: this is invalid for WindowsCE
4939 Builder.defineMacro("_M_ARM_NT", "1");
4940 Builder.defineMacro("_M_ARMT", "_M_ARM");
4941 Builder.defineMacro("_M_THUMB", "_M_ARM");
4942
4943 assert((Triple.getArch() == llvm::Triple::arm ||
4944 Triple.getArch() == llvm::Triple::thumb) &&
4945 "invalid architecture for Windows ARM target info");
4946 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4947 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4948
4949 // TODO map the complete set of values
4950 // 31: VFPv3 40: VFPv4
4951 Builder.defineMacro("_M_ARM_FP", "31");
4952 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004953 BuiltinVaListKind getBuiltinVaListKind() const override {
4954 return TargetInfo::CharPtrBuiltinVaList;
4955 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004956};
4957
4958// Windows ARM + Itanium C++ ABI Target
4959class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4960public:
4961 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4962 : WindowsARMTargetInfo(Triple) {
4963 TheCXXABI.set(TargetCXXABI::GenericARM);
4964 }
4965
4966 void getTargetDefines(const LangOptions &Opts,
4967 MacroBuilder &Builder) const override {
4968 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4969
4970 if (Opts.MSVCCompat)
4971 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4972 }
4973};
4974
4975// Windows ARM, MS (C++) ABI
4976class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4977public:
4978 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4979 : WindowsARMTargetInfo(Triple) {
4980 TheCXXABI.set(TargetCXXABI::Microsoft);
4981 }
4982
4983 void getTargetDefines(const LangOptions &Opts,
4984 MacroBuilder &Builder) const override {
4985 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4986 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4987 }
4988};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004989
Yaron Keren321249c2015-07-15 13:32:23 +00004990// ARM MinGW target
4991class MinGWARMTargetInfo : public WindowsARMTargetInfo {
4992public:
4993 MinGWARMTargetInfo(const llvm::Triple &Triple)
4994 : WindowsARMTargetInfo(Triple) {
4995 TheCXXABI.set(TargetCXXABI::GenericARM);
4996 }
4997
4998 void getTargetDefines(const LangOptions &Opts,
4999 MacroBuilder &Builder) const override {
5000 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5001 DefineStd(Builder, "WIN32", Opts);
5002 DefineStd(Builder, "WINNT", Opts);
5003 Builder.defineMacro("_ARM_");
5004 addMinGWDefines(Opts, Builder);
5005 }
5006};
5007
5008// ARM Cygwin target
5009class CygwinARMTargetInfo : public ARMleTargetInfo {
5010public:
5011 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5012 TLSSupported = false;
5013 WCharType = UnsignedShort;
5014 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005015 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005016 }
5017 void getTargetDefines(const LangOptions &Opts,
5018 MacroBuilder &Builder) const override {
5019 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5020 Builder.defineMacro("_ARM_");
5021 Builder.defineMacro("__CYGWIN__");
5022 Builder.defineMacro("__CYGWIN32__");
5023 DefineStd(Builder, "unix", Opts);
5024 if (Opts.CPlusPlus)
5025 Builder.defineMacro("_GNU_SOURCE");
5026 }
5027};
5028
Mike Stump11289f42009-09-09 15:08:12 +00005029class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005030 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005031protected:
Craig Topper3164f332014-03-11 03:39:26 +00005032 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5033 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005034 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005035 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005036
Torok Edwinb2b37c62009-06-30 17:10:35 +00005037public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005038 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005039 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005040 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005041 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005042 // FIXME: This should be based off of the target features in
5043 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005044 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005045
5046 // Darwin on iOS uses a variant of the ARM C++ ABI.
5047 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005048 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005049};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005050
Tim Northover573cbee2014-05-24 12:52:07 +00005051class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005052 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005053 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5054 static const char *const GCCRegNames[];
5055
James Molloy75f5f9e2014-04-16 15:33:48 +00005056 enum FPUModeEnum {
5057 FPUMode,
5058 NeonMode
5059 };
5060
5061 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005062 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005063 unsigned Crypto;
5064
Tim Northovera2ee4332014-03-29 15:09:45 +00005065 static const Builtin::Info BuiltinInfo[];
5066
5067 std::string ABI;
5068
5069public:
Tim Northover573cbee2014-05-24 12:52:07 +00005070 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005071 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005072
5073 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5074 WCharType = SignedInt;
5075
5076 // NetBSD apparently prefers consistency across ARM targets to consistency
5077 // across 64-bit targets.
5078 Int64Type = SignedLongLong;
5079 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005080 } else {
5081 WCharType = UnsignedInt;
5082 Int64Type = SignedLong;
5083 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005084 }
5085
Tim Northovera2ee4332014-03-29 15:09:45 +00005086 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005087 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005088 MaxAtomicInlineWidth = 128;
5089 MaxAtomicPromoteWidth = 128;
5090
Tim Northovera6a19f12015-02-06 01:25:07 +00005091 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005092 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5093
Tim Northovera2ee4332014-03-29 15:09:45 +00005094 // {} in inline assembly are neon specifiers, not assembly variant
5095 // specifiers.
5096 NoAsmVariants = true;
5097
Tim Northover7ad87af2015-01-16 18:44:04 +00005098 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5099 // contributes to the alignment of the containing aggregate in the same way
5100 // a plain (non bit-field) member of that type would, without exception for
5101 // zero-sized or anonymous bit-fields."
5102 UseBitFieldTypeAlignment = true;
5103 UseZeroLengthBitfieldAlignment = true;
5104
Tim Northover573cbee2014-05-24 12:52:07 +00005105 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005106 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5107 }
5108
Alp Toker4925ba72014-06-07 23:30:42 +00005109 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005110 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005111 if (Name != "aapcs" && Name != "darwinpcs")
5112 return false;
5113
5114 ABI = Name;
5115 return true;
5116 }
5117
David Blaikie1cbb9712014-11-14 19:09:44 +00005118 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005119 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005120 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00005121 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005122 .Case("cyclone", true)
5123 .Default(false);
5124 return CPUKnown;
5125 }
5126
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005127 void getTargetDefines(const LangOptions &Opts,
5128 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005129 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005130 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005131
5132 // Target properties.
5133 Builder.defineMacro("_LP64");
5134 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005135
5136 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5137 Builder.defineMacro("__ARM_ACLE", "200");
5138 Builder.defineMacro("__ARM_ARCH", "8");
5139 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5140
5141 Builder.defineMacro("__ARM_64BIT_STATE");
5142 Builder.defineMacro("__ARM_PCS_AAPCS64");
5143 Builder.defineMacro("__ARM_ARCH_ISA_A64");
5144
5145 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
5146 Builder.defineMacro("__ARM_FEATURE_CLZ");
5147 Builder.defineMacro("__ARM_FEATURE_FMA");
5148 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00005149 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
5150 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
5151 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
5152 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00005153
5154 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5155
5156 // 0xe implies support for half, single and double precision operations.
5157 Builder.defineMacro("__ARM_FP", "0xe");
5158
5159 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5160 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
5161 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
5162
5163 if (Opts.FastMath || Opts.FiniteMathOnly)
5164 Builder.defineMacro("__ARM_FP_FAST");
5165
Richard Smithab506ad2014-10-20 23:26:58 +00005166 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00005167 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
5168
5169 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5170
5171 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5172 Opts.ShortEnums ? "1" : "4");
5173
James Molloy75f5f9e2014-04-16 15:33:48 +00005174 if (FPU == NeonMode) {
5175 Builder.defineMacro("__ARM_NEON");
5176 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00005177 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00005178 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005179
Bradley Smith418c5932014-05-02 15:17:51 +00005180 if (CRC)
5181 Builder.defineMacro("__ARM_FEATURE_CRC32");
5182
James Molloy75f5f9e2014-04-16 15:33:48 +00005183 if (Crypto)
5184 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Reid Klecknerd167d422015-05-06 15:31:46 +00005185
5186 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5187 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5188 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5189 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5190 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005191 }
5192
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005193 void getTargetBuiltins(const Builtin::Info *&Records,
5194 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005195 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00005196 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00005197 }
5198
David Blaikie1cbb9712014-11-14 19:09:44 +00005199 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005200 return Feature == "aarch64" ||
5201 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005202 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005203 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005204 }
5205
James Molloy5e73df52014-04-16 15:06:20 +00005206 bool handleTargetFeatures(std::vector<std::string> &Features,
5207 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005208 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005209 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005210 Crypto = 0;
5211 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5212 if (Features[i] == "+neon")
5213 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005214 if (Features[i] == "+crc")
5215 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005216 if (Features[i] == "+crypto")
5217 Crypto = 1;
5218 }
5219
Eric Christopher964a5f32015-08-05 23:48:05 +00005220 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005221
5222 return true;
5223 }
5224
David Blaikie1cbb9712014-11-14 19:09:44 +00005225 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005226
David Blaikie1cbb9712014-11-14 19:09:44 +00005227 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005228 return TargetInfo::AArch64ABIBuiltinVaList;
5229 }
5230
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005231 void getGCCRegNames(const char *const *&Names,
5232 unsigned &NumNames) const override;
5233 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5234 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005235
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005236 bool validateAsmConstraint(const char *&Name,
5237 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005238 switch (*Name) {
5239 default:
5240 return false;
5241 case 'w': // Floating point and SIMD registers (V0-V31)
5242 Info.setAllowsRegister();
5243 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005244 case 'I': // Constant that can be used with an ADD instruction
5245 case 'J': // Constant that can be used with a SUB instruction
5246 case 'K': // Constant that can be used with a 32-bit logical instruction
5247 case 'L': // Constant that can be used with a 64-bit logical instruction
5248 case 'M': // Constant that can be used as a 32-bit MOV immediate
5249 case 'N': // Constant that can be used as a 64-bit MOV immediate
5250 case 'Y': // Floating point constant zero
5251 case 'Z': // Integer constant zero
5252 return true;
5253 case 'Q': // A memory reference with base register and no offset
5254 Info.setAllowsMemory();
5255 return true;
5256 case 'S': // A symbolic address
5257 Info.setAllowsRegister();
5258 return true;
5259 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005260 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5261 // Utf: A memory address suitable for ldp/stp in TF mode.
5262 // Usa: An absolute symbolic address.
5263 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5264 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005265 case 'z': // Zero register, wzr or xzr
5266 Info.setAllowsRegister();
5267 return true;
5268 case 'x': // Floating point and SIMD registers (V0-V15)
5269 Info.setAllowsRegister();
5270 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005271 }
5272 return false;
5273 }
5274
Akira Hatanaka987f1862014-08-22 06:05:21 +00005275 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005276 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005277 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005278 // Strip off constraint modifiers.
5279 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5280 Constraint = Constraint.substr(1);
5281
5282 switch (Constraint[0]) {
5283 default:
5284 return true;
5285 case 'z':
5286 case 'r': {
5287 switch (Modifier) {
5288 case 'x':
5289 case 'w':
5290 // For now assume that the person knows what they're
5291 // doing with the modifier.
5292 return true;
5293 default:
5294 // By default an 'r' constraint will be in the 'x'
5295 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005296 if (Size == 64)
5297 return true;
5298
5299 SuggestedModifier = "w";
5300 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005301 }
5302 }
5303 }
5304 }
5305
David Blaikie1cbb9712014-11-14 19:09:44 +00005306 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005307
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005308 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005309 if (RegNo == 0)
5310 return 0;
5311 if (RegNo == 1)
5312 return 1;
5313 return -1;
5314 }
5315};
5316
Tim Northover573cbee2014-05-24 12:52:07 +00005317const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005318 // 32-bit Integer registers
5319 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5320 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5321 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5322
5323 // 64-bit Integer registers
5324 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5325 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5326 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5327
5328 // 32-bit floating point regsisters
5329 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5330 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5331 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5332
5333 // 64-bit floating point regsisters
5334 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5335 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5336 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5337
5338 // Vector registers
5339 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5340 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5341 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5342};
5343
Tim Northover573cbee2014-05-24 12:52:07 +00005344void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005345 unsigned &NumNames) const {
5346 Names = GCCRegNames;
5347 NumNames = llvm::array_lengthof(GCCRegNames);
5348}
5349
Tim Northover573cbee2014-05-24 12:52:07 +00005350const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005351 { { "w31" }, "wsp" },
5352 { { "x29" }, "fp" },
5353 { { "x30" }, "lr" },
5354 { { "x31" }, "sp" },
5355 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5356 // don't want to substitute one of these for a different-sized one.
5357};
5358
Tim Northover573cbee2014-05-24 12:52:07 +00005359void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005360 unsigned &NumAliases) const {
5361 Aliases = GCCRegAliases;
5362 NumAliases = llvm::array_lengthof(GCCRegAliases);
5363}
5364
Tim Northover573cbee2014-05-24 12:52:07 +00005365const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005366#define BUILTIN(ID, TYPE, ATTRS) \
5367 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5368#include "clang/Basic/BuiltinsNEON.def"
5369
5370#define BUILTIN(ID, TYPE, ATTRS) \
5371 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00005372#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005373};
James Molloy5e73df52014-04-16 15:06:20 +00005374
Tim Northover573cbee2014-05-24 12:52:07 +00005375class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005376 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005377 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005378 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005379 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005380 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005381 }
5382
5383public:
Tim Northover573cbee2014-05-24 12:52:07 +00005384 AArch64leTargetInfo(const llvm::Triple &Triple)
5385 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005386 BigEndian = false;
5387 }
5388 void getTargetDefines(const LangOptions &Opts,
5389 MacroBuilder &Builder) const override {
5390 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005391 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005392 }
5393};
5394
Tim Northover573cbee2014-05-24 12:52:07 +00005395class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005396 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005397 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005398 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005399 }
5400
5401public:
Tim Northover573cbee2014-05-24 12:52:07 +00005402 AArch64beTargetInfo(const llvm::Triple &Triple)
5403 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005404 void getTargetDefines(const LangOptions &Opts,
5405 MacroBuilder &Builder) const override {
5406 Builder.defineMacro("__AARCH64EB__");
5407 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5408 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005409 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005410 }
5411};
Tim Northovera2ee4332014-03-29 15:09:45 +00005412
Tim Northover573cbee2014-05-24 12:52:07 +00005413class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005414protected:
5415 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5416 MacroBuilder &Builder) const override {
5417 Builder.defineMacro("__AARCH64_SIMD__");
5418 Builder.defineMacro("__ARM64_ARCH_8__");
5419 Builder.defineMacro("__ARM_NEON__");
5420 Builder.defineMacro("__LITTLE_ENDIAN__");
5421 Builder.defineMacro("__REGISTER_PREFIX__", "");
5422 Builder.defineMacro("__arm64", "1");
5423 Builder.defineMacro("__arm64__", "1");
5424
5425 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5426 }
5427
Tim Northovera2ee4332014-03-29 15:09:45 +00005428public:
Tim Northover573cbee2014-05-24 12:52:07 +00005429 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5430 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005431 Int64Type = SignedLongLong;
5432 WCharType = SignedInt;
5433 UseSignedCharForObjCBool = false;
5434
Tim Northovera6a19f12015-02-06 01:25:07 +00005435 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005436 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5437
5438 TheCXXABI.set(TargetCXXABI::iOS64);
5439 }
5440
David Blaikie1cbb9712014-11-14 19:09:44 +00005441 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005442 return TargetInfo::CharPtrBuiltinVaList;
5443 }
5444};
Tim Northovera2ee4332014-03-29 15:09:45 +00005445
Tony Linthicum76329bf2011-12-12 21:14:55 +00005446// Hexagon abstract base class
5447class HexagonTargetInfo : public TargetInfo {
5448 static const Builtin::Info BuiltinInfo[];
5449 static const char * const GCCRegNames[];
5450 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5451 std::string CPU;
5452public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005453 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005454 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00005455 DataLayoutString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005456
5457 // {} in inline assembly are packet specifiers, not assembly variant
5458 // specifiers.
5459 NoAsmVariants = true;
5460 }
5461
Craig Topper3164f332014-03-11 03:39:26 +00005462 void getTargetBuiltins(const Builtin::Info *&Records,
5463 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005464 Records = BuiltinInfo;
5465 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5466 }
5467
Craig Topper3164f332014-03-11 03:39:26 +00005468 bool validateAsmConstraint(const char *&Name,
5469 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005470 return true;
5471 }
5472
Craig Topper3164f332014-03-11 03:39:26 +00005473 void getTargetDefines(const LangOptions &Opts,
5474 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005475
Craig Topper3164f332014-03-11 03:39:26 +00005476 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005477 return Feature == "hexagon";
5478 }
Craig Topper3164f332014-03-11 03:39:26 +00005479
5480 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005481 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005482 }
Craig Topper3164f332014-03-11 03:39:26 +00005483 void getGCCRegNames(const char * const *&Names,
5484 unsigned &NumNames) const override;
5485 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5486 unsigned &NumAliases) const override;
5487 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005488 return "";
5489 }
Sebastian Pop86500282012-01-13 20:37:10 +00005490
5491 static const char *getHexagonCPUSuffix(StringRef Name) {
5492 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005493 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005494 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005495 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005496 }
5497
Craig Topper3164f332014-03-11 03:39:26 +00005498 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005499 if (!getHexagonCPUSuffix(Name))
5500 return false;
5501
Tony Linthicum76329bf2011-12-12 21:14:55 +00005502 CPU = Name;
5503 return true;
5504 }
5505};
5506
5507void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5508 MacroBuilder &Builder) const {
5509 Builder.defineMacro("qdsp6");
5510 Builder.defineMacro("__qdsp6", "1");
5511 Builder.defineMacro("__qdsp6__", "1");
5512
5513 Builder.defineMacro("hexagon");
5514 Builder.defineMacro("__hexagon", "1");
5515 Builder.defineMacro("__hexagon__", "1");
5516
5517 if(CPU == "hexagonv1") {
5518 Builder.defineMacro("__HEXAGON_V1__");
5519 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5520 if(Opts.HexagonQdsp6Compat) {
5521 Builder.defineMacro("__QDSP6_V1__");
5522 Builder.defineMacro("__QDSP6_ARCH__", "1");
5523 }
5524 }
5525 else if(CPU == "hexagonv2") {
5526 Builder.defineMacro("__HEXAGON_V2__");
5527 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5528 if(Opts.HexagonQdsp6Compat) {
5529 Builder.defineMacro("__QDSP6_V2__");
5530 Builder.defineMacro("__QDSP6_ARCH__", "2");
5531 }
5532 }
5533 else if(CPU == "hexagonv3") {
5534 Builder.defineMacro("__HEXAGON_V3__");
5535 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5536 if(Opts.HexagonQdsp6Compat) {
5537 Builder.defineMacro("__QDSP6_V3__");
5538 Builder.defineMacro("__QDSP6_ARCH__", "3");
5539 }
5540 }
5541 else if(CPU == "hexagonv4") {
5542 Builder.defineMacro("__HEXAGON_V4__");
5543 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5544 if(Opts.HexagonQdsp6Compat) {
5545 Builder.defineMacro("__QDSP6_V4__");
5546 Builder.defineMacro("__QDSP6_ARCH__", "4");
5547 }
5548 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005549 else if(CPU == "hexagonv5") {
5550 Builder.defineMacro("__HEXAGON_V5__");
5551 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5552 if(Opts.HexagonQdsp6Compat) {
5553 Builder.defineMacro("__QDSP6_V5__");
5554 Builder.defineMacro("__QDSP6_ARCH__", "5");
5555 }
5556 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005557}
5558
5559const char * const HexagonTargetInfo::GCCRegNames[] = {
5560 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5561 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5562 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5563 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5564 "p0", "p1", "p2", "p3",
5565 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5566};
5567
5568void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5569 unsigned &NumNames) const {
5570 Names = GCCRegNames;
5571 NumNames = llvm::array_lengthof(GCCRegNames);
5572}
5573
5574
5575const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5576 { { "sp" }, "r29" },
5577 { { "fp" }, "r30" },
5578 { { "lr" }, "r31" },
5579 };
5580
5581void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5582 unsigned &NumAliases) const {
5583 Aliases = GCCRegAliases;
5584 NumAliases = llvm::array_lengthof(GCCRegAliases);
5585}
5586
5587
5588const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5589#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5590#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5591 ALL_LANGUAGES },
5592#include "clang/Basic/BuiltinsHexagon.def"
5593};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005594
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005595// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5596class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005597 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5598 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005599 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005600public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005601 SparcTargetInfo(const llvm::Triple &Triple)
5602 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005603
Craig Topper3164f332014-03-11 03:39:26 +00005604 bool handleTargetFeatures(std::vector<std::string> &Features,
5605 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005606 // The backend doesn't actually handle soft float yet, but in case someone
5607 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005608 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5609 if (Feature != Features.end()) {
5610 SoftFloat = true;
5611 Features.erase(Feature);
5612 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005613 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005614 }
Craig Topper3164f332014-03-11 03:39:26 +00005615 void getTargetDefines(const LangOptions &Opts,
5616 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005617 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005618 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005619
5620 if (SoftFloat)
5621 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005622 }
Craig Topper3164f332014-03-11 03:39:26 +00005623
5624 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005625 return llvm::StringSwitch<bool>(Feature)
5626 .Case("softfloat", SoftFloat)
5627 .Case("sparc", true)
5628 .Default(false);
5629 }
Craig Topper3164f332014-03-11 03:39:26 +00005630
5631 void getTargetBuiltins(const Builtin::Info *&Records,
5632 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005633 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005634 }
Craig Topper3164f332014-03-11 03:39:26 +00005635 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005636 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005637 }
Craig Topper3164f332014-03-11 03:39:26 +00005638 void getGCCRegNames(const char * const *&Names,
5639 unsigned &NumNames) const override;
5640 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5641 unsigned &NumAliases) const override;
5642 bool validateAsmConstraint(const char *&Name,
5643 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005644 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005645 switch (*Name) {
5646 case 'I': // Signed 13-bit constant
5647 case 'J': // Zero
5648 case 'K': // 32-bit constant with the low 12 bits clear
5649 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5650 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5651 case 'N': // Same as 'K' but zext (required for SIMode)
5652 case 'O': // The constant 4096
5653 return true;
5654 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005655 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005656 }
Craig Topper3164f332014-03-11 03:39:26 +00005657 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005658 // FIXME: Implement!
5659 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005660 }
5661};
5662
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005663const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005664 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5665 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5666 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5667 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5668};
5669
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005670void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5671 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005672 Names = GCCRegNames;
5673 NumNames = llvm::array_lengthof(GCCRegNames);
5674}
5675
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005676const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005677 { { "g0" }, "r0" },
5678 { { "g1" }, "r1" },
5679 { { "g2" }, "r2" },
5680 { { "g3" }, "r3" },
5681 { { "g4" }, "r4" },
5682 { { "g5" }, "r5" },
5683 { { "g6" }, "r6" },
5684 { { "g7" }, "r7" },
5685 { { "o0" }, "r8" },
5686 { { "o1" }, "r9" },
5687 { { "o2" }, "r10" },
5688 { { "o3" }, "r11" },
5689 { { "o4" }, "r12" },
5690 { { "o5" }, "r13" },
5691 { { "o6", "sp" }, "r14" },
5692 { { "o7" }, "r15" },
5693 { { "l0" }, "r16" },
5694 { { "l1" }, "r17" },
5695 { { "l2" }, "r18" },
5696 { { "l3" }, "r19" },
5697 { { "l4" }, "r20" },
5698 { { "l5" }, "r21" },
5699 { { "l6" }, "r22" },
5700 { { "l7" }, "r23" },
5701 { { "i0" }, "r24" },
5702 { { "i1" }, "r25" },
5703 { { "i2" }, "r26" },
5704 { { "i3" }, "r27" },
5705 { { "i4" }, "r28" },
5706 { { "i5" }, "r29" },
5707 { { "i6", "fp" }, "r30" },
5708 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005709};
5710
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005711void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5712 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005713 Aliases = GCCRegAliases;
5714 NumAliases = llvm::array_lengthof(GCCRegAliases);
5715}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005716
5717// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5718class SparcV8TargetInfo : public SparcTargetInfo {
5719public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005720 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005721 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
James Y Knight4b4d19e2015-06-04 15:36:29 +00005722 // NetBSD uses long (same as llvm default); everyone else uses int.
5723 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5724 SizeType = UnsignedLong;
5725 IntPtrType = SignedLong;
5726 PtrDiffType = SignedLong;
5727 } else {
5728 SizeType = UnsignedInt;
5729 IntPtrType = SignedInt;
5730 PtrDiffType = SignedInt;
5731 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005732 }
5733
Craig Topper3164f332014-03-11 03:39:26 +00005734 void getTargetDefines(const LangOptions &Opts,
5735 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005736 SparcTargetInfo::getTargetDefines(Opts, Builder);
5737 Builder.defineMacro("__sparcv8");
5738 }
5739};
5740
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005741// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5742class SparcV8elTargetInfo : public SparcV8TargetInfo {
5743 public:
5744 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00005745 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005746 BigEndian = false;
5747 }
5748};
5749
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005750// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5751class SparcV9TargetInfo : public SparcTargetInfo {
5752public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005753 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005754 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00005755 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005756 // This is an LP64 platform.
5757 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005758
5759 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005760 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005761 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005762 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005763 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005764 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005765
5766 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5767 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5768 LongDoubleWidth = 128;
5769 LongDoubleAlign = 128;
5770 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005771 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005772 }
5773
Craig Topper3164f332014-03-11 03:39:26 +00005774 void getTargetDefines(const LangOptions &Opts,
5775 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005776 SparcTargetInfo::getTargetDefines(Opts, Builder);
5777 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005778 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005779 // Solaris doesn't need these variants, but the BSDs do.
5780 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005781 Builder.defineMacro("__sparc64__");
5782 Builder.defineMacro("__sparc_v9__");
5783 Builder.defineMacro("__sparcv9__");
5784 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005785 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005786
Craig Topper3164f332014-03-11 03:39:26 +00005787 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005788 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5789 .Case("v9", true)
5790 .Case("ultrasparc", true)
5791 .Case("ultrasparc3", true)
5792 .Case("niagara", true)
5793 .Case("niagara2", true)
5794 .Case("niagara3", true)
5795 .Case("niagara4", true)
5796 .Default(false);
5797
5798 // No need to store the CPU yet. There aren't any CPU-specific
5799 // macros to define.
5800 return CPUKnown;
5801 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005802};
5803
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005804class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005805 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005806 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005807 std::string CPU;
5808 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005809 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005810
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005811public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005812 SystemZTargetInfo(const llvm::Triple &Triple)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005813 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005814 IntMaxType = SignedLong;
5815 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005816 TLSSupported = true;
5817 IntWidth = IntAlign = 32;
5818 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5819 PointerWidth = PointerAlign = 64;
5820 LongDoubleWidth = 128;
5821 LongDoubleAlign = 64;
5822 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005823 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005824 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00005825 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 +00005826 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5827 }
5828 void getTargetDefines(const LangOptions &Opts,
5829 MacroBuilder &Builder) const override {
5830 Builder.defineMacro("__s390__");
5831 Builder.defineMacro("__s390x__");
5832 Builder.defineMacro("__zarch__");
5833 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005834 if (HasTransactionalExecution)
5835 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00005836 if (Opts.ZVector)
5837 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005838 }
5839 void getTargetBuiltins(const Builtin::Info *&Records,
5840 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005841 Records = BuiltinInfo;
5842 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005843 }
5844
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005845 void getGCCRegNames(const char *const *&Names,
5846 unsigned &NumNames) const override;
5847 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5848 unsigned &NumAliases) const override {
5849 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005850 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005851 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005852 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005853 bool validateAsmConstraint(const char *&Name,
5854 TargetInfo::ConstraintInfo &info) const override;
5855 const char *getClobbers() const override {
5856 // FIXME: Is this really right?
5857 return "";
5858 }
5859 BuiltinVaListKind getBuiltinVaListKind() const override {
5860 return TargetInfo::SystemZBuiltinVaList;
5861 }
5862 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005863 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005864 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5865 .Case("z10", true)
5866 .Case("z196", true)
5867 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005868 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005869 .Default(false);
5870
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005871 return CPUKnown;
5872 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005873 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5874 if (CPU == "zEC12")
5875 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005876 if (CPU == "z13") {
5877 Features["transactional-execution"] = true;
5878 Features["vector"] = true;
5879 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005880 }
5881
5882 bool handleTargetFeatures(std::vector<std::string> &Features,
5883 DiagnosticsEngine &Diags) override {
5884 HasTransactionalExecution = false;
5885 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5886 if (Features[i] == "+transactional-execution")
5887 HasTransactionalExecution = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005888 if (Features[i] == "+vector")
5889 HasVector = true;
5890 }
5891 // If we use the vector ABI, vector types are 64-bit aligned.
5892 if (HasVector) {
5893 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005894 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5895 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005896 }
5897 return true;
5898 }
5899
5900 bool hasFeature(StringRef Feature) const override {
5901 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005902 .Case("systemz", true)
5903 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005904 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005905 .Default(false);
5906 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005907
5908 StringRef getABI() const override {
5909 if (HasVector)
5910 return "vector";
5911 return "";
5912 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00005913
5914 bool useFloat128ManglingForLongDouble() const override {
5915 return true;
5916 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005917};
5918
5919const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5920#define BUILTIN(ID, TYPE, ATTRS) \
5921 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5922#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005923};
5924
5925const char *const SystemZTargetInfo::GCCRegNames[] = {
5926 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5927 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5928 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5929 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5930};
5931
5932void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5933 unsigned &NumNames) const {
5934 Names = GCCRegNames;
5935 NumNames = llvm::array_lengthof(GCCRegNames);
5936}
5937
5938bool SystemZTargetInfo::
5939validateAsmConstraint(const char *&Name,
5940 TargetInfo::ConstraintInfo &Info) const {
5941 switch (*Name) {
5942 default:
5943 return false;
5944
5945 case 'a': // Address register
5946 case 'd': // Data register (equivalent to 'r')
5947 case 'f': // Floating-point register
5948 Info.setAllowsRegister();
5949 return true;
5950
5951 case 'I': // Unsigned 8-bit constant
5952 case 'J': // Unsigned 12-bit constant
5953 case 'K': // Signed 16-bit constant
5954 case 'L': // Signed 20-bit displacement (on all targets we support)
5955 case 'M': // 0x7fffffff
5956 return true;
5957
5958 case 'Q': // Memory with base and unsigned 12-bit displacement
5959 case 'R': // Likewise, plus an index
5960 case 'S': // Memory with base and signed 20-bit displacement
5961 case 'T': // Likewise, plus an index
5962 Info.setAllowsMemory();
5963 return true;
5964 }
5965}
Ulrich Weigand47445072013-05-06 16:26:41 +00005966
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005967 class MSP430TargetInfo : public TargetInfo {
5968 static const char * const GCCRegNames[];
5969 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005970 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005971 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005972 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005973 IntWidth = 16; IntAlign = 16;
5974 LongWidth = 32; LongLongWidth = 64;
5975 LongAlign = LongLongAlign = 16;
5976 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005977 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005978 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005979 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005980 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005981 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005982 SigAtomicType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00005983 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005984 }
5985 void getTargetDefines(const LangOptions &Opts,
5986 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005987 Builder.defineMacro("MSP430");
5988 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005989 // FIXME: defines for different 'flavours' of MCU
5990 }
Craig Topper3164f332014-03-11 03:39:26 +00005991 void getTargetBuiltins(const Builtin::Info *&Records,
5992 unsigned &NumRecords) const override {
5993 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005994 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005995 NumRecords = 0;
5996 }
Craig Topper3164f332014-03-11 03:39:26 +00005997 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005998 return Feature == "msp430";
5999 }
Craig Topper3164f332014-03-11 03:39:26 +00006000 void getGCCRegNames(const char * const *&Names,
6001 unsigned &NumNames) const override;
6002 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6003 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006004 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00006005 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006006 NumAliases = 0;
6007 }
Eric Christopher917e9522014-11-18 22:36:15 +00006008 bool
6009 validateAsmConstraint(const char *&Name,
6010 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006011 // FIXME: implement
6012 switch (*Name) {
6013 case 'K': // the constant 1
6014 case 'L': // constant -1^20 .. 1^19
6015 case 'M': // constant 1-4:
6016 return true;
6017 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00006018 // No target constraints for now.
6019 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006020 }
Craig Topper3164f332014-03-11 03:39:26 +00006021 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006022 // FIXME: Is this really right?
6023 return "";
6024 }
Craig Topper3164f332014-03-11 03:39:26 +00006025 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006026 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00006027 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006028 }
6029 };
6030
6031 const char * const MSP430TargetInfo::GCCRegNames[] = {
6032 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6033 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
6034 };
6035
6036 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
6037 unsigned &NumNames) const {
6038 Names = GCCRegNames;
6039 NumNames = llvm::array_lengthof(GCCRegNames);
6040 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00006041
Mike Stump11289f42009-09-09 15:08:12 +00006042 // LLVM and Clang cannot be used directly to output native binaries for
6043 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00006044 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00006045 //
6046 // TCE uses the llvm bitcode as input and uses it for generating customized
6047 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00006048 // publicly available in http://tce.cs.tut.fi
6049
Eli Friedman1f191002011-10-07 19:51:42 +00006050 static const unsigned TCEOpenCLAddrSpaceMap[] = {
6051 3, // opencl_global
6052 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00006053 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006054 // FIXME: generic has to be added to the target
6055 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00006056 0, // cuda_device
6057 0, // cuda_constant
6058 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00006059 };
6060
Eli Friedmana9c3d712009-08-19 20:47:07 +00006061 class TCETargetInfo : public TargetInfo{
6062 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006063 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00006064 TLSSupported = false;
6065 IntWidth = 32;
6066 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006067 PointerWidth = 32;
6068 IntAlign = 32;
6069 LongAlign = LongLongAlign = 32;
6070 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006071 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006072 SizeType = UnsignedInt;
6073 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006074 IntPtrType = SignedInt;
6075 PtrDiffType = SignedInt;
6076 FloatWidth = 32;
6077 FloatAlign = 32;
6078 DoubleWidth = 32;
6079 DoubleAlign = 32;
6080 LongDoubleWidth = 32;
6081 LongDoubleAlign = 32;
6082 FloatFormat = &llvm::APFloat::IEEEsingle;
6083 DoubleFormat = &llvm::APFloat::IEEEsingle;
6084 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Eric Christopher964a5f32015-08-05 23:48:05 +00006085 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6086 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00006087 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006088 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006089 }
6090
Craig Topper3164f332014-03-11 03:39:26 +00006091 void getTargetDefines(const LangOptions &Opts,
6092 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006093 DefineStd(Builder, "tce", Opts);
6094 Builder.defineMacro("__TCE__");
6095 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00006096 }
Craig Topper3164f332014-03-11 03:39:26 +00006097 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006098 return Feature == "tce";
6099 }
Craig Topper3164f332014-03-11 03:39:26 +00006100
6101 void getTargetBuiltins(const Builtin::Info *&Records,
6102 unsigned &NumRecords) const override {}
6103 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00006104 return "";
6105 }
Craig Topper3164f332014-03-11 03:39:26 +00006106 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006107 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00006108 }
Craig Topper3164f332014-03-11 03:39:26 +00006109 void getGCCRegNames(const char * const *&Names,
6110 unsigned &NumNames) const override {}
6111 bool validateAsmConstraint(const char *&Name,
6112 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00006113 return true;
6114 }
Craig Topper3164f332014-03-11 03:39:26 +00006115 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6116 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00006117 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00006118
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006119class BPFTargetInfo : public TargetInfo {
6120public:
6121 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6122 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6123 SizeType = UnsignedLong;
6124 PtrDiffType = SignedLong;
6125 IntPtrType = SignedLong;
6126 IntMaxType = SignedLong;
6127 Int64Type = SignedLong;
6128 RegParmMax = 5;
6129 if (Triple.getArch() == llvm::Triple::bpfeb) {
6130 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006131 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006132 } else {
6133 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006134 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006135 }
6136 MaxAtomicPromoteWidth = 64;
6137 MaxAtomicInlineWidth = 64;
6138 TLSSupported = false;
6139 }
6140 void getTargetDefines(const LangOptions &Opts,
6141 MacroBuilder &Builder) const override {
6142 DefineStd(Builder, "bpf", Opts);
6143 Builder.defineMacro("__BPF__");
6144 }
6145 bool hasFeature(StringRef Feature) const override {
6146 return Feature == "bpf";
6147 }
6148
6149 void getTargetBuiltins(const Builtin::Info *&Records,
6150 unsigned &NumRecords) const override {}
6151 const char *getClobbers() const override {
6152 return "";
6153 }
6154 BuiltinVaListKind getBuiltinVaListKind() const override {
6155 return TargetInfo::VoidPtrBuiltinVaList;
6156 }
6157 void getGCCRegNames(const char * const *&Names,
6158 unsigned &NumNames) const override {
6159 Names = nullptr;
6160 NumNames = 0;
6161 }
6162 bool validateAsmConstraint(const char *&Name,
6163 TargetInfo::ConstraintInfo &info) const override {
6164 return true;
6165 }
6166 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6167 unsigned &NumAliases) const override {
6168 Aliases = nullptr;
6169 NumAliases = 0;
6170 }
6171};
6172
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006173class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006174 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006175
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006176 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006177 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006178 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006179 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006180 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006181 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006182 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006183 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006184 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006185 enum DspRevEnum {
6186 NoDSP, DSP1, DSP2
6187 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006188 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006189
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006190protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006191 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006192 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006193
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006194public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006195 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6196 const std::string &CPUStr)
6197 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006198 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006199 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6200 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6201 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006202
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006203 bool isNaN2008Default() const {
6204 return CPU == "mips32r6" || CPU == "mips64r6";
6205 }
6206
6207 bool isFP64Default() const {
6208 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6209 }
6210
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006211 bool isNan2008() const override {
6212 return IsNan2008;
6213 }
6214
Alp Toker4925ba72014-06-07 23:30:42 +00006215 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006216 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006217 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6218 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006219 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006220 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006221 .Case("mips1", IsMips32)
6222 .Case("mips2", IsMips32)
6223 .Case("mips3", true)
6224 .Case("mips4", true)
6225 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006226 .Case("mips32", IsMips32)
6227 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006228 .Case("mips32r3", IsMips32)
6229 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006230 .Case("mips32r6", IsMips32)
6231 .Case("mips64", true)
6232 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006233 .Case("mips64r3", true)
6234 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006235 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006236 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006237 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006238 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006239 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00006240 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006241 if (CPU == "octeon")
6242 Features["mips64r2"] = Features["cnmips"] = true;
6243 else
6244 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00006245 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006246
Craig Topper3164f332014-03-11 03:39:26 +00006247 void getTargetDefines(const LangOptions &Opts,
6248 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006249 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006250 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006251 if (Opts.GNUMode)
6252 Builder.defineMacro("mips");
6253
Simon Atanasyan683535b2012-08-29 19:14:58 +00006254 Builder.defineMacro("__REGISTER_PREFIX__", "");
6255
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006256 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006257 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006258 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006259 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006260 case SoftFloat:
6261 Builder.defineMacro("__mips_soft_float", Twine(1));
6262 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006263 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006264
Simon Atanasyan16071912013-04-14 14:07:30 +00006265 if (IsSingleFloat)
6266 Builder.defineMacro("__mips_single_float", Twine(1));
6267
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006268 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6269 Builder.defineMacro("_MIPS_FPSET",
6270 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6271
Simon Atanasyan72244b62012-07-05 16:06:06 +00006272 if (IsMips16)
6273 Builder.defineMacro("__mips16", Twine(1));
6274
Simon Atanasyan60777612013-04-14 14:07:51 +00006275 if (IsMicromips)
6276 Builder.defineMacro("__mips_micromips", Twine(1));
6277
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006278 if (IsNan2008)
6279 Builder.defineMacro("__mips_nan2008", Twine(1));
6280
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006281 switch (DspRev) {
6282 default:
6283 break;
6284 case DSP1:
6285 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6286 Builder.defineMacro("__mips_dsp", Twine(1));
6287 break;
6288 case DSP2:
6289 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6290 Builder.defineMacro("__mips_dspr2", Twine(1));
6291 Builder.defineMacro("__mips_dsp", Twine(1));
6292 break;
6293 }
6294
Jack Carter44ff1e52013-08-12 17:20:29 +00006295 if (HasMSA)
6296 Builder.defineMacro("__mips_msa", Twine(1));
6297
Simon Atanasyan26f19672012-04-05 19:28:31 +00006298 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6299 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6300 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006301
6302 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6303 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006304 }
6305
Craig Topper3164f332014-03-11 03:39:26 +00006306 void getTargetBuiltins(const Builtin::Info *&Records,
6307 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006308 Records = BuiltinInfo;
6309 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006310 }
Craig Topper3164f332014-03-11 03:39:26 +00006311 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006312 return llvm::StringSwitch<bool>(Feature)
6313 .Case("mips", true)
6314 .Case("fp64", HasFP64)
6315 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006316 }
Craig Topper3164f332014-03-11 03:39:26 +00006317 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006318 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006319 }
Craig Topper3164f332014-03-11 03:39:26 +00006320 void getGCCRegNames(const char * const *&Names,
6321 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006322 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006323 // CPU register names
6324 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006325 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6326 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6327 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006328 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6329 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006330 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6331 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6332 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6333 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006334 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006335 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006336 "$fcc5","$fcc6","$fcc7",
6337 // MSA register names
6338 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6339 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6340 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6341 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6342 // MSA control register names
6343 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6344 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006345 };
6346 Names = GCCRegNames;
6347 NumNames = llvm::array_lengthof(GCCRegNames);
6348 }
Craig Topper3164f332014-03-11 03:39:26 +00006349 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6350 unsigned &NumAliases) const override = 0;
6351 bool validateAsmConstraint(const char *&Name,
6352 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006353 switch (*Name) {
6354 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006355 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006356 case 'r': // CPU registers.
6357 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006358 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006359 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006360 case 'c': // $25 for indirect jumps
6361 case 'l': // lo register
6362 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006363 Info.setAllowsRegister();
6364 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006365 case 'I': // Signed 16-bit constant
6366 case 'J': // Integer 0
6367 case 'K': // Unsigned 16-bit constant
6368 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6369 case 'M': // Constants not loadable via lui, addiu, or ori
6370 case 'N': // Constant -1 to -65535
6371 case 'O': // A signed 15-bit constant
6372 case 'P': // A constant between 1 go 65535
6373 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006374 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006375 Info.setAllowsMemory();
6376 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006377 case 'Z':
6378 if (Name[1] == 'C') { // An address usable by ll, and sc.
6379 Info.setAllowsMemory();
6380 Name++; // Skip over 'Z'.
6381 return true;
6382 }
6383 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006384 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006385 }
6386
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006387 std::string convertConstraint(const char *&Constraint) const override {
6388 std::string R;
6389 switch (*Constraint) {
6390 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6391 if (Constraint[1] == 'C') {
6392 R = std::string("^") + std::string(Constraint, 2);
6393 Constraint++;
6394 return R;
6395 }
6396 break;
6397 }
6398 return TargetInfo::convertConstraint(Constraint);
6399 }
6400
Craig Topper3164f332014-03-11 03:39:26 +00006401 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006402 // In GCC, $1 is not widely used in generated code (it's used only in a few
6403 // specific situations), so there is no real need for users to add it to
6404 // the clobbers list if they want to use it in their inline assembly code.
6405 //
6406 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6407 // code generation, so using it in inline assembly without adding it to the
6408 // clobbers list can cause conflicts between the inline assembly code and
6409 // the surrounding generated code.
6410 //
6411 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6412 // operands, which will conflict with the ".set at" assembler option (which
6413 // we use only for inline assembly, in order to maintain compatibility with
6414 // GCC) and will also conflict with the user's usage of $1.
6415 //
6416 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6417 // register for generated code is to automatically clobber $1 for all inline
6418 // assembly code.
6419 //
6420 // FIXME: We should automatically clobber $1 only for inline assembly code
6421 // which actually uses it. This would allow LLVM to use $1 for inline
6422 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006423 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006424 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006425
Craig Topper3164f332014-03-11 03:39:26 +00006426 bool handleTargetFeatures(std::vector<std::string> &Features,
6427 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006428 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006429 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006430 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006431 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006432 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006433 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006434 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006435
6436 for (std::vector<std::string>::iterator it = Features.begin(),
6437 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006438 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006439 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006440 else if (*it == "+soft-float")
6441 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006442 else if (*it == "+mips16")
6443 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00006444 else if (*it == "+micromips")
6445 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006446 else if (*it == "+dsp")
6447 DspRev = std::max(DspRev, DSP1);
6448 else if (*it == "+dspr2")
6449 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00006450 else if (*it == "+msa")
6451 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006452 else if (*it == "+fp64")
6453 HasFP64 = true;
6454 else if (*it == "-fp64")
6455 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006456 else if (*it == "+nan2008")
6457 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006458 else if (*it == "-nan2008")
6459 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006460 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006461
Eric Christopher964a5f32015-08-05 23:48:05 +00006462 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006463
Rafael Espindolaeb265472013-08-21 21:59:03 +00006464 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006465 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006466
Craig Topper3164f332014-03-11 03:39:26 +00006467 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006468 if (RegNo == 0) return 4;
6469 if (RegNo == 1) return 5;
6470 return -1;
6471 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006472
6473 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006474};
6475
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006476const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
6477#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6478#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6479 ALL_LANGUAGES },
6480#include "clang/Basic/BuiltinsMips.def"
6481};
6482
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006483class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006484public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006485 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006486 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006487 SizeType = UnsignedInt;
6488 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006489 Int64Type = SignedLongLong;
6490 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006491 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006492 }
Craig Topper3164f332014-03-11 03:39:26 +00006493 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006494 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006495 ABI = Name;
6496 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006497 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006498 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006499 }
Craig Topper3164f332014-03-11 03:39:26 +00006500 void getTargetDefines(const LangOptions &Opts,
6501 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006502 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006503
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006504 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006505 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6506
6507 const std::string& CPUStr = getCPU();
6508 if (CPUStr == "mips32")
6509 Builder.defineMacro("__mips_isa_rev", "1");
6510 else if (CPUStr == "mips32r2")
6511 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006512 else if (CPUStr == "mips32r3")
6513 Builder.defineMacro("__mips_isa_rev", "3");
6514 else if (CPUStr == "mips32r5")
6515 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006516 else if (CPUStr == "mips32r6")
6517 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006518
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006519 if (ABI == "o32") {
6520 Builder.defineMacro("__mips_o32");
6521 Builder.defineMacro("_ABIO32", "1");
6522 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6523 }
6524 else if (ABI == "eabi")
6525 Builder.defineMacro("__mips_eabi");
6526 else
David Blaikie83d382b2011-09-23 05:06:16 +00006527 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006528 }
Craig Topper3164f332014-03-11 03:39:26 +00006529 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6530 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006531 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6532 { { "at" }, "$1" },
6533 { { "v0" }, "$2" },
6534 { { "v1" }, "$3" },
6535 { { "a0" }, "$4" },
6536 { { "a1" }, "$5" },
6537 { { "a2" }, "$6" },
6538 { { "a3" }, "$7" },
6539 { { "t0" }, "$8" },
6540 { { "t1" }, "$9" },
6541 { { "t2" }, "$10" },
6542 { { "t3" }, "$11" },
6543 { { "t4" }, "$12" },
6544 { { "t5" }, "$13" },
6545 { { "t6" }, "$14" },
6546 { { "t7" }, "$15" },
6547 { { "s0" }, "$16" },
6548 { { "s1" }, "$17" },
6549 { { "s2" }, "$18" },
6550 { { "s3" }, "$19" },
6551 { { "s4" }, "$20" },
6552 { { "s5" }, "$21" },
6553 { { "s6" }, "$22" },
6554 { { "s7" }, "$23" },
6555 { { "t8" }, "$24" },
6556 { { "t9" }, "$25" },
6557 { { "k0" }, "$26" },
6558 { { "k1" }, "$27" },
6559 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006560 { { "sp","$sp" }, "$29" },
6561 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006562 { { "ra" }, "$31" }
6563 };
6564 Aliases = GCCRegAliases;
6565 NumAliases = llvm::array_lengthof(GCCRegAliases);
6566 }
6567};
6568
6569class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006570 void setDataLayoutString() override {
6571 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006572 }
6573
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006574public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006575 Mips32EBTargetInfo(const llvm::Triple &Triple)
6576 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006577 }
Craig Topper3164f332014-03-11 03:39:26 +00006578 void getTargetDefines(const LangOptions &Opts,
6579 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006580 DefineStd(Builder, "MIPSEB", Opts);
6581 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006582 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006583 }
6584};
6585
6586class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006587 void setDataLayoutString() override {
6588 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006589 }
6590
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006591public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006592 Mips32ELTargetInfo(const llvm::Triple &Triple)
6593 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006594 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006595 }
Craig Topper3164f332014-03-11 03:39:26 +00006596 void getTargetDefines(const LangOptions &Opts,
6597 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006598 DefineStd(Builder, "MIPSEL", Opts);
6599 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006600 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006601 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006602};
Akira Hatanakabef17452011-09-20 19:21:49 +00006603
6604class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006605public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006606 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006607 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006608 LongDoubleWidth = LongDoubleAlign = 128;
6609 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006610 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6611 LongDoubleWidth = LongDoubleAlign = 64;
6612 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6613 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006614 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006615 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006616 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006617 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006618
6619 void setN64ABITypes() {
6620 LongWidth = LongAlign = 64;
6621 PointerWidth = PointerAlign = 64;
6622 SizeType = UnsignedLong;
6623 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006624 Int64Type = SignedLong;
6625 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006626 }
6627
6628 void setN32ABITypes() {
6629 LongWidth = LongAlign = 32;
6630 PointerWidth = PointerAlign = 32;
6631 SizeType = UnsignedInt;
6632 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006633 Int64Type = SignedLongLong;
6634 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006635 }
6636
Craig Topper3164f332014-03-11 03:39:26 +00006637 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006638 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006639 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006640 ABI = Name;
6641 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006642 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006643 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006644 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006645 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006646 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006647 }
6648 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006649 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006650
Craig Topper3164f332014-03-11 03:39:26 +00006651 void getTargetDefines(const LangOptions &Opts,
6652 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006653 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006654
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006655 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006656 Builder.defineMacro("__mips64");
6657 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006658 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6659
6660 const std::string& CPUStr = getCPU();
6661 if (CPUStr == "mips64")
6662 Builder.defineMacro("__mips_isa_rev", "1");
6663 else if (CPUStr == "mips64r2")
6664 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006665 else if (CPUStr == "mips64r3")
6666 Builder.defineMacro("__mips_isa_rev", "3");
6667 else if (CPUStr == "mips64r5")
6668 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006669 else if (CPUStr == "mips64r6")
6670 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006671
Akira Hatanakabef17452011-09-20 19:21:49 +00006672 if (ABI == "n32") {
6673 Builder.defineMacro("__mips_n32");
6674 Builder.defineMacro("_ABIN32", "2");
6675 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6676 }
6677 else if (ABI == "n64") {
6678 Builder.defineMacro("__mips_n64");
6679 Builder.defineMacro("_ABI64", "3");
6680 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6681 }
6682 else
David Blaikie83d382b2011-09-23 05:06:16 +00006683 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006684 }
Craig Topper3164f332014-03-11 03:39:26 +00006685 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6686 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006687 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6688 { { "at" }, "$1" },
6689 { { "v0" }, "$2" },
6690 { { "v1" }, "$3" },
6691 { { "a0" }, "$4" },
6692 { { "a1" }, "$5" },
6693 { { "a2" }, "$6" },
6694 { { "a3" }, "$7" },
6695 { { "a4" }, "$8" },
6696 { { "a5" }, "$9" },
6697 { { "a6" }, "$10" },
6698 { { "a7" }, "$11" },
6699 { { "t0" }, "$12" },
6700 { { "t1" }, "$13" },
6701 { { "t2" }, "$14" },
6702 { { "t3" }, "$15" },
6703 { { "s0" }, "$16" },
6704 { { "s1" }, "$17" },
6705 { { "s2" }, "$18" },
6706 { { "s3" }, "$19" },
6707 { { "s4" }, "$20" },
6708 { { "s5" }, "$21" },
6709 { { "s6" }, "$22" },
6710 { { "s7" }, "$23" },
6711 { { "t8" }, "$24" },
6712 { { "t9" }, "$25" },
6713 { { "k0" }, "$26" },
6714 { { "k1" }, "$27" },
6715 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006716 { { "sp","$sp" }, "$29" },
6717 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006718 { { "ra" }, "$31" }
6719 };
6720 Aliases = GCCRegAliases;
6721 NumAliases = llvm::array_lengthof(GCCRegAliases);
6722 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006723
6724 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006725};
6726
6727class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006728 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006729 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006730 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 +00006731 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006732 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006733
Akira Hatanakabef17452011-09-20 19:21:49 +00006734 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006735
Akira Hatanakabef17452011-09-20 19:21:49 +00006736public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006737 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006738 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006739 void getTargetDefines(const LangOptions &Opts,
6740 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006741 DefineStd(Builder, "MIPSEB", Opts);
6742 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006743 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006744 }
6745};
6746
6747class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006748 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006749 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00006750 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 +00006751 else
Eric Christopher964a5f32015-08-05 23:48:05 +00006752 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006753 }
6754public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006755 Mips64ELTargetInfo(const llvm::Triple &Triple)
6756 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006757 // Default ABI is n64.
6758 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006759 }
Craig Topper3164f332014-03-11 03:39:26 +00006760 void getTargetDefines(const LangOptions &Opts,
6761 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006762 DefineStd(Builder, "MIPSEL", Opts);
6763 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006764 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006765 }
6766};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006767
Ivan Krasindd7403e2011-08-24 20:22:22 +00006768class PNaClTargetInfo : public TargetInfo {
6769public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006770 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006771 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006772 this->UserLabelPrefix = "";
6773 this->LongAlign = 32;
6774 this->LongWidth = 32;
6775 this->PointerAlign = 32;
6776 this->PointerWidth = 32;
6777 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006778 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006779 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006780 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006781 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006782 this->SizeType = TargetInfo::UnsignedInt;
6783 this->PtrDiffType = TargetInfo::SignedInt;
6784 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006785 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006786 }
6787
Craig Topper3164f332014-03-11 03:39:26 +00006788 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006789 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006790 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006791 Builder.defineMacro("__le32__");
6792 Builder.defineMacro("__pnacl__");
6793 }
Craig Topper3164f332014-03-11 03:39:26 +00006794 void getTargetDefines(const LangOptions &Opts,
6795 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006796 getArchDefines(Opts, Builder);
6797 }
Craig Topper3164f332014-03-11 03:39:26 +00006798 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006799 return Feature == "pnacl";
6800 }
Craig Topper3164f332014-03-11 03:39:26 +00006801 void getTargetBuiltins(const Builtin::Info *&Records,
6802 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006803 }
Craig Topper3164f332014-03-11 03:39:26 +00006804 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006805 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006806 }
Craig Topper3164f332014-03-11 03:39:26 +00006807 void getGCCRegNames(const char * const *&Names,
6808 unsigned &NumNames) const override;
6809 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6810 unsigned &NumAliases) const override;
6811 bool validateAsmConstraint(const char *&Name,
6812 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006813 return false;
6814 }
6815
Craig Topper3164f332014-03-11 03:39:26 +00006816 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006817 return "";
6818 }
6819};
6820
6821void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6822 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006823 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006824 NumNames = 0;
6825}
6826
6827void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6828 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006829 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006830 NumAliases = 0;
6831}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006832
Petar Jovanovic26a4a402015-07-08 13:07:31 +00006833// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
6834class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
6835public:
6836 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
6837 Mips32ELTargetInfo(Triple) {
6838 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 0;
6839 }
6840
6841 BuiltinVaListKind getBuiltinVaListKind() const override {
6842 return TargetInfo::PNaClABIBuiltinVaList;
6843 }
6844};
6845
JF Bastien643817d2014-09-12 17:52:47 +00006846class Le64TargetInfo : public TargetInfo {
6847 static const Builtin::Info BuiltinInfo[];
6848
6849public:
6850 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6851 BigEndian = false;
6852 NoAsmVariants = true;
6853 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6854 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006855 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006856 }
6857
6858 void getTargetDefines(const LangOptions &Opts,
6859 MacroBuilder &Builder) const override {
6860 DefineStd(Builder, "unix", Opts);
6861 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6862 Builder.defineMacro("__ELF__");
6863 }
6864 void getTargetBuiltins(const Builtin::Info *&Records,
6865 unsigned &NumRecords) const override {
6866 Records = BuiltinInfo;
6867 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6868 }
6869 BuiltinVaListKind getBuiltinVaListKind() const override {
6870 return TargetInfo::PNaClABIBuiltinVaList;
6871 }
6872 const char *getClobbers() const override { return ""; }
6873 void getGCCRegNames(const char *const *&Names,
6874 unsigned &NumNames) const override {
6875 Names = nullptr;
6876 NumNames = 0;
6877 }
6878 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6879 unsigned &NumAliases) const override {
6880 Aliases = nullptr;
6881 NumAliases = 0;
6882 }
6883 bool validateAsmConstraint(const char *&Name,
6884 TargetInfo::ConstraintInfo &Info) const override {
6885 return false;
6886 }
6887
6888 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006889};
6890} // end anonymous namespace.
6891
6892const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6893#define BUILTIN(ID, TYPE, ATTRS) \
6894 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6895#include "clang/Basic/BuiltinsLe64.def"
6896};
6897
6898namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006899 static const unsigned SPIRAddrSpaceMap[] = {
6900 1, // opencl_global
6901 3, // opencl_local
6902 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006903 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006904 0, // cuda_device
6905 0, // cuda_constant
6906 0 // cuda_shared
6907 };
6908 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006909 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006910 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006911 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6912 "SPIR target must use unknown OS");
6913 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6914 "SPIR target must use unknown environment type");
6915 BigEndian = false;
6916 TLSSupported = false;
6917 LongWidth = LongAlign = 64;
6918 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006919 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006920 // Define available target features
6921 // These must be defined in sorted order!
6922 NoAsmVariants = true;
6923 }
Craig Topper3164f332014-03-11 03:39:26 +00006924 void getTargetDefines(const LangOptions &Opts,
6925 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006926 DefineStd(Builder, "SPIR", Opts);
6927 }
Craig Topper3164f332014-03-11 03:39:26 +00006928 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006929 return Feature == "spir";
6930 }
Craig Topper3164f332014-03-11 03:39:26 +00006931
6932 void getTargetBuiltins(const Builtin::Info *&Records,
6933 unsigned &NumRecords) const override {}
6934 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006935 return "";
6936 }
Craig Topper3164f332014-03-11 03:39:26 +00006937 void getGCCRegNames(const char * const *&Names,
6938 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006939 bool
6940 validateAsmConstraint(const char *&Name,
6941 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006942 return true;
6943 }
Craig Topper3164f332014-03-11 03:39:26 +00006944 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6945 unsigned &NumAliases) const override {}
6946 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006947 return TargetInfo::VoidPtrBuiltinVaList;
6948 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006949
6950 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6951 return (CC == CC_SpirFunction ||
6952 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6953 }
6954
6955 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6956 return CC_SpirFunction;
6957 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006958 };
6959
6960
6961 class SPIR32TargetInfo : public SPIRTargetInfo {
6962 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006963 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006964 PointerWidth = PointerAlign = 32;
6965 SizeType = TargetInfo::UnsignedInt;
6966 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +00006967 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6968 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006969 }
Craig Topper3164f332014-03-11 03:39:26 +00006970 void getTargetDefines(const LangOptions &Opts,
6971 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006972 DefineStd(Builder, "SPIR32", Opts);
6973 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006974 };
6975
6976 class SPIR64TargetInfo : public SPIRTargetInfo {
6977 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006978 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006979 PointerWidth = PointerAlign = 64;
6980 SizeType = TargetInfo::UnsignedLong;
6981 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00006982 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6983 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006984 }
Craig Topper3164f332014-03-11 03:39:26 +00006985 void getTargetDefines(const LangOptions &Opts,
6986 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006987 DefineStd(Builder, "SPIR64", Opts);
6988 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006989 };
Guy Benyeib798fc92012-12-11 21:38:14 +00006990
Robert Lytton0e076492013-08-13 09:43:10 +00006991class XCoreTargetInfo : public TargetInfo {
6992 static const Builtin::Info BuiltinInfo[];
6993public:
6994 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6995 BigEndian = false;
6996 NoAsmVariants = true;
6997 LongLongAlign = 32;
6998 SuitableAlign = 32;
6999 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007000 SizeType = UnsignedInt;
7001 PtrDiffType = SignedInt;
7002 IntPtrType = SignedInt;
7003 WCharType = UnsignedChar;
7004 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007005 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007006 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7007 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007008 }
Craig Topper3164f332014-03-11 03:39:26 +00007009 void getTargetDefines(const LangOptions &Opts,
7010 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007011 Builder.defineMacro("__XS1B__");
7012 }
Craig Topper3164f332014-03-11 03:39:26 +00007013 void getTargetBuiltins(const Builtin::Info *&Records,
7014 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007015 Records = BuiltinInfo;
7016 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
7017 }
Craig Topper3164f332014-03-11 03:39:26 +00007018 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007019 return TargetInfo::VoidPtrBuiltinVaList;
7020 }
Craig Topper3164f332014-03-11 03:39:26 +00007021 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007022 return "";
7023 }
Craig Topper3164f332014-03-11 03:39:26 +00007024 void getGCCRegNames(const char * const *&Names,
7025 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007026 static const char * const GCCRegNames[] = {
7027 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7028 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7029 };
7030 Names = GCCRegNames;
7031 NumNames = llvm::array_lengthof(GCCRegNames);
7032 }
Craig Topper3164f332014-03-11 03:39:26 +00007033 void getGCCRegAliases(const GCCRegAlias *&Aliases,
7034 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00007035 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00007036 NumAliases = 0;
7037 }
Craig Topper3164f332014-03-11 03:39:26 +00007038 bool validateAsmConstraint(const char *&Name,
7039 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007040 return false;
7041 }
Craig Topper3164f332014-03-11 03:39:26 +00007042 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007043 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7044 return (RegNo < 2)? RegNo : -1;
7045 }
Robert Lytton0e076492013-08-13 09:43:10 +00007046};
7047
7048const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
7049#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
7050#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
7051 ALL_LANGUAGES },
7052#include "clang/Basic/BuiltinsXCore.def"
7053};
7054} // end anonymous namespace.
7055
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007056namespace {
7057// x86_32 Android target
7058class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7059public:
7060 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7061 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7062 SuitableAlign = 32;
7063 LongDoubleWidth = 64;
7064 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7065 }
7066};
7067} // end anonymous namespace
7068
7069namespace {
7070// x86_64 Android target
7071class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7072public:
7073 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7074 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7075 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7076 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007077
7078 bool useFloat128ManglingForLongDouble() const override {
7079 return true;
7080 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007081};
7082} // end anonymous namespace
7083
Ivan Krasindd7403e2011-08-24 20:22:22 +00007084
Chris Lattner5ba61f02006-10-14 07:39:34 +00007085//===----------------------------------------------------------------------===//
7086// Driver code
7087//===----------------------------------------------------------------------===//
7088
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007089static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007090 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007091
Daniel Dunbar52322032009-08-18 05:47:58 +00007092 switch (Triple.getArch()) {
7093 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007094 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007095
Tim Northover2a0783d2014-05-30 14:14:07 +00007096 case llvm::Triple::xcore:
7097 return new XCoreTargetInfo(Triple);
7098
7099 case llvm::Triple::hexagon:
7100 return new HexagonTargetInfo(Triple);
7101
7102 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007103 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007104 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007105
7106 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007107 case llvm::Triple::FreeBSD:
7108 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007109 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007110 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007111 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007112 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007113 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007114 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007115 }
7116
Christian Pirker9b019ae2014-02-25 13:51:00 +00007117 case llvm::Triple::aarch64_be:
7118 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007119 case llvm::Triple::FreeBSD:
7120 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007121 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007122 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007123 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007124 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007125 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007126 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007127 }
7128
Daniel Dunbar52322032009-08-18 05:47:58 +00007129 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007130 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007131 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007132 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007133
Daniel Dunbar52322032009-08-18 05:47:58 +00007134 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007135 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007136 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007137 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007138 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007139 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007140 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007141 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007142 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007143 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007144 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007145 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007146 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007147 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007148 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007149 case llvm::Triple::Win32:
7150 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007151 case llvm::Triple::Cygnus:
7152 return new CygwinARMTargetInfo(Triple);
7153 case llvm::Triple::GNU:
7154 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007155 case llvm::Triple::Itanium:
7156 return new ItaniumWindowsARMleTargetInfo(Triple);
7157 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007158 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007159 return new MicrosoftARMleTargetInfo(Triple);
7160 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007161 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007162 return new ARMleTargetInfo(Triple);
7163 }
7164
7165 case llvm::Triple::armeb:
7166 case llvm::Triple::thumbeb:
7167 if (Triple.isOSDarwin())
7168 return new DarwinARMTargetInfo(Triple);
7169
7170 switch (os) {
7171 case llvm::Triple::Linux:
7172 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7173 case llvm::Triple::FreeBSD:
7174 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7175 case llvm::Triple::NetBSD:
7176 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7177 case llvm::Triple::OpenBSD:
7178 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7179 case llvm::Triple::Bitrig:
7180 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7181 case llvm::Triple::RTEMS:
7182 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7183 case llvm::Triple::NaCl:
7184 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7185 default:
7186 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007187 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007188
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007189 case llvm::Triple::bpfeb:
7190 case llvm::Triple::bpfel:
7191 return new BPFTargetInfo(Triple);
7192
Daniel Dunbar52322032009-08-18 05:47:58 +00007193 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007194 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007195
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007196 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007197 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007198 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007199 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007200 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007201 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007202 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007203 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007204 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007205 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007206 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007207 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007208 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007209
7210 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007211 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007212 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007213 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007214 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007215 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007216 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007217 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007218 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007219 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007220 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007221 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007222 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007223 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007224 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007225
Akira Hatanakabef17452011-09-20 19:21:49 +00007226 case llvm::Triple::mips64:
7227 switch (os) {
7228 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007229 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007230 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007231 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007232 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007233 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007234 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007235 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007236 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007237 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007238 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007239 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007240 }
7241
7242 case llvm::Triple::mips64el:
7243 switch (os) {
7244 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007245 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007246 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007247 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007248 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007249 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007250 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007251 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007252 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007253 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007254 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007255 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007256 }
7257
Ivan Krasindd7403e2011-08-24 20:22:22 +00007258 case llvm::Triple::le32:
7259 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007260 case llvm::Triple::NaCl:
7261 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7262 default:
7263 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007264 }
7265
JF Bastien643817d2014-09-12 17:52:47 +00007266 case llvm::Triple::le64:
7267 return new Le64TargetInfo(Triple);
7268
Daniel Dunbar52322032009-08-18 05:47:58 +00007269 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007270 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007271 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007272 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007273 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007274 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007275 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007276 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007277 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007278 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007279 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007280 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007281 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007282 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007283 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007284 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007285 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007286
7287 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007288 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007289 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007290 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007291 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007292 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007293 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007294 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007295 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007296 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007297 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007298 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007299 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007300 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007301 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007302
Bill Schmidt778d3872013-07-26 01:36:11 +00007303 case llvm::Triple::ppc64le:
7304 switch (os) {
7305 case llvm::Triple::Linux:
7306 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007307 case llvm::Triple::NetBSD:
7308 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007309 default:
7310 return new PPC64TargetInfo(Triple);
7311 }
7312
Peter Collingbournec947aae2012-05-20 23:28:41 +00007313 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007314 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007315 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007316 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007317
Tom Stellardd8e38a32015-01-06 20:34:47 +00007318 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007319 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007320 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007321
Daniel Dunbar52322032009-08-18 05:47:58 +00007322 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007323 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007324 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007325 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007326 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007327 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007328 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007329 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007330 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007331 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007332 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007333 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007334 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007335 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007336 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007337
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007338 // The 'sparcel' architecture copies all the above cases except for Solaris.
7339 case llvm::Triple::sparcel:
7340 switch (os) {
7341 case llvm::Triple::Linux:
7342 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7343 case llvm::Triple::NetBSD:
7344 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7345 case llvm::Triple::OpenBSD:
7346 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7347 case llvm::Triple::RTEMS:
7348 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7349 default:
7350 return new SparcV8elTargetInfo(Triple);
7351 }
7352
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007353 case llvm::Triple::sparcv9:
7354 switch (os) {
7355 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007356 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007357 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007358 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007359 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007360 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007361 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007362 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007363 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007364 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007365 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007366 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007367 }
7368
Ulrich Weigand47445072013-05-06 16:26:41 +00007369 case llvm::Triple::systemz:
7370 switch (os) {
7371 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007372 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007373 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007374 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007375 }
7376
Eli Friedmana9c3d712009-08-19 20:47:07 +00007377 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007378 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007379
Daniel Dunbar52322032009-08-18 05:47:58 +00007380 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007381 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007382 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007383
Daniel Dunbar52322032009-08-18 05:47:58 +00007384 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007385 case llvm::Triple::CloudABI:
7386 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007387 case llvm::Triple::Linux: {
7388 switch (Triple.getEnvironment()) {
7389 default:
7390 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7391 case llvm::Triple::Android:
7392 return new AndroidX86_32TargetInfo(Triple);
7393 }
7394 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007395 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007396 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007397 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007398 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007399 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007400 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007401 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007402 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007403 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007404 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007405 case llvm::Triple::KFreeBSD:
7406 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007407 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007408 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007409 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007410 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007411 case llvm::Triple::Win32: {
7412 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007413 case llvm::Triple::Cygnus:
7414 return new CygwinX86_32TargetInfo(Triple);
7415 case llvm::Triple::GNU:
7416 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007417 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007418 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007419 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007420 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007421 }
7422 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007423 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007424 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007425 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007426 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007427 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007428 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007429 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007430 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007431 }
7432
7433 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007434 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007435 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007436
Daniel Dunbar52322032009-08-18 05:47:58 +00007437 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007438 case llvm::Triple::CloudABI:
7439 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007440 case llvm::Triple::Linux: {
7441 switch (Triple.getEnvironment()) {
7442 default:
7443 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7444 case llvm::Triple::Android:
7445 return new AndroidX86_64TargetInfo(Triple);
7446 }
7447 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007448 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007449 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007450 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007451 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007452 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007453 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007454 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007455 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007456 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007457 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007458 case llvm::Triple::KFreeBSD:
7459 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007460 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007461 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007462 case llvm::Triple::Win32: {
7463 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007464 case llvm::Triple::Cygnus:
7465 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007466 case llvm::Triple::GNU:
7467 return new MinGWX86_64TargetInfo(Triple);
7468 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007469 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007470 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007471 }
7472 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007473 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007474 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007475 case llvm::Triple::PS4:
7476 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007477 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007478 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007479 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007480
Douglas Katzman78d7c542015-05-12 21:18:10 +00007481 case llvm::Triple::spir: {
7482 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7483 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7484 return nullptr;
7485 return new SPIR32TargetInfo(Triple);
7486 }
7487 case llvm::Triple::spir64: {
7488 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7489 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7490 return nullptr;
7491 return new SPIR64TargetInfo(Triple);
7492 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007493 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007494}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007495
7496/// CreateTargetInfo - Return the target info object for the specified target
7497/// triple.
Alp Toker80758082014-07-06 05:26:44 +00007498TargetInfo *
7499TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7500 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007501 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007502
7503 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007504 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007505 if (!Target) {
7506 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007507 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007508 }
Alp Toker80758082014-07-06 05:26:44 +00007509 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007510
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007511 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007512 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7513 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007514 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007515 }
7516
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007517 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007518 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7519 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007520 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007521 }
7522
Rafael Espindolaeb265472013-08-21 21:59:03 +00007523 // Set the fp math unit.
7524 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7525 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007526 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007527 }
7528
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007529 // Compute the default target features, we need the target to handle this
7530 // because features may have dependencies on one another.
7531 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00007532 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007533
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007534 // Apply the user specified deltas.
7535 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
7536 I < N; ++I) {
7537 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00007538 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007539 bool Enabled = Name[0] == '+';
7540 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007541 }
7542
7543 // Add the features to the compile options.
7544 //
7545 // FIXME: If we are completely confident that we have the right set, we only
7546 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007547 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007548 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
7549 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00007550 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00007551 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007552 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007553
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007554 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007555}