blob: f70d588ec0cef5d8cbcfe73ce1e91272d59db71c [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;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000563 this->DescriptionString = "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
583 this->UserLabelPrefix = "";
584
585 switch (Triple.getArch()) {
586 default:
587 case llvm::Triple::x86_64:
588 this->MCountName = ".mcount";
589 break;
590 }
591 }
592};
593
Torok Edwinb2b37c62009-06-30 17:10:35 +0000594// Solaris target
595template<typename Target>
596class SolarisTargetInfo : public OSTargetInfo<Target> {
597protected:
Craig Topper3164f332014-03-11 03:39:26 +0000598 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
599 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000600 DefineStd(Builder, "sun", Opts);
601 DefineStd(Builder, "unix", Opts);
602 Builder.defineMacro("__ELF__");
603 Builder.defineMacro("__svr4__");
604 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000605 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
606 // newer, but to 500 for everything else. feature_test.h has a check to
607 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000608 // with a new version.
609 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000610 Builder.defineMacro("_XOPEN_SOURCE", "600");
611 else
612 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000613 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000614 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000615 Builder.defineMacro("_LARGEFILE_SOURCE");
616 Builder.defineMacro("_LARGEFILE64_SOURCE");
617 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000618 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000619 }
620public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000621 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000622 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000623 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000624 // FIXME: WIntType should be SignedLong
625 }
626};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000627
628// Windows target
629template<typename Target>
630class WindowsTargetInfo : public OSTargetInfo<Target> {
631protected:
Craig Topper3164f332014-03-11 03:39:26 +0000632 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
633 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000634 Builder.defineMacro("_WIN32");
635 }
636 void getVisualStudioDefines(const LangOptions &Opts,
637 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000638 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000639 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000640 Builder.defineMacro("_CPPRTTI");
641
Reid Kleckner16514352015-01-30 21:42:55 +0000642 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000643 Builder.defineMacro("_CPPUNWIND");
644 }
645
646 if (!Opts.CharIsSigned)
647 Builder.defineMacro("_CHAR_UNSIGNED");
648
649 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
650 // but it works for now.
651 if (Opts.POSIXThreads)
652 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000653
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000654 if (Opts.MSCompatibilityVersion) {
655 Builder.defineMacro("_MSC_VER",
656 Twine(Opts.MSCompatibilityVersion / 100000));
657 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000658 // FIXME We cannot encode the revision information into 32-bits
659 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000660
David Majnemerb710a932015-05-11 03:57:49 +0000661 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000662 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000663 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000664
665 if (Opts.MicrosoftExt) {
666 Builder.defineMacro("_MSC_EXTENSIONS");
667
668 if (Opts.CPlusPlus11) {
669 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
670 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
671 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
672 }
673 }
674
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000675 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000676 }
677
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000678public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000679 WindowsTargetInfo(const llvm::Triple &Triple)
680 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000681};
682
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000683template <typename Target>
684class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000685protected:
Craig Topper3164f332014-03-11 03:39:26 +0000686 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
687 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000688 if (Opts.POSIXThreads)
689 Builder.defineMacro("_REENTRANT");
690 if (Opts.CPlusPlus)
691 Builder.defineMacro("_GNU_SOURCE");
692
693 DefineStd(Builder, "unix", Opts);
694 Builder.defineMacro("__ELF__");
695 Builder.defineMacro("__native_client__");
696 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000697
698public:
699 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000700 this->UserLabelPrefix = "";
701 this->LongAlign = 32;
702 this->LongWidth = 32;
703 this->PointerAlign = 32;
704 this->PointerWidth = 32;
705 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000706 this->Int64Type = TargetInfo::SignedLongLong;
707 this->DoubleAlign = 64;
708 this->LongDoubleWidth = 64;
709 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000710 this->LongLongWidth = 64;
711 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000712 this->SizeType = TargetInfo::UnsignedInt;
713 this->PtrDiffType = TargetInfo::SignedInt;
714 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000715 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000716 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000717 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000718 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000719 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000720 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000721 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000722 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000723 } else if (Triple.getArch() == llvm::Triple::mipsel) {
724 // Handled on mips' setDescriptionString.
725 } else {
726 assert(Triple.getArch() == llvm::Triple::le32);
727 this->DescriptionString = "e-p:32:32-i64:64";
728 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000729 }
730};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000731
Chris Lattner09d98f52008-10-05 21:50:58 +0000732//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000733// Specific target implementations.
734//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000735
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000736// PPC abstract base class
737class PPCTargetInfo : public TargetInfo {
738 static const Builtin::Info BuiltinInfo[];
739 static const char * const GCCRegNames[];
740 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000741 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000742
743 // Target cpu features.
744 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000745 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000746 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000747 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000748 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000749 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000750 bool HasBPERMD;
751 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000752
Ulrich Weigand8afad612014-07-28 13:17:52 +0000753protected:
754 std::string ABI;
755
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000756public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000757 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000758 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000759 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000760 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000761 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000762 LongDoubleWidth = LongDoubleAlign = 128;
763 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
764 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000765
Hal Finkel6b984f02012-07-03 16:51:04 +0000766 /// \brief Flags for architecture specific defines.
767 typedef enum {
768 ArchDefineNone = 0,
769 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
770 ArchDefinePpcgr = 1 << 1,
771 ArchDefinePpcsq = 1 << 2,
772 ArchDefine440 = 1 << 3,
773 ArchDefine603 = 1 << 4,
774 ArchDefine604 = 1 << 5,
775 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000776 ArchDefinePwr5 = 1 << 7,
777 ArchDefinePwr5x = 1 << 8,
778 ArchDefinePwr6 = 1 << 9,
779 ArchDefinePwr6x = 1 << 10,
780 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000781 ArchDefinePwr8 = 1 << 12,
782 ArchDefineA2 = 1 << 13,
783 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000784 } ArchDefineTypes;
785
Bill Schmidt38378a02013-02-01 20:23:10 +0000786 // Note: GCC recognizes the following additional cpus:
787 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
788 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
789 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000790 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000791 bool CPUKnown = llvm::StringSwitch<bool>(Name)
792 .Case("generic", true)
793 .Case("440", true)
794 .Case("450", true)
795 .Case("601", true)
796 .Case("602", true)
797 .Case("603", true)
798 .Case("603e", true)
799 .Case("603ev", true)
800 .Case("604", true)
801 .Case("604e", true)
802 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000803 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000804 .Case("g3", true)
805 .Case("7400", true)
806 .Case("g4", true)
807 .Case("7450", true)
808 .Case("g4+", true)
809 .Case("750", true)
810 .Case("970", true)
811 .Case("g5", true)
812 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000813 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000814 .Case("e500mc", true)
815 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000816 .Case("power3", true)
817 .Case("pwr3", true)
818 .Case("power4", true)
819 .Case("pwr4", true)
820 .Case("power5", true)
821 .Case("pwr5", true)
822 .Case("power5x", true)
823 .Case("pwr5x", true)
824 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000825 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000826 .Case("power6x", true)
827 .Case("pwr6x", true)
828 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000829 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000830 .Case("power8", true)
831 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000832 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000833 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000834 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000835 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000836 .Case("powerpc64le", true)
837 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000838 .Default(false);
839
840 if (CPUKnown)
841 CPU = Name;
842
843 return CPUKnown;
844 }
845
Ulrich Weigand8afad612014-07-28 13:17:52 +0000846
847 StringRef getABI() const override { return ABI; }
848
Craig Topper3164f332014-03-11 03:39:26 +0000849 void getTargetBuiltins(const Builtin::Info *&Records,
850 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000851 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000852 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000853 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000854
Craig Topper3164f332014-03-11 03:39:26 +0000855 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000856
Craig Topper3164f332014-03-11 03:39:26 +0000857 void getTargetDefines(const LangOptions &Opts,
858 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000859
Craig Topper3164f332014-03-11 03:39:26 +0000860 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000861
Craig Topper3164f332014-03-11 03:39:26 +0000862 bool handleTargetFeatures(std::vector<std::string> &Features,
863 DiagnosticsEngine &Diags) override;
864 bool hasFeature(StringRef Feature) const override;
865
866 void getGCCRegNames(const char * const *&Names,
867 unsigned &NumNames) const override;
868 void getGCCRegAliases(const GCCRegAlias *&Aliases,
869 unsigned &NumAliases) const override;
870 bool validateAsmConstraint(const char *&Name,
871 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000872 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000873 default: return false;
874 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000875 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000876 case 'b': // Base register
877 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000878 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000879 break;
880 // FIXME: The following are added to allow parsing.
881 // I just took a guess at what the actions should be.
882 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000883 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000884 case 'v': // Altivec vector register
885 Info.setAllowsRegister();
886 break;
887 case 'w':
888 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000889 case 'd':// VSX vector register to hold vector double data
890 case 'f':// VSX vector register to hold vector float data
891 case 's':// VSX vector register to hold scalar float data
892 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000893 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000894 break;
895 default:
896 return false;
897 }
898 Info.setAllowsRegister();
899 Name++; // Skip over 'w'.
900 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000901 case 'h': // `MQ', `CTR', or `LINK' register
902 case 'q': // `MQ' register
903 case 'c': // `CTR' register
904 case 'l': // `LINK' register
905 case 'x': // `CR' register (condition register) number 0
906 case 'y': // `CR' register (condition register)
907 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000908 Info.setAllowsRegister();
909 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000910 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000911 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000912 // (use `L' instead for SImode constants)
913 case 'K': // Unsigned 16-bit constant
914 case 'L': // Signed 16-bit constant shifted left 16 bits
915 case 'M': // Constant larger than 31
916 case 'N': // Exact power of 2
917 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000918 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000919 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000920 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000921 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000922 break;
923 case 'm': // Memory operand. Note that on PowerPC targets, m can
924 // include addresses that update the base register. It
925 // is therefore only safe to use `m' in an asm statement
926 // if that asm statement accesses the operand exactly once.
927 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000928 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000929 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000930 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000931 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000932 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
933 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000934 // register to be updated.
935 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000936 if (Name[1] != 's')
937 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000938 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000939 // include any automodification of the base register. Unlike
940 // `m', this constraint can be used in asm statements that
941 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000942 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000943 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000944 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000945 break;
946 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000947 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000948 case 'Z': // Memory operand that is an indexed or indirect from a
949 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000950 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000951 Info.setAllowsMemory();
952 Info.setAllowsRegister();
953 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000954 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000955 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000956 // register (`p' is preferable for asm statements)
957 case 'S': // Constant suitable as a 64-bit mask operand
958 case 'T': // Constant suitable as a 32-bit mask operand
959 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000960 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000961 // instructions
962 case 'W': // Vector constant that does not require memory
963 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000964 break;
965 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000966 }
John Thompson07a61a42010-06-24 22:44:13 +0000967 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000968 }
Craig Topper3164f332014-03-11 03:39:26 +0000969 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000970 std::string R;
971 switch (*Constraint) {
972 case 'e':
973 case 'w':
974 // Two-character constraint; add "^" hint for later parsing.
975 R = std::string("^") + std::string(Constraint, 2);
976 Constraint++;
977 break;
978 default:
979 return TargetInfo::convertConstraint(Constraint);
980 }
981 return R;
982 }
Craig Topper3164f332014-03-11 03:39:26 +0000983 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000984 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000985 }
Craig Topper3164f332014-03-11 03:39:26 +0000986 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000987 if (RegNo == 0) return 3;
988 if (RegNo == 1) return 4;
989 return -1;
990 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +0000991
992 bool hasSjLjLowering() const override {
993 return true;
994 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000995};
Anders Carlssonf511f642007-11-27 04:11:28 +0000996
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000997const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000998#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000999#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001000 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001001#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001002};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001003
Eric Christopher917e9522014-11-18 22:36:15 +00001004/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001005/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001006bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001007 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001008 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
1009 // Ignore disabled features.
1010 if (Features[i][0] == '-')
1011 continue;
1012
1013 StringRef Feature = StringRef(Features[i]).substr(1);
1014
1015 if (Feature == "vsx") {
1016 HasVSX = true;
1017 continue;
1018 }
1019
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001020 if (Feature == "bpermd") {
1021 HasBPERMD = true;
1022 continue;
1023 }
1024
1025 if (Feature == "extdiv") {
1026 HasExtDiv = true;
1027 continue;
1028 }
1029
Bill Schmidt59eb7672014-10-10 15:09:43 +00001030 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001031 HasP8Vector = true;
Bill Schmidt41e14c42015-05-16 01:02:25 +00001032 HasVSX = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +00001033 continue;
1034 }
1035
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001036 if (Feature == "crypto") {
1037 HasP8Crypto = true;
1038 continue;
1039 }
1040
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001041 if (Feature == "direct-move") {
1042 HasDirectMove = true;
Bill Schmidt41e14c42015-05-16 01:02:25 +00001043 HasVSX = true;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001044 continue;
1045 }
1046
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001047 if (Feature == "qpx") {
1048 HasQPX = true;
1049 continue;
1050 }
1051
Kit Barton8246f282015-03-25 19:41:41 +00001052 if (Feature == "htm") {
1053 HasHTM = true;
1054 continue;
1055 }
1056
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001057 // TODO: Finish this list and add an assert that we've handled them
1058 // all.
1059 }
1060
1061 return true;
1062}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001063
Chris Lattnerecd49032009-03-02 22:27:17 +00001064/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1065/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001066void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001067 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001068 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001069 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001070 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001071 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001072 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001073 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001074 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001075 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001076 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001077 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001078 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001079 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001080
Chris Lattnerecd49032009-03-02 22:27:17 +00001081 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001082 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1083 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001084 } else {
1085 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1086 getTriple().getOS() != llvm::Triple::OpenBSD)
1087 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001088 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001089
Ulrich Weigand8afad612014-07-28 13:17:52 +00001090 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001091 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001092 Builder.defineMacro("_CALL_ELF", "1");
1093 if (ABI == "elfv2")
1094 Builder.defineMacro("_CALL_ELF", "2");
1095
Chris Lattnerecd49032009-03-02 22:27:17 +00001096 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001097 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1098 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001099
Chris Lattnerecd49032009-03-02 22:27:17 +00001100 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001101 if (LongDoubleWidth == 128)
1102 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001103
John Thompsone467e192009-11-19 17:18:50 +00001104 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001105 Builder.defineMacro("__VEC__", "10206");
1106 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001107 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001108
1109 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001110 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1111 .Case("440", ArchDefineName)
1112 .Case("450", ArchDefineName | ArchDefine440)
1113 .Case("601", ArchDefineName)
1114 .Case("602", ArchDefineName | ArchDefinePpcgr)
1115 .Case("603", ArchDefineName | ArchDefinePpcgr)
1116 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1117 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1118 .Case("604", ArchDefineName | ArchDefinePpcgr)
1119 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1120 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001121 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001122 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1123 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1124 .Case("750", ArchDefineName | ArchDefinePpcgr)
1125 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1126 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001127 .Case("a2", ArchDefineA2)
1128 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001129 .Case("pwr3", ArchDefinePpcgr)
1130 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1131 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1132 | ArchDefinePpcsq)
1133 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1134 | ArchDefinePpcgr | ArchDefinePpcsq)
1135 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1136 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1137 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1138 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1139 | ArchDefinePpcsq)
1140 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1141 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001142 | ArchDefinePpcgr | ArchDefinePpcsq)
1143 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1144 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1145 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001146 .Case("power3", ArchDefinePpcgr)
1147 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1148 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1149 | ArchDefinePpcsq)
1150 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1151 | ArchDefinePpcgr | ArchDefinePpcsq)
1152 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1153 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1154 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1155 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1156 | ArchDefinePpcsq)
1157 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1158 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001159 | ArchDefinePpcgr | ArchDefinePpcsq)
1160 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1161 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1162 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001163 .Default(ArchDefineNone);
1164
1165 if (defs & ArchDefineName)
1166 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1167 if (defs & ArchDefinePpcgr)
1168 Builder.defineMacro("_ARCH_PPCGR");
1169 if (defs & ArchDefinePpcsq)
1170 Builder.defineMacro("_ARCH_PPCSQ");
1171 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001172 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001173 if (defs & ArchDefine603)
1174 Builder.defineMacro("_ARCH_603");
1175 if (defs & ArchDefine604)
1176 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001177 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001178 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001179 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001180 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001181 if (defs & ArchDefinePwr5x)
1182 Builder.defineMacro("_ARCH_PWR5X");
1183 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001184 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001185 if (defs & ArchDefinePwr6x)
1186 Builder.defineMacro("_ARCH_PWR6X");
1187 if (defs & ArchDefinePwr7)
1188 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001189 if (defs & ArchDefinePwr8)
1190 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001191 if (defs & ArchDefineA2)
1192 Builder.defineMacro("_ARCH_A2");
1193 if (defs & ArchDefineA2q) {
1194 Builder.defineMacro("_ARCH_A2Q");
1195 Builder.defineMacro("_ARCH_QP");
1196 }
1197
1198 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1199 Builder.defineMacro("__bg__");
1200 Builder.defineMacro("__THW_BLUEGENE__");
1201 Builder.defineMacro("__bgq__");
1202 Builder.defineMacro("__TOS_BGQ__");
1203 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001204
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001205 if (HasVSX)
1206 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001207 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001208 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001209 if (HasP8Crypto)
1210 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001211 if (HasHTM)
1212 Builder.defineMacro("__HTM__");
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001213 if (getTriple().getArch() == llvm::Triple::ppc64le ||
Nemanja Ivanovice97e1112015-05-14 20:02:24 +00001214 (defs & ArchDefinePwr8) || (CPU == "pwr8")) {
Nemanja Ivanovic531a6562015-05-08 13:07:48 +00001215 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1216 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1217 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1218 if (PointerWidth == 64)
1219 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1220 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001221
Bill Schmidt38378a02013-02-01 20:23:10 +00001222 // FIXME: The following are not yet generated here by Clang, but are
1223 // generated by GCC:
1224 //
1225 // _SOFT_FLOAT_
1226 // __RECIP_PRECISION__
1227 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001228 // __RECIP__
1229 // __RECIPF__
1230 // __RSQRTE__
1231 // __RSQRTEF__
1232 // _SOFT_DOUBLE_
1233 // __NO_LWSYNC__
1234 // __HAVE_BSWAP__
1235 // __LONGDOUBLE128
1236 // __CMODEL_MEDIUM__
1237 // __CMODEL_LARGE__
1238 // _CALL_SYSV
1239 // _CALL_DARWIN
1240 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001241}
1242
1243void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1244 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1245 .Case("7400", true)
1246 .Case("g4", true)
1247 .Case("7450", true)
1248 .Case("g4+", true)
1249 .Case("970", true)
1250 .Case("g5", true)
1251 .Case("pwr6", true)
1252 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001253 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001254 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001255 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001256 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001257
1258 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001259 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1260 .Case("ppc64le", true)
1261 .Case("pwr8", true)
1262 .Default(false);
1263 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1264 .Case("ppc64le", true)
1265 .Case("pwr8", true)
1266 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001267 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1268 .Case("ppc64le", true)
1269 .Case("pwr8", true)
1270 .Case("pwr7", true)
1271 .Default(false);
1272 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1273 .Case("ppc64le", true)
1274 .Case("pwr8", true)
1275 .Case("pwr7", true)
1276 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001277 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1278 .Case("ppc64le", true)
1279 .Case("pwr8", true)
1280 .Default(false);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001281}
1282
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001283bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001284 return llvm::StringSwitch<bool>(Feature)
1285 .Case("powerpc", true)
1286 .Case("vsx", HasVSX)
1287 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001288 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001289 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001290 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001291 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001292 .Case("bpermd", HasBPERMD)
1293 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001294 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001295}
Chris Lattner17df24e2008-04-21 18:56:49 +00001296
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001297const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001298 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1299 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1300 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1301 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1302 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1303 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1304 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1305 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001306 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001307 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001308 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001309 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1310 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1311 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1312 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001313 "vrsave", "vscr",
1314 "spe_acc", "spefscr",
1315 "sfp"
1316};
Chris Lattner10a5b382007-01-29 05:24:35 +00001317
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001318void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001319 unsigned &NumNames) const {
1320 Names = GCCRegNames;
1321 NumNames = llvm::array_lengthof(GCCRegNames);
1322}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001323
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001324const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1325 // While some of these aliases do map to different registers
1326 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001327 { { "0" }, "r0" },
1328 { { "1"}, "r1" },
1329 { { "2" }, "r2" },
1330 { { "3" }, "r3" },
1331 { { "4" }, "r4" },
1332 { { "5" }, "r5" },
1333 { { "6" }, "r6" },
1334 { { "7" }, "r7" },
1335 { { "8" }, "r8" },
1336 { { "9" }, "r9" },
1337 { { "10" }, "r10" },
1338 { { "11" }, "r11" },
1339 { { "12" }, "r12" },
1340 { { "13" }, "r13" },
1341 { { "14" }, "r14" },
1342 { { "15" }, "r15" },
1343 { { "16" }, "r16" },
1344 { { "17" }, "r17" },
1345 { { "18" }, "r18" },
1346 { { "19" }, "r19" },
1347 { { "20" }, "r20" },
1348 { { "21" }, "r21" },
1349 { { "22" }, "r22" },
1350 { { "23" }, "r23" },
1351 { { "24" }, "r24" },
1352 { { "25" }, "r25" },
1353 { { "26" }, "r26" },
1354 { { "27" }, "r27" },
1355 { { "28" }, "r28" },
1356 { { "29" }, "r29" },
1357 { { "30" }, "r30" },
1358 { { "31" }, "r31" },
1359 { { "fr0" }, "f0" },
1360 { { "fr1" }, "f1" },
1361 { { "fr2" }, "f2" },
1362 { { "fr3" }, "f3" },
1363 { { "fr4" }, "f4" },
1364 { { "fr5" }, "f5" },
1365 { { "fr6" }, "f6" },
1366 { { "fr7" }, "f7" },
1367 { { "fr8" }, "f8" },
1368 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001369 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001370 { { "fr11" }, "f11" },
1371 { { "fr12" }, "f12" },
1372 { { "fr13" }, "f13" },
1373 { { "fr14" }, "f14" },
1374 { { "fr15" }, "f15" },
1375 { { "fr16" }, "f16" },
1376 { { "fr17" }, "f17" },
1377 { { "fr18" }, "f18" },
1378 { { "fr19" }, "f19" },
1379 { { "fr20" }, "f20" },
1380 { { "fr21" }, "f21" },
1381 { { "fr22" }, "f22" },
1382 { { "fr23" }, "f23" },
1383 { { "fr24" }, "f24" },
1384 { { "fr25" }, "f25" },
1385 { { "fr26" }, "f26" },
1386 { { "fr27" }, "f27" },
1387 { { "fr28" }, "f28" },
1388 { { "fr29" }, "f29" },
1389 { { "fr30" }, "f30" },
1390 { { "fr31" }, "f31" },
1391 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001392};
1393
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001394void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001395 unsigned &NumAliases) const {
1396 Aliases = GCCRegAliases;
1397 NumAliases = llvm::array_lengthof(GCCRegAliases);
1398}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001399
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001400class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001401public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001402 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001403 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001404
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001405 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001406 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001407 case llvm::Triple::FreeBSD:
1408 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001409 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001410 PtrDiffType = SignedInt;
1411 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001412 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001413 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001414 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001415 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001416
Roman Divacky3ffe7462012-03-13 19:20:17 +00001417 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1418 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001419 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001420 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001421
1422 // PPC32 supports atomics up to 4 bytes.
1423 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001424 }
1425
Craig Topper3164f332014-03-11 03:39:26 +00001426 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001427 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001428 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001429 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001430};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001431
Bill Schmidt778d3872013-07-26 01:36:11 +00001432// Note: ABI differences may eventually require us to have a separate
1433// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001434class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001435public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001436 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001437 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001438 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001439 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001440
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001441 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1442 DescriptionString = "e-m:e-i64:64-n32:64";
1443 ABI = "elfv2";
1444 } else {
1445 DescriptionString = "E-m:e-i64:64-n32:64";
1446 ABI = "elfv1";
1447 }
1448
1449 switch (getTriple().getOS()) {
1450 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001451 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001452 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001453 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001454 case llvm::Triple::NetBSD:
1455 IntMaxType = SignedLongLong;
1456 Int64Type = SignedLongLong;
1457 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001458 default:
1459 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001460 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001461
1462 // PPC64 supports atomics up to 8 bytes.
1463 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001464 }
Craig Topper3164f332014-03-11 03:39:26 +00001465 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001466 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001467 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001468 // PPC64 Linux-specifc ABI options.
1469 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001470 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001471 ABI = Name;
1472 return true;
1473 }
1474 return false;
1475 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001476};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001477
Roman Divacky965b0b72011-01-06 08:27:10 +00001478class DarwinPPC32TargetInfo :
1479 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001480public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001481 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1482 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001483 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001484 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001485 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001486 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001487 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001488 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001489 }
Craig Topper3164f332014-03-11 03:39:26 +00001490 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001491 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001492 }
1493};
1494
1495class DarwinPPC64TargetInfo :
1496 public DarwinTargetInfo<PPC64TargetInfo> {
1497public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001498 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1499 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001500 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001501 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001502 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001503 }
1504};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001505
Peter Collingbournec947aae2012-05-20 23:28:41 +00001506 static const unsigned NVPTXAddrSpaceMap[] = {
1507 1, // opencl_global
1508 3, // opencl_local
1509 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001510 // FIXME: generic has to be added to the target
1511 0, // opencl_generic
Peter Collingbournec947aae2012-05-20 23:28:41 +00001512 1, // cuda_device
1513 4, // cuda_constant
1514 3, // cuda_shared
1515 };
1516 class NVPTXTargetInfo : public TargetInfo {
1517 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001518 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001519
1520 // The GPU profiles supported by the NVPTX backend
1521 enum GPUKind {
1522 GK_NONE,
1523 GK_SM20,
1524 GK_SM21,
1525 GK_SM30,
1526 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001527 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001528 } GPU;
1529
Peter Collingbournec947aae2012-05-20 23:28:41 +00001530 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001531 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001532 BigEndian = false;
1533 TLSSupported = false;
1534 LongWidth = LongAlign = 64;
1535 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001536 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001537 // Define available target features
1538 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001539 NoAsmVariants = true;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001540 // Set the default GPU to sm20
1541 GPU = GK_SM20;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001542 }
Craig Topper3164f332014-03-11 03:39:26 +00001543 void getTargetDefines(const LangOptions &Opts,
1544 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001545 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001546 Builder.defineMacro("__NVPTX__");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001547 if (Opts.CUDAIsDevice) {
1548 // Set __CUDA_ARCH__ for the GPU specified.
1549 std::string CUDAArchCode;
1550 switch (GPU) {
1551 case GK_SM20:
1552 CUDAArchCode = "200";
1553 break;
1554 case GK_SM21:
1555 CUDAArchCode = "210";
1556 break;
1557 case GK_SM30:
1558 CUDAArchCode = "300";
1559 break;
1560 case GK_SM35:
1561 CUDAArchCode = "350";
1562 break;
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001563 case GK_SM37:
1564 CUDAArchCode = "370";
1565 break;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001566 default:
1567 llvm_unreachable("Unhandled target CPU");
1568 }
1569 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1570 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001571 }
Craig Topper3164f332014-03-11 03:39:26 +00001572 void getTargetBuiltins(const Builtin::Info *&Records,
1573 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001574 Records = BuiltinInfo;
1575 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001576 }
Craig Topper3164f332014-03-11 03:39:26 +00001577 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001578 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001579 }
Craig Topper3164f332014-03-11 03:39:26 +00001580
1581 void getGCCRegNames(const char * const *&Names,
1582 unsigned &NumNames) const override;
1583 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1584 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001585 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001586 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001587 NumAliases = 0;
1588 }
Eric Christopher917e9522014-11-18 22:36:15 +00001589 bool
1590 validateAsmConstraint(const char *&Name,
1591 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001592 switch (*Name) {
1593 default: return false;
1594 case 'c':
1595 case 'h':
1596 case 'r':
1597 case 'l':
1598 case 'f':
1599 case 'd':
1600 Info.setAllowsRegister();
1601 return true;
1602 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001603 }
Craig Topper3164f332014-03-11 03:39:26 +00001604 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001605 // FIXME: Is this really right?
1606 return "";
1607 }
Craig Topper3164f332014-03-11 03:39:26 +00001608 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001609 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001610 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001611 }
Craig Topper3164f332014-03-11 03:39:26 +00001612 bool setCPU(const std::string &Name) override {
Reid Klecknerbbc01782014-12-03 21:53:36 +00001613 GPU = llvm::StringSwitch<GPUKind>(Name)
1614 .Case("sm_20", GK_SM20)
1615 .Case("sm_21", GK_SM21)
1616 .Case("sm_30", GK_SM30)
1617 .Case("sm_35", GK_SM35)
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001618 .Case("sm_37", GK_SM37)
Reid Klecknerbbc01782014-12-03 21:53:36 +00001619 .Default(GK_NONE);
Justin Holewinski91203e82013-03-30 14:38:26 +00001620
Reid Klecknerbbc01782014-12-03 21:53:36 +00001621 return GPU != GK_NONE;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001622 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001623 };
1624
1625 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1626#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1627#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1628 ALL_LANGUAGES },
1629#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001630 };
1631
1632 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1633 "r0"
1634 };
1635
1636 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1637 unsigned &NumNames) const {
1638 Names = GCCRegNames;
1639 NumNames = llvm::array_lengthof(GCCRegNames);
1640 }
1641
1642 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1643 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001644 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001645 PointerWidth = PointerAlign = 32;
Eli Bendersky13467172015-04-01 20:29:18 +00001646 SizeType = TargetInfo::UnsignedInt;
1647 PtrDiffType = TargetInfo::SignedInt;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001648 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001649 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001650 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001651 };
1652
1653 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1654 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001655 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001656 PointerWidth = PointerAlign = 64;
Eli Bendersky13467172015-04-01 20:29:18 +00001657 SizeType = TargetInfo::UnsignedLong;
1658 PtrDiffType = TargetInfo::SignedLong;
Eli Bendersky15f63422015-04-01 18:29:27 +00001659 IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001660 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Eli Bendersky13467172015-04-01 20:29:18 +00001661 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001662 };
Eli Friedmand13b41e2012-10-12 23:32:00 +00001663
1664static const unsigned R600AddrSpaceMap[] = {
1665 1, // opencl_global
1666 3, // opencl_local
1667 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001668 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001669 1, // cuda_device
1670 2, // cuda_constant
1671 3 // cuda_shared
1672};
1673
Tom Stellarda96344b2014-08-21 13:58:40 +00001674// If you edit the description strings, make sure you update
1675// getPointerWidthV().
1676
Tom Stellardc74b1e02013-03-04 17:40:53 +00001677static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001678 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1679 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001680
1681static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001682 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1683 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001684
1685static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001686 "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 +00001687 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1688 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001689
Eli Friedmand13b41e2012-10-12 23:32:00 +00001690class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001691 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001692 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001693
Tom Stellardc74b1e02013-03-04 17:40:53 +00001694 /// \brief The GPU profiles supported by the R600 target.
1695 enum GPUKind {
1696 GK_NONE,
1697 GK_R600,
1698 GK_R600_DOUBLE_OPS,
1699 GK_R700,
1700 GK_R700_DOUBLE_OPS,
1701 GK_EVERGREEN,
1702 GK_EVERGREEN_DOUBLE_OPS,
1703 GK_NORTHERN_ISLANDS,
1704 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001705 GK_SOUTHERN_ISLANDS,
1706 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001707 } GPU;
1708
Jan Veselyeebeaea2015-05-04 19:53:36 +00001709 bool hasFP64:1;
1710 bool hasFMAF:1;
1711 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001712
Eli Friedmand13b41e2012-10-12 23:32:00 +00001713public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001714 R600TargetInfo(const llvm::Triple &Triple)
Tom Stellardd99fb952015-01-28 15:38:44 +00001715 : TargetInfo(Triple) {
1716
1717 if (Triple.getArch() == llvm::Triple::amdgcn) {
1718 DescriptionString = DescriptionStringSI;
1719 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001720 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001721 hasFMAF = true;
1722 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001723 } else {
1724 DescriptionString = DescriptionStringR600;
1725 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001726 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001727 hasFMAF = false;
1728 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001729 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001730 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001731 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001732 }
1733
Tom Stellarda96344b2014-08-21 13:58:40 +00001734 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1735 if (GPU <= GK_CAYMAN)
1736 return 32;
1737
1738 switch(AddrSpace) {
1739 default:
1740 return 64;
1741 case 0:
1742 case 3:
1743 case 5:
1744 return 32;
1745 }
1746 }
1747
Craig Topper3164f332014-03-11 03:39:26 +00001748 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001749 return "";
1750 }
1751
Craig Topper3164f332014-03-11 03:39:26 +00001752 void getGCCRegNames(const char * const *&Names,
Tom Stellard7b1059b2015-04-14 14:36:56 +00001753 unsigned &NumNames) const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001754
Craig Topper3164f332014-03-11 03:39:26 +00001755 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1756 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001757 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001758 NumAliases = 0;
1759 }
1760
Craig Topper3164f332014-03-11 03:39:26 +00001761 bool validateAsmConstraint(const char *&Name,
1762 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001763 return true;
1764 }
1765
Craig Topper3164f332014-03-11 03:39:26 +00001766 void getTargetBuiltins(const Builtin::Info *&Records,
1767 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001768 Records = BuiltinInfo;
1769 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001770 }
1771
Craig Topper3164f332014-03-11 03:39:26 +00001772 void getTargetDefines(const LangOptions &Opts,
1773 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001774 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001775 if (hasFMAF)
1776 Builder.defineMacro("__HAS_FMAF__");
1777 if (hasLDEXPF)
1778 Builder.defineMacro("__HAS_LDEXPF__");
Jan Veselya3abd6d2015-05-01 17:38:13 +00001779 if (hasFP64 && Opts.OpenCL) {
Tom Stellardfded50f2015-02-27 15:10:19 +00001780 Builder.defineMacro("cl_khr_fp64");
Jan Veselya3abd6d2015-05-01 17:38:13 +00001781 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001782 }
1783
Craig Topper3164f332014-03-11 03:39:26 +00001784 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001785 return TargetInfo::CharPtrBuiltinVaList;
1786 }
1787
Craig Topper3164f332014-03-11 03:39:26 +00001788 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001789 GPU = llvm::StringSwitch<GPUKind>(Name)
1790 .Case("r600" , GK_R600)
1791 .Case("rv610", GK_R600)
1792 .Case("rv620", GK_R600)
1793 .Case("rv630", GK_R600)
1794 .Case("rv635", GK_R600)
1795 .Case("rs780", GK_R600)
1796 .Case("rs880", GK_R600)
1797 .Case("rv670", GK_R600_DOUBLE_OPS)
1798 .Case("rv710", GK_R700)
1799 .Case("rv730", GK_R700)
1800 .Case("rv740", GK_R700_DOUBLE_OPS)
1801 .Case("rv770", GK_R700_DOUBLE_OPS)
1802 .Case("palm", GK_EVERGREEN)
1803 .Case("cedar", GK_EVERGREEN)
1804 .Case("sumo", GK_EVERGREEN)
1805 .Case("sumo2", GK_EVERGREEN)
1806 .Case("redwood", GK_EVERGREEN)
1807 .Case("juniper", GK_EVERGREEN)
1808 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1809 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1810 .Case("barts", GK_NORTHERN_ISLANDS)
1811 .Case("turks", GK_NORTHERN_ISLANDS)
1812 .Case("caicos", GK_NORTHERN_ISLANDS)
1813 .Case("cayman", GK_CAYMAN)
1814 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001815 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001816 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1817 .Case("verde", GK_SOUTHERN_ISLANDS)
1818 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001819 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001820 .Case("bonaire", GK_SEA_ISLANDS)
1821 .Case("kabini", GK_SEA_ISLANDS)
1822 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001823 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001824 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001825 .Default(GK_NONE);
1826
1827 if (GPU == GK_NONE) {
1828 return false;
1829 }
1830
1831 // Set the correct data layout
1832 switch (GPU) {
1833 case GK_NONE:
1834 case GK_R600:
1835 case GK_R700:
1836 case GK_EVERGREEN:
1837 case GK_NORTHERN_ISLANDS:
1838 DescriptionString = DescriptionStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001839 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001840 hasFMAF = false;
1841 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001842 break;
1843 case GK_R600_DOUBLE_OPS:
1844 case GK_R700_DOUBLE_OPS:
1845 case GK_EVERGREEN_DOUBLE_OPS:
1846 case GK_CAYMAN:
1847 DescriptionString = DescriptionStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001848 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001849 hasFMAF = true;
1850 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001851 break;
1852 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001853 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001854 DescriptionString = DescriptionStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001855 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001856 hasFMAF = true;
1857 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001858 break;
1859 }
1860
1861 return true;
1862 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001863};
1864
Matt Arsenault56f008d2014-06-24 20:45:01 +00001865const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1866#define BUILTIN(ID, TYPE, ATTRS) \
1867 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1868#include "clang/Basic/BuiltinsR600.def"
1869};
Tom Stellard7b1059b2015-04-14 14:36:56 +00001870const char * const R600TargetInfo::GCCRegNames[] = {
1871 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1872 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1873 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1874 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1875 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1876 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1877 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1878 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1879 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1880 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1881 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1882 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1883 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1884 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1885 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1886 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1887 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1888 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1889 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1890 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1891 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1892 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1893 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1894 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1895 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1896 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1897 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
1898 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
1899 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
1900 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
1901 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
1902 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
1903 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1904 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
1905 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
1906 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1907 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
1908 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
1909 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
1910 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
1911 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
1912 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
1913 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
1914 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
1915 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
1916 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
1917 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
1918 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
1919 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
1920 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
1921};
1922
1923void R600TargetInfo::getGCCRegNames(const char * const *&Names,
1924 unsigned &NumNames) const {
1925 Names = GCCRegNames;
1926 NumNames = llvm::array_lengthof(GCCRegNames);
1927}
Matt Arsenault56f008d2014-06-24 20:45:01 +00001928
Eli Friedman3fd920a2008-08-20 02:34:37 +00001929// Namespace for x86 abstract base class
1930const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001931#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001932#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001933 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001934#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001935};
Eli Friedmanb5366062008-05-20 14:21:01 +00001936
Nuno Lopescfca1f02009-12-23 17:49:57 +00001937static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001938 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1939 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001940 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001941 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1942 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1943 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001944 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001945 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1946 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001947};
1948
Eric Christophercdd36352011-06-21 00:05:20 +00001949const TargetInfo::AddlRegName AddlRegNames[] = {
1950 { { "al", "ah", "eax", "rax" }, 0 },
1951 { { "bl", "bh", "ebx", "rbx" }, 3 },
1952 { { "cl", "ch", "ecx", "rcx" }, 2 },
1953 { { "dl", "dh", "edx", "rdx" }, 1 },
1954 { { "esi", "rsi" }, 4 },
1955 { { "edi", "rdi" }, 5 },
1956 { { "esp", "rsp" }, 7 },
1957 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001958};
1959
1960// X86 target abstract base class; x86-32 and x86-64 are very close, so
1961// most of the implementation can be shared.
1962class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001963 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001964 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001965 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001966 enum MMX3DNowEnum {
1967 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1968 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001969 enum XOPEnum {
1970 NoXOP,
1971 SSE4A,
1972 FMA4,
1973 XOP
1974 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001975
Eric Christophere1ddaf92010-04-02 23:50:19 +00001976 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001977 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001978 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001979 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001980 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001981 bool HasBMI;
1982 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001983 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001984 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001985 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001986 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001987 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001988 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001989 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001990 bool HasF16C;
Eric Christopher917e9522014-11-18 22:36:15 +00001991 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1992 HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001993 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001994 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001995
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001996 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1997 ///
1998 /// Each enumeration represents a particular CPU supported by Clang. These
1999 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2000 enum CPUKind {
2001 CK_Generic,
2002
2003 /// \name i386
2004 /// i386-generation processors.
2005 //@{
2006 CK_i386,
2007 //@}
2008
2009 /// \name i486
2010 /// i486-generation processors.
2011 //@{
2012 CK_i486,
2013 CK_WinChipC6,
2014 CK_WinChip2,
2015 CK_C3,
2016 //@}
2017
2018 /// \name i586
2019 /// i586-generation processors, P5 microarchitecture based.
2020 //@{
2021 CK_i586,
2022 CK_Pentium,
2023 CK_PentiumMMX,
2024 //@}
2025
2026 /// \name i686
2027 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2028 //@{
2029 CK_i686,
2030 CK_PentiumPro,
2031 CK_Pentium2,
2032 CK_Pentium3,
2033 CK_Pentium3M,
2034 CK_PentiumM,
2035 CK_C3_2,
2036
2037 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2038 /// Clang however has some logic to suport this.
2039 // FIXME: Warn, deprecate, and potentially remove this.
2040 CK_Yonah,
2041 //@}
2042
2043 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002044 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002045 //@{
2046 CK_Pentium4,
2047 CK_Pentium4M,
2048 CK_Prescott,
2049 CK_Nocona,
2050 //@}
2051
2052 /// \name Core
2053 /// Core microarchitecture based processors.
2054 //@{
2055 CK_Core2,
2056
2057 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2058 /// codename which GCC no longer accepts as an option to -march, but Clang
2059 /// has some logic for recognizing it.
2060 // FIXME: Warn, deprecate, and potentially remove this.
2061 CK_Penryn,
2062 //@}
2063
2064 /// \name Atom
2065 /// Atom processors
2066 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002067 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002068 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002069 //@}
2070
2071 /// \name Nehalem
2072 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002073 CK_Nehalem,
2074
2075 /// \name Westmere
2076 /// Westmere microarchitecture based processors.
2077 CK_Westmere,
2078
2079 /// \name Sandy Bridge
2080 /// Sandy Bridge microarchitecture based processors.
2081 CK_SandyBridge,
2082
2083 /// \name Ivy Bridge
2084 /// Ivy Bridge microarchitecture based processors.
2085 CK_IvyBridge,
2086
2087 /// \name Haswell
2088 /// Haswell microarchitecture based processors.
2089 CK_Haswell,
2090
2091 /// \name Broadwell
2092 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002093 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002094
2095 /// \name Skylake
2096 /// Skylake microarchitecture based processors.
2097 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002098
Craig Topper449314e2013-08-20 07:09:39 +00002099 /// \name Knights Landing
2100 /// Knights Landing processor.
2101 CK_KNL,
2102
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002103 /// \name K6
2104 /// K6 architecture processors.
2105 //@{
2106 CK_K6,
2107 CK_K6_2,
2108 CK_K6_3,
2109 //@}
2110
2111 /// \name K7
2112 /// K7 architecture processors.
2113 //@{
2114 CK_Athlon,
2115 CK_AthlonThunderbird,
2116 CK_Athlon4,
2117 CK_AthlonXP,
2118 CK_AthlonMP,
2119 //@}
2120
2121 /// \name K8
2122 /// K8 architecture processors.
2123 //@{
2124 CK_Athlon64,
2125 CK_Athlon64SSE3,
2126 CK_AthlonFX,
2127 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002128 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002129 CK_Opteron,
2130 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002131 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002132 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002133
Benjamin Kramer569f2152012-01-10 11:50:18 +00002134 /// \name Bobcat
2135 /// Bobcat architecture processors.
2136 //@{
2137 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002138 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002139 //@}
2140
2141 /// \name Bulldozer
2142 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002143 //@{
2144 CK_BDVER1,
2145 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002146 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002147 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002148 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002149
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002150 /// This specification is deprecated and will be removed in the future.
2151 /// Users should prefer \see CK_K8.
2152 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002153 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002154 CK_x86_64,
2155 //@}
2156
2157 /// \name Geode
2158 /// Geode processors.
2159 //@{
2160 CK_Geode
2161 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00002162 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002163
Rafael Espindolaeb265472013-08-21 21:59:03 +00002164 enum FPMathKind {
2165 FP_Default,
2166 FP_SSE,
2167 FP_387
2168 } FPMath;
2169
Eli Friedman3fd920a2008-08-20 02:34:37 +00002170public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002171 X86TargetInfo(const llvm::Triple &Triple)
2172 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00002173 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00002174 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
2175 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
2176 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
2177 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
2178 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
2179 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00002180 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002181 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002182 }
Craig Topper3164f332014-03-11 03:39:26 +00002183 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002184 // X87 evaluates with 80 bits "long double" precision.
2185 return SSELevel == NoSSE ? 2 : 0;
2186 }
Craig Topper3164f332014-03-11 03:39:26 +00002187 void getTargetBuiltins(const Builtin::Info *&Records,
2188 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002189 Records = BuiltinInfo;
2190 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00002191 }
Craig Topper3164f332014-03-11 03:39:26 +00002192 void getGCCRegNames(const char * const *&Names,
2193 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002194 Names = GCCRegNames;
2195 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002196 }
Craig Topper3164f332014-03-11 03:39:26 +00002197 void getGCCRegAliases(const GCCRegAlias *&Aliases,
2198 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00002199 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00002200 NumAliases = 0;
2201 }
Craig Topper3164f332014-03-11 03:39:26 +00002202 void getGCCAddlRegNames(const AddlRegName *&Names,
2203 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00002204 Names = AddlRegNames;
2205 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002206 }
Craig Topper3164f332014-03-11 03:39:26 +00002207 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002208 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002209
Akira Hatanaka974131e2014-09-18 18:17:18 +00002210 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2211
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002212 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2213
Akira Hatanaka974131e2014-09-18 18:17:18 +00002214 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2215
Craig Topper3164f332014-03-11 03:39:26 +00002216 std::string convertConstraint(const char *&Constraint) const override;
2217 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002218 return "~{dirflag},~{fpsr},~{flags}";
2219 }
Craig Topper3164f332014-03-11 03:39:26 +00002220 void getTargetDefines(const LangOptions &Opts,
2221 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002222 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2223 bool Enabled);
2224 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2225 bool Enabled);
2226 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2227 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002228 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2229 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002230 setFeatureEnabledImpl(Features, Name, Enabled);
2231 }
2232 // This exists purely to cut down on the number of virtual calls in
2233 // getDefaultFeatures which calls this repeatedly.
2234 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2235 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002236 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2237 bool hasFeature(StringRef Feature) const override;
2238 bool handleTargetFeatures(std::vector<std::string> &Features,
2239 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002240 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00002241 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002242 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00002243 else if (getTriple().getArch() == llvm::Triple::x86 &&
2244 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002245 return "no-mmx";
2246 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002247 }
Craig Topper3164f332014-03-11 03:39:26 +00002248 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00002249 CPU = llvm::StringSwitch<CPUKind>(Name)
2250 .Case("i386", CK_i386)
2251 .Case("i486", CK_i486)
2252 .Case("winchip-c6", CK_WinChipC6)
2253 .Case("winchip2", CK_WinChip2)
2254 .Case("c3", CK_C3)
2255 .Case("i586", CK_i586)
2256 .Case("pentium", CK_Pentium)
2257 .Case("pentium-mmx", CK_PentiumMMX)
2258 .Case("i686", CK_i686)
2259 .Case("pentiumpro", CK_PentiumPro)
2260 .Case("pentium2", CK_Pentium2)
2261 .Case("pentium3", CK_Pentium3)
2262 .Case("pentium3m", CK_Pentium3M)
2263 .Case("pentium-m", CK_PentiumM)
2264 .Case("c3-2", CK_C3_2)
2265 .Case("yonah", CK_Yonah)
2266 .Case("pentium4", CK_Pentium4)
2267 .Case("pentium4m", CK_Pentium4M)
2268 .Case("prescott", CK_Prescott)
2269 .Case("nocona", CK_Nocona)
2270 .Case("core2", CK_Core2)
2271 .Case("penryn", CK_Penryn)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002272 .Case("bonnell", CK_Bonnell)
2273 .Case("atom", CK_Bonnell) // Legacy name.
2274 .Case("silvermont", CK_Silvermont)
2275 .Case("slm", CK_Silvermont) // Legacy name.
2276 .Case("nehalem", CK_Nehalem)
2277 .Case("corei7", CK_Nehalem) // Legacy name.
2278 .Case("westmere", CK_Westmere)
2279 .Case("sandybridge", CK_SandyBridge)
2280 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2281 .Case("ivybridge", CK_IvyBridge)
2282 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2283 .Case("haswell", CK_Haswell)
2284 .Case("core-avx2", CK_Haswell) // Legacy name.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002285 .Case("broadwell", CK_Broadwell)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002286 .Case("skylake", CK_Skylake)
2287 .Case("skx", CK_Skylake) // Legacy name.
Craig Topper449314e2013-08-20 07:09:39 +00002288 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00002289 .Case("k6", CK_K6)
2290 .Case("k6-2", CK_K6_2)
2291 .Case("k6-3", CK_K6_3)
2292 .Case("athlon", CK_Athlon)
2293 .Case("athlon-tbird", CK_AthlonThunderbird)
2294 .Case("athlon-4", CK_Athlon4)
2295 .Case("athlon-xp", CK_AthlonXP)
2296 .Case("athlon-mp", CK_AthlonMP)
2297 .Case("athlon64", CK_Athlon64)
2298 .Case("athlon64-sse3", CK_Athlon64SSE3)
2299 .Case("athlon-fx", CK_AthlonFX)
2300 .Case("k8", CK_K8)
2301 .Case("k8-sse3", CK_K8SSE3)
2302 .Case("opteron", CK_Opteron)
2303 .Case("opteron-sse3", CK_OpteronSSE3)
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002304 .Case("barcelona", CK_AMDFAM10)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002305 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002306 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002307 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002308 .Case("bdver1", CK_BDVER1)
2309 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002310 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002311 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002312 .Case("x86-64", CK_x86_64)
2313 .Case("geode", CK_Geode)
2314 .Default(CK_Generic);
2315
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002316 // Perform any per-CPU checks necessary to determine if this CPU is
2317 // acceptable.
2318 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2319 // invalid without explaining *why*.
2320 switch (CPU) {
2321 case CK_Generic:
2322 // No processor selected!
2323 return false;
2324
2325 case CK_i386:
2326 case CK_i486:
2327 case CK_WinChipC6:
2328 case CK_WinChip2:
2329 case CK_C3:
2330 case CK_i586:
2331 case CK_Pentium:
2332 case CK_PentiumMMX:
2333 case CK_i686:
2334 case CK_PentiumPro:
2335 case CK_Pentium2:
2336 case CK_Pentium3:
2337 case CK_Pentium3M:
2338 case CK_PentiumM:
2339 case CK_Yonah:
2340 case CK_C3_2:
2341 case CK_Pentium4:
2342 case CK_Pentium4M:
2343 case CK_Prescott:
2344 case CK_K6:
2345 case CK_K6_2:
2346 case CK_K6_3:
2347 case CK_Athlon:
2348 case CK_AthlonThunderbird:
2349 case CK_Athlon4:
2350 case CK_AthlonXP:
2351 case CK_AthlonMP:
2352 case CK_Geode:
2353 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002354 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002355 return false;
2356
2357 // Fallthrough
2358 case CK_Nocona:
2359 case CK_Core2:
2360 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002361 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002362 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002363 case CK_Nehalem:
2364 case CK_Westmere:
2365 case CK_SandyBridge:
2366 case CK_IvyBridge:
2367 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002368 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002369 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002370 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002371 case CK_Athlon64:
2372 case CK_Athlon64SSE3:
2373 case CK_AthlonFX:
2374 case CK_K8:
2375 case CK_K8SSE3:
2376 case CK_Opteron:
2377 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002378 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002379 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002380 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002381 case CK_BDVER1:
2382 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002383 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002384 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002385 case CK_x86_64:
2386 return true;
2387 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002388 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002389 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002390
Craig Topper3164f332014-03-11 03:39:26 +00002391 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002392
Craig Topper3164f332014-03-11 03:39:26 +00002393 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002394 // We accept all non-ARM calling conventions
2395 return (CC == CC_X86ThisCall ||
2396 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002397 CC == CC_X86StdCall ||
2398 CC == CC_X86VectorCall ||
2399 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002400 CC == CC_X86Pascal ||
2401 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002402 }
2403
Craig Topper3164f332014-03-11 03:39:26 +00002404 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002405 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002406 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002407
2408 bool hasSjLjLowering() const override {
2409 return true;
2410 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002411};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002412
Rafael Espindolaeb265472013-08-21 21:59:03 +00002413bool X86TargetInfo::setFPMath(StringRef Name) {
2414 if (Name == "387") {
2415 FPMath = FP_387;
2416 return true;
2417 }
2418 if (Name == "sse") {
2419 FPMath = FP_SSE;
2420 return true;
2421 }
2422 return false;
2423}
2424
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002425void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002426 // FIXME: This *really* should not be here.
2427
2428 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002429 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002430 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002431
Chandler Carruth212334f2011-09-28 08:55:37 +00002432 switch (CPU) {
2433 case CK_Generic:
2434 case CK_i386:
2435 case CK_i486:
2436 case CK_i586:
2437 case CK_Pentium:
2438 case CK_i686:
2439 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002440 break;
2441 case CK_PentiumMMX:
2442 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002443 case CK_K6:
2444 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002445 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002446 break;
2447 case CK_Pentium3:
2448 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002449 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002450 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002451 break;
2452 case CK_PentiumM:
2453 case CK_Pentium4:
2454 case CK_Pentium4M:
2455 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002456 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002457 break;
2458 case CK_Yonah:
2459 case CK_Prescott:
2460 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002461 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002462 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002463 break;
2464 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002465 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002466 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002467 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002468 break;
2469 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002470 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002471 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002472 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002473 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002474 setFeatureEnabledImpl(Features, "avx512f", true);
2475 setFeatureEnabledImpl(Features, "avx512cd", true);
2476 setFeatureEnabledImpl(Features, "avx512dq", true);
2477 setFeatureEnabledImpl(Features, "avx512bw", true);
2478 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002479 // FALLTHROUGH
2480 case CK_Broadwell:
2481 setFeatureEnabledImpl(Features, "rdseed", true);
2482 setFeatureEnabledImpl(Features, "adx", true);
2483 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002484 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002485 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002486 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002487 setFeatureEnabledImpl(Features, "bmi", true);
2488 setFeatureEnabledImpl(Features, "bmi2", true);
2489 setFeatureEnabledImpl(Features, "rtm", true);
2490 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002491 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002492 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002493 setFeatureEnabledImpl(Features, "rdrnd", true);
2494 setFeatureEnabledImpl(Features, "f16c", true);
2495 setFeatureEnabledImpl(Features, "fsgsbase", true);
2496 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002497 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002498 setFeatureEnabledImpl(Features, "avx", true);
2499 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002500 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002501 case CK_Silvermont:
2502 setFeatureEnabledImpl(Features, "aes", true);
2503 setFeatureEnabledImpl(Features, "pclmul", true);
2504 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002505 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002506 setFeatureEnabledImpl(Features, "sse4.2", true);
2507 setFeatureEnabledImpl(Features, "cx16", true);
2508 break;
2509 case CK_KNL:
2510 setFeatureEnabledImpl(Features, "avx512f", true);
2511 setFeatureEnabledImpl(Features, "avx512cd", true);
2512 setFeatureEnabledImpl(Features, "avx512er", true);
2513 setFeatureEnabledImpl(Features, "avx512pf", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002514 setFeatureEnabledImpl(Features, "rdseed", true);
2515 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002516 setFeatureEnabledImpl(Features, "lzcnt", true);
2517 setFeatureEnabledImpl(Features, "bmi", true);
2518 setFeatureEnabledImpl(Features, "bmi2", true);
2519 setFeatureEnabledImpl(Features, "rtm", true);
2520 setFeatureEnabledImpl(Features, "fma", true);
2521 setFeatureEnabledImpl(Features, "rdrnd", true);
2522 setFeatureEnabledImpl(Features, "f16c", true);
2523 setFeatureEnabledImpl(Features, "fsgsbase", true);
2524 setFeatureEnabledImpl(Features, "aes", true);
2525 setFeatureEnabledImpl(Features, "pclmul", true);
2526 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002527 break;
2528 case CK_K6_2:
2529 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002530 case CK_WinChip2:
2531 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002532 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002533 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002534 case CK_Athlon:
2535 case CK_AthlonThunderbird:
2536 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002537 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002538 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002539 case CK_Athlon4:
2540 case CK_AthlonXP:
2541 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002542 setFeatureEnabledImpl(Features, "sse", true);
2543 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002544 break;
2545 case CK_K8:
2546 case CK_Opteron:
2547 case CK_Athlon64:
2548 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002549 setFeatureEnabledImpl(Features, "sse2", true);
2550 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002551 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002552 case CK_AMDFAM10:
2553 setFeatureEnabledImpl(Features, "sse4a", true);
2554 setFeatureEnabledImpl(Features, "lzcnt", true);
2555 setFeatureEnabledImpl(Features, "popcnt", true);
2556 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002557 case CK_K8SSE3:
2558 case CK_OpteronSSE3:
2559 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002560 setFeatureEnabledImpl(Features, "sse3", true);
2561 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002562 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002563 case CK_BTVER2:
2564 setFeatureEnabledImpl(Features, "avx", true);
2565 setFeatureEnabledImpl(Features, "aes", true);
2566 setFeatureEnabledImpl(Features, "pclmul", true);
2567 setFeatureEnabledImpl(Features, "bmi", true);
2568 setFeatureEnabledImpl(Features, "f16c", true);
2569 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002570 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002571 setFeatureEnabledImpl(Features, "ssse3", true);
2572 setFeatureEnabledImpl(Features, "sse4a", true);
2573 setFeatureEnabledImpl(Features, "lzcnt", true);
2574 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002575 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002576 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002577 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002578 case CK_BDVER4:
2579 setFeatureEnabledImpl(Features, "avx2", true);
2580 setFeatureEnabledImpl(Features, "bmi2", true);
2581 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002582 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002583 setFeatureEnabledImpl(Features, "fsgsbase", true);
2584 // FALLTHROUGH
2585 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002586 setFeatureEnabledImpl(Features, "bmi", true);
2587 setFeatureEnabledImpl(Features, "fma", true);
2588 setFeatureEnabledImpl(Features, "f16c", true);
2589 setFeatureEnabledImpl(Features, "tbm", true);
2590 // FALLTHROUGH
2591 case CK_BDVER1:
2592 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002593 setFeatureEnabledImpl(Features, "xop", true);
2594 setFeatureEnabledImpl(Features, "lzcnt", true);
2595 setFeatureEnabledImpl(Features, "aes", true);
2596 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002597 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002598 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002599 break;
Eli Friedman33465822011-07-08 23:31:17 +00002600 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002601}
2602
Rafael Espindolae62e2792013-08-20 13:44:29 +00002603void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002604 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002605 if (Enabled) {
2606 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002607 case AVX512F:
2608 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002609 case AVX2:
2610 Features["avx2"] = true;
2611 case AVX:
2612 Features["avx"] = true;
2613 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002614 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002615 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002616 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002617 case SSSE3:
2618 Features["ssse3"] = true;
2619 case SSE3:
2620 Features["sse3"] = true;
2621 case SSE2:
2622 Features["sse2"] = true;
2623 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002624 Features["sse"] = true;
2625 case NoSSE:
2626 break;
2627 }
2628 return;
2629 }
2630
2631 switch (Level) {
2632 case NoSSE:
2633 case SSE1:
2634 Features["sse"] = false;
2635 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002636 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2637 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002638 case SSE3:
2639 Features["sse3"] = false;
2640 setXOPLevel(Features, NoXOP, false);
2641 case SSSE3:
2642 Features["ssse3"] = false;
2643 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002644 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002645 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002646 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002647 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002648 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002649 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002650 case AVX2:
2651 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002652 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002653 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002654 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2655 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002656 }
2657}
2658
2659void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002660 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002661 if (Enabled) {
2662 switch (Level) {
2663 case AMD3DNowAthlon:
2664 Features["3dnowa"] = true;
2665 case AMD3DNow:
2666 Features["3dnow"] = true;
2667 case MMX:
2668 Features["mmx"] = true;
2669 case NoMMX3DNow:
2670 break;
2671 }
2672 return;
2673 }
2674
2675 switch (Level) {
2676 case NoMMX3DNow:
2677 case MMX:
2678 Features["mmx"] = false;
2679 case AMD3DNow:
2680 Features["3dnow"] = false;
2681 case AMD3DNowAthlon:
2682 Features["3dnowa"] = false;
2683 }
2684}
2685
2686void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002687 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002688 if (Enabled) {
2689 switch (Level) {
2690 case XOP:
2691 Features["xop"] = true;
2692 case FMA4:
2693 Features["fma4"] = true;
2694 setSSELevel(Features, AVX, true);
2695 case SSE4A:
2696 Features["sse4a"] = true;
2697 setSSELevel(Features, SSE3, true);
2698 case NoXOP:
2699 break;
2700 }
2701 return;
2702 }
2703
2704 switch (Level) {
2705 case NoXOP:
2706 case SSE4A:
2707 Features["sse4a"] = false;
2708 case FMA4:
2709 Features["fma4"] = false;
2710 case XOP:
2711 Features["xop"] = false;
2712 }
2713}
2714
Craig Topper86d79ef2013-09-17 04:51:29 +00002715void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2716 StringRef Name, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002717 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002718
Craig Topper29561122013-09-19 01:13:07 +00002719 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002720 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002721 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002722 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002723 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002724 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002725 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002726 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002727 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002728 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002729 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002730 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002731 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002732 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002733 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002734 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002735 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002736 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002737 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002738 if (Enabled)
2739 setSSELevel(Features, SSE2, Enabled);
2740 } else if (Name == "pclmul") {
2741 if (Enabled)
2742 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002743 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002744 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002745 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002746 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002747 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002748 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002749 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2750 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002751 if (Enabled)
2752 setSSELevel(Features, AVX512F, Enabled);
2753 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002754 if (Enabled)
2755 setSSELevel(Features, AVX, Enabled);
2756 } else if (Name == "fma4") {
2757 setXOPLevel(Features, FMA4, Enabled);
2758 } else if (Name == "xop") {
2759 setXOPLevel(Features, XOP, Enabled);
2760 } else if (Name == "sse4a") {
2761 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002762 } else if (Name == "f16c") {
2763 if (Enabled)
2764 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002765 } else if (Name == "sha") {
2766 if (Enabled)
2767 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002768 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002769}
2770
Eric Christopher3ff21b32013-10-16 21:26:26 +00002771/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002772/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002773bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002774 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002775 // Remember the maximum enabled sselevel.
2776 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2777 // Ignore disabled features.
2778 if (Features[i][0] == '-')
2779 continue;
2780
Benjamin Kramer27402c62012-03-05 15:10:44 +00002781 StringRef Feature = StringRef(Features[i]).substr(1);
2782
2783 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002784 HasAES = true;
2785 continue;
2786 }
2787
Craig Topper3f122a72012-05-31 05:18:48 +00002788 if (Feature == "pclmul") {
2789 HasPCLMUL = true;
2790 continue;
2791 }
2792
Benjamin Kramer27402c62012-03-05 15:10:44 +00002793 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002794 HasLZCNT = true;
2795 continue;
2796 }
2797
Rafael Espindola89049822013-08-23 20:21:37 +00002798 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002799 HasRDRND = true;
2800 continue;
2801 }
2802
Craig Topper8c7f2512014-11-03 06:51:41 +00002803 if (Feature == "fsgsbase") {
2804 HasFSGSBASE = true;
2805 continue;
2806 }
2807
Benjamin Kramer27402c62012-03-05 15:10:44 +00002808 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002809 HasBMI = true;
2810 continue;
2811 }
2812
Benjamin Kramer27402c62012-03-05 15:10:44 +00002813 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002814 HasBMI2 = true;
2815 continue;
2816 }
2817
Benjamin Kramer27402c62012-03-05 15:10:44 +00002818 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002819 HasPOPCNT = true;
2820 continue;
2821 }
2822
Michael Liao625a8752012-11-10 05:17:46 +00002823 if (Feature == "rtm") {
2824 HasRTM = true;
2825 continue;
2826 }
2827
Michael Liao74f4eaf2013-03-26 17:52:08 +00002828 if (Feature == "prfchw") {
2829 HasPRFCHW = true;
2830 continue;
2831 }
2832
Michael Liaoffaae352013-03-29 05:17:55 +00002833 if (Feature == "rdseed") {
2834 HasRDSEED = true;
2835 continue;
2836 }
2837
Robert Khasanov50e6f582014-09-19 09:53:48 +00002838 if (Feature == "adx") {
2839 HasADX = true;
2840 continue;
2841 }
2842
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002843 if (Feature == "tbm") {
2844 HasTBM = true;
2845 continue;
2846 }
2847
Craig Topperbba778b2012-06-03 21:46:30 +00002848 if (Feature == "fma") {
2849 HasFMA = true;
2850 continue;
2851 }
2852
Manman Rena45358c2012-10-11 00:59:55 +00002853 if (Feature == "f16c") {
2854 HasF16C = true;
2855 continue;
2856 }
2857
Craig Topper679b53a2013-08-21 05:29:10 +00002858 if (Feature == "avx512cd") {
2859 HasAVX512CD = true;
2860 continue;
2861 }
2862
2863 if (Feature == "avx512er") {
2864 HasAVX512ER = true;
2865 continue;
2866 }
2867
2868 if (Feature == "avx512pf") {
2869 HasAVX512PF = true;
2870 continue;
2871 }
2872
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002873 if (Feature == "avx512dq") {
2874 HasAVX512DQ = true;
2875 continue;
2876 }
2877
2878 if (Feature == "avx512bw") {
2879 HasAVX512BW = true;
2880 continue;
2881 }
2882
2883 if (Feature == "avx512vl") {
2884 HasAVX512VL = true;
2885 continue;
2886 }
2887
Ben Langmuir58078d02013-09-19 13:22:04 +00002888 if (Feature == "sha") {
2889 HasSHA = true;
2890 continue;
2891 }
2892
Nick Lewycky50e8f482013-10-05 20:14:27 +00002893 if (Feature == "cx16") {
2894 HasCX16 = true;
2895 continue;
2896 }
2897
Daniel Dunbar979586e2009-11-11 09:38:56 +00002898 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002899 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002900 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002901 .Case("avx2", AVX2)
2902 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002903 .Case("sse4.2", SSE42)
2904 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002905 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002906 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002907 .Case("sse2", SSE2)
2908 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002909 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002910 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002911
Eli Friedman33465822011-07-08 23:31:17 +00002912 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002913 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002914 .Case("3dnowa", AMD3DNowAthlon)
2915 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002916 .Case("mmx", MMX)
2917 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002918 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002919
2920 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2921 .Case("xop", XOP)
2922 .Case("fma4", FMA4)
2923 .Case("sse4a", SSE4A)
2924 .Default(NoXOP);
2925 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002926 }
Eli Friedman33465822011-07-08 23:31:17 +00002927
Craig Topper7481d8a2013-09-10 06:55:47 +00002928 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2929 // Can't do this earlier because we need to be able to explicitly enable
2930 // popcnt and still disable sse4.2.
2931 if (!HasPOPCNT && SSELevel >= SSE42 &&
2932 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2933 HasPOPCNT = true;
2934 Features.push_back("+popcnt");
2935 }
2936
Yunzhong Gao61089362013-10-16 19:07:02 +00002937 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2938 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2939 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2940 HasPRFCHW = true;
2941 Features.push_back("+prfchw");
2942 }
2943
Rafael Espindolaeb265472013-08-21 21:59:03 +00002944 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2945 // matches the selected sse level.
2946 if (FPMath == FP_SSE && SSELevel < SSE1) {
2947 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2948 return false;
2949 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2950 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2951 return false;
2952 }
2953
Eli Friedman33465822011-07-08 23:31:17 +00002954 // Don't tell the backend if we're turning off mmx; it will end up disabling
2955 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002956 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2957 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002958 std::vector<std::string>::iterator it;
2959 it = std::find(Features.begin(), Features.end(), "-mmx");
2960 if (it != Features.end())
2961 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002962 else if (SSELevel > NoSSE)
2963 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002964 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002965}
Chris Lattnerecd49032009-03-02 22:27:17 +00002966
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002967/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2968/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002969void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002970 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002971 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002972 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002973 Builder.defineMacro("__amd64__");
2974 Builder.defineMacro("__amd64");
2975 Builder.defineMacro("__x86_64");
2976 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002977 if (getTriple().getArchName() == "x86_64h") {
2978 Builder.defineMacro("__x86_64h");
2979 Builder.defineMacro("__x86_64h__");
2980 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002981 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002982 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002983 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002984
Chris Lattnerecd49032009-03-02 22:27:17 +00002985 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002986 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2987 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002988 switch (CPU) {
2989 case CK_Generic:
2990 break;
2991 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002992 // The rest are coming from the i386 define above.
2993 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002994 break;
2995 case CK_i486:
2996 case CK_WinChipC6:
2997 case CK_WinChip2:
2998 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002999 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003000 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003001 case CK_PentiumMMX:
3002 Builder.defineMacro("__pentium_mmx__");
3003 Builder.defineMacro("__tune_pentium_mmx__");
3004 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003005 case CK_i586:
3006 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003007 defineCPUMacros(Builder, "i586");
3008 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003009 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003010 case CK_Pentium3:
3011 case CK_Pentium3M:
3012 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003013 Builder.defineMacro("__tune_pentium3__");
3014 // Fallthrough
3015 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003016 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003017 Builder.defineMacro("__tune_pentium2__");
3018 // Fallthrough
3019 case CK_PentiumPro:
3020 Builder.defineMacro("__tune_i686__");
3021 Builder.defineMacro("__tune_pentiumpro__");
3022 // Fallthrough
3023 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003024 Builder.defineMacro("__i686");
3025 Builder.defineMacro("__i686__");
3026 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3027 Builder.defineMacro("__pentiumpro");
3028 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003029 break;
3030 case CK_Pentium4:
3031 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003032 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003033 break;
3034 case CK_Yonah:
3035 case CK_Prescott:
3036 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003037 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003038 break;
3039 case CK_Core2:
3040 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003041 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003042 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003043 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003044 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003045 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003046 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003047 defineCPUMacros(Builder, "slm");
3048 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003049 case CK_Nehalem:
3050 case CK_Westmere:
3051 case CK_SandyBridge:
3052 case CK_IvyBridge:
3053 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003054 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003055 // FIXME: Historically, we defined this legacy name, it would be nice to
3056 // remove it at some point. We've never exposed fine-grained names for
3057 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003058 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003059 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003060 case CK_Skylake:
3061 // FIXME: Historically, we defined this legacy name, it would be nice to
3062 // remove it at some point. This is the only fine-grained CPU macro in the
3063 // main intel CPU line, and it would be better to not have these and force
3064 // people to use ISA macros.
3065 defineCPUMacros(Builder, "skx");
3066 break;
Craig Topper449314e2013-08-20 07:09:39 +00003067 case CK_KNL:
3068 defineCPUMacros(Builder, "knl");
3069 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003070 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003071 Builder.defineMacro("__k6_2__");
3072 Builder.defineMacro("__tune_k6_2__");
3073 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003074 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003075 if (CPU != CK_K6_2) { // In case of fallthrough
3076 // FIXME: GCC may be enabling these in cases where some other k6
3077 // architecture is specified but -m3dnow is explicitly provided. The
3078 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003079 Builder.defineMacro("__k6_3__");
3080 Builder.defineMacro("__tune_k6_3__");
3081 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003082 // Fallthrough
3083 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003084 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003085 break;
3086 case CK_Athlon:
3087 case CK_AthlonThunderbird:
3088 case CK_Athlon4:
3089 case CK_AthlonXP:
3090 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003091 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003092 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003093 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003094 Builder.defineMacro("__tune_athlon_sse__");
3095 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003096 break;
3097 case CK_K8:
3098 case CK_K8SSE3:
3099 case CK_x86_64:
3100 case CK_Opteron:
3101 case CK_OpteronSSE3:
3102 case CK_Athlon64:
3103 case CK_Athlon64SSE3:
3104 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003105 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003106 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003107 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003108 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003109 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003110 case CK_BTVER1:
3111 defineCPUMacros(Builder, "btver1");
3112 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003113 case CK_BTVER2:
3114 defineCPUMacros(Builder, "btver2");
3115 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003116 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003117 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003118 break;
3119 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003120 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003121 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003122 case CK_BDVER3:
3123 defineCPUMacros(Builder, "bdver3");
3124 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003125 case CK_BDVER4:
3126 defineCPUMacros(Builder, "bdver4");
3127 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003128 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003129 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003130 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003131 }
Chris Lattner96e43572009-03-02 22:40:39 +00003132
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003133 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003134 Builder.defineMacro("__REGISTER_PREFIX__", "");
3135
Chris Lattner6df41af2009-04-19 17:32:33 +00003136 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3137 // functions in glibc header files that use FP Stack inline asm which the
3138 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003139 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003140
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003141 if (HasAES)
3142 Builder.defineMacro("__AES__");
3143
Craig Topper3f122a72012-05-31 05:18:48 +00003144 if (HasPCLMUL)
3145 Builder.defineMacro("__PCLMUL__");
3146
Craig Topper22967d42011-12-25 05:06:45 +00003147 if (HasLZCNT)
3148 Builder.defineMacro("__LZCNT__");
3149
Benjamin Kramer1e250392012-07-07 09:39:18 +00003150 if (HasRDRND)
3151 Builder.defineMacro("__RDRND__");
3152
Craig Topper8c7f2512014-11-03 06:51:41 +00003153 if (HasFSGSBASE)
3154 Builder.defineMacro("__FSGSBASE__");
3155
Craig Topper22967d42011-12-25 05:06:45 +00003156 if (HasBMI)
3157 Builder.defineMacro("__BMI__");
3158
3159 if (HasBMI2)
3160 Builder.defineMacro("__BMI2__");
3161
Craig Topper1de83482011-12-29 16:10:46 +00003162 if (HasPOPCNT)
3163 Builder.defineMacro("__POPCNT__");
3164
Michael Liao625a8752012-11-10 05:17:46 +00003165 if (HasRTM)
3166 Builder.defineMacro("__RTM__");
3167
Michael Liao74f4eaf2013-03-26 17:52:08 +00003168 if (HasPRFCHW)
3169 Builder.defineMacro("__PRFCHW__");
3170
Michael Liaoffaae352013-03-29 05:17:55 +00003171 if (HasRDSEED)
3172 Builder.defineMacro("__RDSEED__");
3173
Robert Khasanov50e6f582014-09-19 09:53:48 +00003174 if (HasADX)
3175 Builder.defineMacro("__ADX__");
3176
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003177 if (HasTBM)
3178 Builder.defineMacro("__TBM__");
3179
Rafael Espindolae62e2792013-08-20 13:44:29 +00003180 switch (XOPLevel) {
3181 case XOP:
3182 Builder.defineMacro("__XOP__");
3183 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003184 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003185 case SSE4A:
3186 Builder.defineMacro("__SSE4A__");
3187 case NoXOP:
3188 break;
3189 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003190
Craig Topperbba778b2012-06-03 21:46:30 +00003191 if (HasFMA)
3192 Builder.defineMacro("__FMA__");
3193
Manman Rena45358c2012-10-11 00:59:55 +00003194 if (HasF16C)
3195 Builder.defineMacro("__F16C__");
3196
Craig Topper679b53a2013-08-21 05:29:10 +00003197 if (HasAVX512CD)
3198 Builder.defineMacro("__AVX512CD__");
3199 if (HasAVX512ER)
3200 Builder.defineMacro("__AVX512ER__");
3201 if (HasAVX512PF)
3202 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003203 if (HasAVX512DQ)
3204 Builder.defineMacro("__AVX512DQ__");
3205 if (HasAVX512BW)
3206 Builder.defineMacro("__AVX512BW__");
3207 if (HasAVX512VL)
3208 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003209
Ben Langmuir58078d02013-09-19 13:22:04 +00003210 if (HasSHA)
3211 Builder.defineMacro("__SHA__");
3212
Nick Lewycky50e8f482013-10-05 20:14:27 +00003213 if (HasCX16)
3214 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3215
Chris Lattner96e43572009-03-02 22:40:39 +00003216 // Each case falls through to the previous one here.
3217 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003218 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003219 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003220 case AVX2:
3221 Builder.defineMacro("__AVX2__");
3222 case AVX:
3223 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003224 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003225 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003226 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003227 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003228 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003229 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003230 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003231 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003232 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003233 Builder.defineMacro("__SSE2__");
3234 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003235 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003236 Builder.defineMacro("__SSE__");
3237 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003238 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003239 break;
3240 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003241
Derek Schuffc7dd7222012-10-11 15:52:22 +00003242 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003243 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003244 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003245 case AVX2:
3246 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003247 case SSE42:
3248 case SSE41:
3249 case SSSE3:
3250 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003251 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003252 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003253 break;
3254 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003255 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003256 break;
3257 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003258 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003259 }
3260 }
3261
Anders Carlssone437c682010-01-27 03:47:49 +00003262 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003263 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003264 case AMD3DNowAthlon:
3265 Builder.defineMacro("__3dNOW_A__");
3266 case AMD3DNow:
3267 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003268 case MMX:
3269 Builder.defineMacro("__MMX__");
3270 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003271 break;
3272 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003273
3274 if (CPU >= CK_i486) {
3275 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3276 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3277 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3278 }
3279 if (CPU >= CK_i586)
3280 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003281}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003282
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003283bool X86TargetInfo::hasFeature(StringRef Feature) const {
3284 return llvm::StringSwitch<bool>(Feature)
3285 .Case("aes", HasAES)
3286 .Case("avx", SSELevel >= AVX)
3287 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003288 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003289 .Case("avx512cd", HasAVX512CD)
3290 .Case("avx512er", HasAVX512ER)
3291 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003292 .Case("avx512dq", HasAVX512DQ)
3293 .Case("avx512bw", HasAVX512BW)
3294 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003295 .Case("bmi", HasBMI)
3296 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003297 .Case("cx16", HasCX16)
3298 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003299 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003300 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003301 .Case("fsgsbase", HasFSGSBASE)
Craig Topper8dbc5842014-11-03 07:05:26 +00003302 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003303 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3304 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3305 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003306 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003307 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003308 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003309 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003310 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003311 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003312 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003313 .Case("sse", SSELevel >= SSE1)
3314 .Case("sse2", SSELevel >= SSE2)
3315 .Case("sse3", SSELevel >= SSE3)
3316 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003317 .Case("sse4.1", SSELevel >= SSE41)
3318 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003319 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003320 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003321 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003322 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3323 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003324 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003325 .Default(false);
3326}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003327
Eli Friedman3fd920a2008-08-20 02:34:37 +00003328bool
Anders Carlsson58436352009-02-28 17:11:49 +00003329X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003330 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003331 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003332 default: return false;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003333 case 'I':
3334 Info.setRequiresImmediate(0, 31);
3335 return true;
3336 case 'J':
3337 Info.setRequiresImmediate(0, 63);
3338 return true;
3339 case 'K':
3340 Info.setRequiresImmediate(-128, 127);
3341 return true;
3342 case 'L':
3343 // FIXME: properly analyze this constraint:
3344 // must be one of 0xff, 0xffff, or 0xffffffff
3345 return true;
3346 case 'M':
3347 Info.setRequiresImmediate(0, 3);
3348 return true;
3349 case 'N':
3350 Info.setRequiresImmediate(0, 255);
3351 return true;
3352 case 'O':
3353 Info.setRequiresImmediate(0, 127);
3354 return true;
Dale Johannesen46742a42010-08-24 22:33:12 +00003355 case 'Y': // first letter of a pair:
3356 switch (*(Name+1)) {
3357 default: return false;
3358 case '0': // First SSE register.
3359 case 't': // Any SSE register, when SSE2 is enabled.
3360 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3361 case 'm': // any MMX register, when inter-unit moves enabled.
3362 break; // falls through to setAllowsRegister.
3363 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003364 case 'f': // any x87 floating point stack register.
3365 // Constraint 'f' cannot be used for output operands.
3366 if (Info.ConstraintStr[0] == '=')
3367 return false;
3368
3369 Info.setAllowsRegister();
3370 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003371 case 'a': // eax.
3372 case 'b': // ebx.
3373 case 'c': // ecx.
3374 case 'd': // edx.
3375 case 'S': // esi.
3376 case 'D': // edi.
3377 case 'A': // edx:eax.
3378 case 't': // top of floating point stack.
3379 case 'u': // second from top of floating point stack.
3380 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003381 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003382 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003383 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003384 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3385 case 'l': // "Index" registers: any general register that can be used as an
3386 // index in a base+index memory access.
3387 Info.setAllowsRegister();
3388 return true;
3389 case 'C': // SSE floating point constant.
3390 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003391 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003392 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003393 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003394 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003395 return true;
3396 }
3397}
3398
Akira Hatanaka974131e2014-09-18 18:17:18 +00003399bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3400 unsigned Size) const {
3401 // Strip off constraint modifiers.
3402 while (Constraint[0] == '=' ||
3403 Constraint[0] == '+' ||
3404 Constraint[0] == '&')
3405 Constraint = Constraint.substr(1);
3406
3407 return validateOperandSize(Constraint, Size);
3408}
3409
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003410bool X86TargetInfo::validateInputSize(StringRef Constraint,
3411 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003412 return validateOperandSize(Constraint, Size);
3413}
3414
3415bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3416 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003417 switch (Constraint[0]) {
3418 default: break;
3419 case 'y':
3420 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003421 case 'f':
3422 case 't':
3423 case 'u':
3424 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003425 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003426 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003427 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003428 }
3429
3430 return true;
3431}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003432
Eli Friedman3fd920a2008-08-20 02:34:37 +00003433std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003434X86TargetInfo::convertConstraint(const char *&Constraint) const {
3435 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003436 case 'a': return std::string("{ax}");
3437 case 'b': return std::string("{bx}");
3438 case 'c': return std::string("{cx}");
3439 case 'd': return std::string("{dx}");
3440 case 'S': return std::string("{si}");
3441 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003442 case 'p': // address
3443 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003444 case 't': // top of floating point stack.
3445 return std::string("{st}");
3446 case 'u': // second from top of floating point stack.
3447 return std::string("{st(1)}"); // second from top of floating point stack.
3448 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003449 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003450 }
3451}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003452
Eli Friedman3fd920a2008-08-20 02:34:37 +00003453// X86-32 generic target
3454class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003455public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003456 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003457 DoubleAlign = LongLongAlign = 32;
3458 LongDoubleWidth = 96;
3459 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003460 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003461 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003462 SizeType = UnsignedInt;
3463 PtrDiffType = SignedInt;
3464 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003465 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003466
3467 // Use fpret for all types.
3468 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3469 (1 << TargetInfo::Double) |
3470 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003471
3472 // x86-32 has atomics up to 8 bytes
3473 // FIXME: Check that we actually have cmpxchg8b before setting
3474 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3475 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003476 }
Craig Topper3164f332014-03-11 03:39:26 +00003477 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003478 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003479 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003480
Craig Topper3164f332014-03-11 03:39:26 +00003481 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003482 if (RegNo == 0) return 0;
3483 if (RegNo == 1) return 2;
3484 return -1;
3485 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003486 bool validateOperandSize(StringRef Constraint,
3487 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003488 switch (Constraint[0]) {
3489 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003490 case 'R':
3491 case 'q':
3492 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003493 case 'a':
3494 case 'b':
3495 case 'c':
3496 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003497 case 'S':
3498 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003499 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003500 case 'A':
3501 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003502 }
3503
Akira Hatanaka974131e2014-09-18 18:17:18 +00003504 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003505 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003506};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003507
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003508class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3509public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003510 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3511 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003512
Craig Topper3164f332014-03-11 03:39:26 +00003513 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003514 unsigned Major, Minor, Micro;
3515 getTriple().getOSVersion(Major, Minor, Micro);
3516 // New NetBSD uses the default rounding mode.
3517 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3518 return X86_32TargetInfo::getFloatEvalMethod();
3519 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003520 return 1;
3521 }
3522};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003523
Eli Friedmane3aa4542009-07-05 18:47:56 +00003524class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3525public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003526 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3527 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003528 SizeType = UnsignedLong;
3529 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003530 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003531 }
3532};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003533
Eli Friedman9fa28852012-08-08 23:57:20 +00003534class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3535public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003536 BitrigI386TargetInfo(const llvm::Triple &Triple)
3537 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003538 SizeType = UnsignedLong;
3539 IntPtrType = SignedLong;
3540 PtrDiffType = SignedLong;
3541 }
3542};
Eli Friedman9fa28852012-08-08 23:57:20 +00003543
Torok Edwinb2b37c62009-06-30 17:10:35 +00003544class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003545public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003546 DarwinI386TargetInfo(const llvm::Triple &Triple)
3547 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003548 LongDoubleWidth = 128;
3549 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003550 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003551 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003552 SizeType = UnsignedLong;
3553 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003554 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003555 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003556 }
3557
Eli Friedman3fd920a2008-08-20 02:34:37 +00003558};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003559
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003560// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003561class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003562public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003563 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3564 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003565 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003566 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003567 bool IsWinCOFF =
3568 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Reid Kleckneraf676022015-04-30 22:13:05 +00003569 DescriptionString = IsWinCOFF
3570 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3571 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003572 }
Craig Topper3164f332014-03-11 03:39:26 +00003573 void getTargetDefines(const LangOptions &Opts,
3574 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003575 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3576 }
3577};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003578
3579// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003580class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003581public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003582 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003583 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003584 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003585 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3586 }
Craig Topper3164f332014-03-11 03:39:26 +00003587 void getTargetDefines(const LangOptions &Opts,
3588 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003589 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3590 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3591 // The value of the following reflects processor type.
3592 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3593 // We lost the original triple, so we use the default.
3594 Builder.defineMacro("_M_IX86", "600");
3595 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003596};
3597} // end anonymous namespace
3598
David Majnemerae1ed0e2015-05-28 04:36:18 +00003599static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3600 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang supports
Reid Kleckner47606832014-04-21 20:58:00 +00003601 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3602 // macro anyway for pre-processor compatibility.
3603 if (Opts.MicrosoftExt)
3604 Builder.defineMacro("__declspec", "__declspec");
3605 else
3606 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3607
3608 if (!Opts.MicrosoftExt) {
3609 // Provide macros for all the calling convention keywords. Provide both
3610 // single and double underscore prefixed variants. These are available on
3611 // x64 as well as x86, even though they have no effect.
3612 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3613 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003614 std::string GCCSpelling = "__attribute__((__";
3615 GCCSpelling += CC;
3616 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003617 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3618 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3619 }
3620 }
3621}
3622
David Majnemerae1ed0e2015-05-28 04:36:18 +00003623static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3624 Builder.defineMacro("__MSVCRT__");
3625 Builder.defineMacro("__MINGW32__");
3626 addCygMingDefines(Opts, Builder);
3627}
3628
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003629namespace {
3630// x86-32 MinGW target
3631class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3632public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003633 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3634 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003635 void getTargetDefines(const LangOptions &Opts,
3636 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003637 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003638 DefineStd(Builder, "WIN32", Opts);
3639 DefineStd(Builder, "WINNT", Opts);
3640 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003641 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003642 }
3643};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003644
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003645// x86-32 Cygwin target
3646class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3647public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003648 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3649 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003650 TLSSupported = false;
3651 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003652 DoubleAlign = LongLongAlign = 64;
Reid Kleckneraf676022015-04-30 22:13:05 +00003653 DescriptionString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003654 }
Craig Topper3164f332014-03-11 03:39:26 +00003655 void getTargetDefines(const LangOptions &Opts,
3656 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003657 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003658 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003659 Builder.defineMacro("__CYGWIN__");
3660 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003661 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003662 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003663 if (Opts.CPlusPlus)
3664 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003665 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003666};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003667
Chris Lattnerb986aba2010-04-11 19:29:39 +00003668// x86-32 Haiku target
3669class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3670public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003671 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003672 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003673 IntPtrType = SignedLong;
3674 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003675 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003676 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003677 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003678 }
Craig Topper3164f332014-03-11 03:39:26 +00003679 void getTargetDefines(const LangOptions &Opts,
3680 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003681 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3682 Builder.defineMacro("__INTEL__");
3683 Builder.defineMacro("__HAIKU__");
3684 }
3685};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003686
Douglas Gregor9fabd852011-07-01 22:41:14 +00003687// RTEMS Target
3688template<typename Target>
3689class RTEMSTargetInfo : public OSTargetInfo<Target> {
3690protected:
Craig Topper3164f332014-03-11 03:39:26 +00003691 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3692 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003693 // RTEMS defines; list based off of gcc output
3694
Douglas Gregor9fabd852011-07-01 22:41:14 +00003695 Builder.defineMacro("__rtems__");
3696 Builder.defineMacro("__ELF__");
3697 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003698
Douglas Gregor9fabd852011-07-01 22:41:14 +00003699public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003700 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3701 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003702
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003703 switch (Triple.getArch()) {
3704 default:
3705 case llvm::Triple::x86:
3706 // this->MCountName = ".mcount";
3707 break;
3708 case llvm::Triple::mips:
3709 case llvm::Triple::mipsel:
3710 case llvm::Triple::ppc:
3711 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003712 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003713 // this->MCountName = "_mcount";
3714 break;
3715 case llvm::Triple::arm:
3716 // this->MCountName = "__mcount";
3717 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003718 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003719 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003720};
3721
Douglas Gregor9fabd852011-07-01 22:41:14 +00003722// x86-32 RTEMS target
3723class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3724public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003725 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003726 SizeType = UnsignedLong;
3727 IntPtrType = SignedLong;
3728 PtrDiffType = SignedLong;
3729 this->UserLabelPrefix = "";
3730 }
Craig Topper3164f332014-03-11 03:39:26 +00003731 void getTargetDefines(const LangOptions &Opts,
3732 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003733 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3734 Builder.defineMacro("__INTEL__");
3735 Builder.defineMacro("__rtems__");
3736 }
3737};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003738
Eli Friedman3fd920a2008-08-20 02:34:37 +00003739// x86-64 generic target
3740class X86_64TargetInfo : public X86TargetInfo {
3741public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003742 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003743 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003744 bool IsWinCOFF =
3745 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003746 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003747 LongDoubleWidth = 128;
3748 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003749 LargeArrayMinWidth = 128;
3750 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003751 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003752 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3753 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3754 IntPtrType = IsX32 ? SignedInt : SignedLong;
3755 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003756 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003757 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003758
Eric Christopher917e9522014-11-18 22:36:15 +00003759 // Pointers are 32-bit in x32.
David Majnemer8fa8c382015-03-17 23:55:00 +00003760 DescriptionString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3761 : IsWinCOFF
3762 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3763 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003764
3765 // Use fpret only for long double.
3766 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003767
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003768 // Use fp2ret for _Complex long double.
3769 ComplexLongDoubleUsesFP2Ret = true;
3770
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003771 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003772 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003773 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003774 }
Craig Topper3164f332014-03-11 03:39:26 +00003775 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003776 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003777 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003778
Craig Topper3164f332014-03-11 03:39:26 +00003779 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003780 if (RegNo == 0) return 0;
3781 if (RegNo == 1) return 1;
3782 return -1;
3783 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003784
Craig Topper3164f332014-03-11 03:39:26 +00003785 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003786 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003787 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003788 CC == CC_IntelOclBicc ||
3789 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003790 }
3791
Craig Topper3164f332014-03-11 03:39:26 +00003792 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003793 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003794 }
3795
Pavel Chupinfd223e12014-08-04 12:39:43 +00003796 // for x32 we need it here explicitly
3797 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003798};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003799
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003800// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003801class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003802public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003803 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3804 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003805 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003806 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003807 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003808 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003809 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003810 SizeType = UnsignedLongLong;
3811 PtrDiffType = SignedLongLong;
3812 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003813 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003814 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003815
Craig Topper3164f332014-03-11 03:39:26 +00003816 void getTargetDefines(const LangOptions &Opts,
3817 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003818 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003819 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003820 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003821
Craig Topper3164f332014-03-11 03:39:26 +00003822 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003823 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003824 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003825
Craig Topper3164f332014-03-11 03:39:26 +00003826 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00003827 switch (CC) {
3828 case CC_X86StdCall:
3829 case CC_X86ThisCall:
3830 case CC_X86FastCall:
3831 return CCCR_Ignore;
3832 case CC_C:
3833 case CC_X86VectorCall:
3834 case CC_IntelOclBicc:
3835 case CC_X86_64SysV:
3836 return CCCR_OK;
3837 default:
3838 return CCCR_Warning;
3839 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003840 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003841};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003842
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003843// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003844class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003845public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003846 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003847 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003848 LongDoubleWidth = LongDoubleAlign = 64;
3849 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003850 }
Craig Topper3164f332014-03-11 03:39:26 +00003851 void getTargetDefines(const LangOptions &Opts,
3852 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003853 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3854 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003855 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003856 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003857 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003858};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003859
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003860// x86-64 MinGW target
3861class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3862public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003863 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3864 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003865 void getTargetDefines(const LangOptions &Opts,
3866 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003867 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003868 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003869 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003870 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00003871
3872 // GCC defines this macro when it is using __gxx_personality_seh0.
3873 if (!Opts.SjLjExceptions)
3874 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003875 }
3876};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003877
Eli Friedman2857ccb2009-07-01 03:36:11 +00003878class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3879public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003880 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3881 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003882 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003883 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003884 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3885 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003886 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003887 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003888 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003889 }
3890};
Eli Friedman2857ccb2009-07-01 03:36:11 +00003891
Eli Friedman245f2292009-07-05 22:31:18 +00003892class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3893public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003894 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3895 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003896 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003897 Int64Type = SignedLongLong;
3898 }
3899};
Eli Friedman245f2292009-07-05 22:31:18 +00003900
Eli Friedman9fa28852012-08-08 23:57:20 +00003901class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3902public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003903 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3904 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3905 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003906 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003907 }
3908};
Tim Northover9bb857a2013-01-31 12:13:10 +00003909
Eli Friedmanf05b7722008-08-20 07:44:10 +00003910class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003911 // Possible FPU choices.
3912 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003913 VFP2FPU = (1 << 0),
3914 VFP3FPU = (1 << 1),
3915 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003916 NeonFPU = (1 << 3),
3917 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003918 };
3919
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003920 // Possible HWDiv features.
3921 enum HWDivMode {
3922 HWDivThumb = (1 << 0),
3923 HWDivARM = (1 << 1)
3924 };
3925
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003926 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003927 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003928 }
3929
3930 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3931 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003932
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003933 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003934
Rafael Espindolaeb265472013-08-21 21:59:03 +00003935 enum {
3936 FP_Default,
3937 FP_VFP,
3938 FP_Neon
3939 } FPMath;
3940
Bernard Ogdenda13af32013-10-24 18:32:51 +00003941 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003942
Logan Chien57086ce2012-10-10 06:56:20 +00003943 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003944 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003945 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003946
3947 // Initialized via features.
3948 unsigned SoftFloat : 1;
3949 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003950
Bernard Ogden18b57012013-10-29 09:47:51 +00003951 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003952 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003953
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003954 // ACLE 6.5.1 Hardware floating point
3955 enum {
3956 HW_FP_HP = (1 << 1), /// half (16-bit)
3957 HW_FP_SP = (1 << 2), /// single (32-bit)
3958 HW_FP_DP = (1 << 3), /// double (64-bit)
3959 };
3960 uint32_t HW_FP;
3961
Chris Lattner5cc15e02010-03-03 19:03:45 +00003962 static const Builtin::Info BuiltinInfo[];
3963
Rafael Espindola101d5b92013-05-13 20:09:47 +00003964 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003965 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003966 if (T.getArch() == llvm::Triple::arm ||
3967 T.getArch() == llvm::Triple::armeb) {
3968 StringRef VersionStr;
3969 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003970 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003971 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003972 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003973 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003974 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003975 unsigned Version;
3976 if (VersionStr.getAsInteger(10, Version))
3977 return false;
3978 return Version >= 6;
3979 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003980 assert(T.getArch() == llvm::Triple::thumb ||
3981 T.getArch() == llvm::Triple::thumbeb);
3982 StringRef VersionStr;
3983 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003984 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003985 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003986 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003987 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003988 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003989 unsigned Version;
3990 if (VersionStr.getAsInteger(10, Version))
3991 return false;
3992 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003993 }
3994
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003995 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003996 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003997
3998 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003999 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004000
Renato Golin9ba39232015-02-27 16:35:48 +00004001 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4002 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4003 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004004 SizeType = UnsignedLong;
4005 else
4006 SizeType = UnsignedInt;
4007
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004008 switch (T.getOS()) {
4009 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004010 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004011 break;
4012 case llvm::Triple::Win32:
4013 WCharType = UnsignedShort;
4014 break;
4015 case llvm::Triple::Linux:
4016 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004017 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4018 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004019 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004020 }
4021
4022 UseBitFieldTypeAlignment = true;
4023
4024 ZeroLengthBitfieldBoundary = 0;
4025
Tim Northover147cd2f2014-10-14 22:12:21 +00004026 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4027 // so set preferred for small types to 32.
4028 if (T.isOSBinFormatMachO()) {
4029 DescriptionString =
4030 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4031 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4032 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004033 assert(!BigEndian && "Windows on ARM does not support big endian");
4034 DescriptionString = "e"
David Majnemer8fa8c382015-03-17 23:55:00 +00004035 "-m:w"
Tim Northover147cd2f2014-10-14 22:12:21 +00004036 "-p:32:32"
4037 "-i64:64"
4038 "-v128:64:128"
4039 "-a:0:32"
4040 "-n32"
4041 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004042 } else if (T.isOSNaCl()) {
4043 assert(!BigEndian && "NaCl on ARM does not support big endian");
4044 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004045 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00004046 DescriptionString =
4047 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4048 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004049 }
4050
4051 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004052 }
4053
4054 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004055 const llvm::Triple &T = getTriple();
4056
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004057 IsAAPCS = false;
4058
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004059 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004060
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004061 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004062 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004063 SizeType = UnsignedInt;
4064 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004065 SizeType = UnsignedLong;
4066
4067 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4068 WCharType = SignedInt;
4069
4070 // Do not respect the alignment of bit-field types when laying out
4071 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4072 UseBitFieldTypeAlignment = false;
4073
4074 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4075 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4076 /// gcc.
4077 ZeroLengthBitfieldBoundary = 32;
4078
Tim Northover147cd2f2014-10-14 22:12:21 +00004079 if (T.isOSBinFormatMachO())
4080 DescriptionString =
4081 BigEndian
4082 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4083 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4084 else
4085 DescriptionString =
4086 BigEndian
4087 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4088 : "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 +00004089
4090 // FIXME: Override "preferred align" for double and long long.
4091 }
4092
Chris Lattner17df24e2008-04-21 18:56:49 +00004093public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004094 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004095 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004096 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004097 BigEndian = IsBigEndian;
4098
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004099 switch (getTriple().getOS()) {
4100 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004101 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004102 break;
4103 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004104 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004105 break;
4106 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004107
Chris Lattner1a8f3942010-04-23 16:29:58 +00004108 // {} in inline assembly are neon specifiers, not assembly variant
4109 // specifiers.
4110 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004111
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004112 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00004113 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004114
Eric Christopher0e261882014-12-05 01:06:59 +00004115 // FIXME: This duplicates code from the driver that sets the -target-abi
4116 // option - this code is used if -target-abi isn't passed and should
4117 // be unified in some way.
4118 if (Triple.isOSBinFormatMachO()) {
4119 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4120 // the frontend matches that.
4121 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4122 Triple.getOS() == llvm::Triple::UnknownOS ||
4123 StringRef(CPU).startswith("cortex-m")) {
4124 setABI("aapcs");
4125 } else {
4126 setABI("apcs-gnu");
4127 }
4128 } else if (Triple.isOSWindows()) {
4129 // FIXME: this is invalid for WindowsCE
4130 setABI("aapcs");
4131 } else {
4132 // Select the default based on the platform.
4133 switch (Triple.getEnvironment()) {
4134 case llvm::Triple::Android:
4135 case llvm::Triple::GNUEABI:
4136 case llvm::Triple::GNUEABIHF:
4137 setABI("aapcs-linux");
4138 break;
4139 case llvm::Triple::EABIHF:
4140 case llvm::Triple::EABI:
4141 setABI("aapcs");
4142 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004143 case llvm::Triple::GNU:
4144 setABI("apcs-gnu");
4145 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004146 default:
4147 if (Triple.getOS() == llvm::Triple::NetBSD)
4148 setABI("apcs-gnu");
4149 else
4150 setABI("aapcs");
4151 break;
4152 }
4153 }
John McCall86353412010-08-21 22:46:04 +00004154
4155 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004156 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004157
4158 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004159 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00004160 if (shouldUseInlineAtomic(getTriple()))
4161 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00004162
4163 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004164 // the alignment of the zero-length bitfield is greater than the member
4165 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004166 // zero length bitfield.
4167 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004168 }
Alp Toker4925ba72014-06-07 23:30:42 +00004169 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00004170 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004171 ABI = Name;
4172
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004173 // The defaults (above) are for AAPCS, check if we need to change them.
4174 //
4175 // FIXME: We need support for -meabi... we could just mangle it into the
4176 // name.
4177 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004178 setABIAPCS();
4179 return true;
4180 }
4181 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4182 setABIAAPCS();
4183 return true;
4184 }
4185 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004186 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004187
Renato Golinf5c4dec2015-05-27 13:33:00 +00004188 // FIXME: This should be based on Arch attributes, not CPU names.
Craig Topper3164f332014-03-11 03:39:26 +00004189 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Silviu Barangae5690462013-10-21 10:59:33 +00004190 StringRef ArchName = getTriple().getArchName();
Renato Golinf5c4dec2015-05-27 13:33:00 +00004191 unsigned ArchKind =
4192 llvm::ARMTargetParser::parseArch(
4193 llvm::ARMTargetParser::getCanonicalArchName(ArchName));
4194 bool IsV8 = (ArchKind == llvm::ARM::AK_ARMV8A ||
4195 ArchKind == llvm::ARM::AK_ARMV8_1A);
4196
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004197 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
4198 Features["vfp2"] = true;
Charlie Turner2919cbd2014-11-06 14:59:30 +00004199 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
Renato Golineefb5772013-09-13 17:02:45 +00004200 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004201 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00004202 }
4203 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004204 Features["vfp4"] = true;
4205 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00004206 } else if (CPU == "swift" || CPU == "cortex-a7" ||
4207 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00004208 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00004209 Features["vfp4"] = true;
4210 Features["neon"] = true;
4211 Features["hwdiv"] = true;
4212 Features["hwdiv-arm"] = true;
Tim Northoverf9b517c2015-05-01 21:17:25 +00004213 } else if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
4214 CPU == "cortex-a72") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004215 Features["fp-armv8"] = true;
4216 Features["neon"] = true;
4217 Features["hwdiv"] = true;
4218 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00004219 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00004220 Features["crypto"] = true;
Renato Golinf5c4dec2015-05-27 13:33:00 +00004221 } else if (CPU == "cortex-r5" || CPU == "cortex-r7" || IsV8) {
Silviu Barangae5690462013-10-21 10:59:33 +00004222 Features["hwdiv"] = true;
4223 Features["hwdiv-arm"] = true;
Bradley Smithd86d6702015-02-18 10:34:48 +00004224 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7" ||
Javed Absar879d18b82015-04-09 14:12:10 +00004225 CPU == "sc300" || CPU == "cortex-r4" || CPU == "cortex-r4f") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00004226 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004227 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004228 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004229
Craig Topper3164f332014-03-11 03:39:26 +00004230 bool handleTargetFeatures(std::vector<std::string> &Features,
4231 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004232 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004233 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004234 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004235 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004236 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004237
4238 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004239 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004240 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004241 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004242 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004243 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004244 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004245 HW_FP = HW_FP_SP | HW_FP_DP;
4246 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004247 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004248 HW_FP = HW_FP_SP | HW_FP_DP;
4249 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004250 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004251 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4252 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004253 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004254 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4255 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004256 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004257 HW_FP = HW_FP_SP | HW_FP_DP;
4258 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004259 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004260 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004261 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004262 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004263 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004264 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004265 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004266 } else if (Feature == "+fp-only-sp") {
4267 HW_FP &= ~HW_FP_DP;
4268 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004269 }
4270
Rafael Espindolaeb265472013-08-21 21:59:03 +00004271 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4272 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4273 return false;
4274 }
4275
4276 if (FPMath == FP_Neon)
4277 Features.push_back("+neonfp");
4278 else if (FPMath == FP_VFP)
4279 Features.push_back("-neonfp");
4280
Daniel Dunbar893d4752009-12-19 04:15:38 +00004281 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004282 auto Feature =
4283 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4284 if (Feature != Features.end())
4285 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004286
Rafael Espindolaeb265472013-08-21 21:59:03 +00004287 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004288 }
4289
Craig Topper3164f332014-03-11 03:39:26 +00004290 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004291 return llvm::StringSwitch<bool>(Feature)
4292 .Case("arm", true)
4293 .Case("softfloat", SoftFloat)
4294 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004295 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004296 .Case("hwdiv", HWDiv & HWDivThumb)
4297 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004298 .Default(false);
4299 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00004300 const char *getCPUDefineSuffix(StringRef Name) const {
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00004301 if(Name == "generic") {
4302 auto subarch = getTriple().getSubArch();
4303 switch (subarch) {
4304 case llvm::Triple::SubArchType::ARMSubArch_v8_1a:
4305 return "8_1A";
4306 default:
4307 break;
4308 }
4309 }
4310
Renato Golin391544c2015-05-28 12:11:11 +00004311 unsigned ArchKind = llvm::ARMTargetParser::parseCPUArch(Name);
4312 if (ArchKind == llvm::ARM::AK_INVALID)
4313 return "";
4314
4315 // For most sub-arches, the build attribute CPU name is enough.
4316 // For Cortex variants, it's slightly different.
4317 switch(ArchKind) {
4318 default:
4319 return llvm::ARMTargetParser::getCPUAttr(ArchKind);
4320 case llvm::ARM::AK_ARMV6M:
4321 case llvm::ARM::AK_ARMV6SM:
4322 return "6M";
4323 case llvm::ARM::AK_ARMV7:
4324 case llvm::ARM::AK_ARMV7A:
Tim Northovera8c168d2015-05-29 21:28:25 +00004325 case llvm::ARM::AK_ARMV7S:
Renato Golin391544c2015-05-28 12:11:11 +00004326 return "7A";
4327 case llvm::ARM::AK_ARMV7R:
4328 return "7R";
4329 case llvm::ARM::AK_ARMV7M:
4330 return "7M";
4331 case llvm::ARM::AK_ARMV7EM:
4332 return "7EM";
4333 case llvm::ARM::AK_ARMV8A:
4334 return "8A";
4335 case llvm::ARM::AK_ARMV8_1A:
4336 return "8_1A";
4337 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004338 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00004339 const char *getCPUProfile(StringRef Name) const {
4340 if(Name == "generic") {
4341 auto subarch = getTriple().getSubArch();
4342 switch (subarch) {
4343 case llvm::Triple::SubArchType::ARMSubArch_v8_1a:
4344 return "A";
4345 default:
4346 break;
4347 }
4348 }
4349
Renato Golinf05bf002015-05-27 14:15:12 +00004350 unsigned CPUArch = llvm::ARMTargetParser::parseCPUArch(Name);
4351 if (CPUArch == llvm::ARM::AK_INVALID)
4352 return "";
4353
4354 StringRef ArchName = llvm::ARMTargetParser::getArchName(CPUArch);
4355 switch(llvm::ARMTargetParser::parseArchProfile(ArchName)) {
4356 case llvm::ARM::PK_A:
4357 return "A";
4358 case llvm::ARM::PK_R:
4359 return "R";
4360 case llvm::ARM::PK_M:
4361 return "M";
4362 default:
4363 return "";
4364 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004365 }
Craig Topper3164f332014-03-11 03:39:26 +00004366 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004367 if (!getCPUDefineSuffix(Name))
4368 return false;
4369
Tim Northovere8c37212014-07-09 09:24:43 +00004370 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4371 StringRef Profile = getCPUProfile(Name);
4372 if (Profile == "M" && MaxAtomicInlineWidth) {
4373 MaxAtomicPromoteWidth = 32;
4374 MaxAtomicInlineWidth = 32;
4375 }
4376
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004377 CPU = Name;
4378 return true;
4379 }
Craig Topper3164f332014-03-11 03:39:26 +00004380 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004381 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4382 unsigned CPUArchVer) const {
4383 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4384 (CPUArch.find('M') != StringRef::npos);
4385 }
4386 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4387 unsigned CPUArchVer) const {
4388 // We check both CPUArchVer and ArchName because when only triple is
4389 // specified, the default CPU is arm1136j-s.
4390 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00004391 ArchName.endswith("v8.1a") ||
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004392 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4393 }
Craig Topper3164f332014-03-11 03:39:26 +00004394 void getTargetDefines(const LangOptions &Opts,
4395 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004396 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004397 Builder.defineMacro("__arm");
4398 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004399
Chris Lattnerecd49032009-03-02 22:27:17 +00004400 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004401 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004402
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004403 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004404 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004405 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004406 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004407 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004408
4409 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004410 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004411 StringRef ArchName = getTriple().getArchName();
4412
4413 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4414 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
Eric Christopher917e9522014-11-18 22:36:15 +00004415 if (CPUArch[0] >= '8') {
4416 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4417 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
James Molloy0ffb0932014-09-15 11:25:38 +00004418 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004419
4420 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4421 // is not defined for the M-profile.
4422 // NOTE that the deffault profile is assumed to be 'A'
4423 if (CPUProfile.empty() || CPUProfile != "M")
4424 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4425
4426 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4427 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4428 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4429 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4430 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4431 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4432 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4433
4434 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4435 // instruction set such as ARM or Thumb.
4436 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4437
4438 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4439
4440 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004441 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004442 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004443
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004444 // ACLE 6.5.1 Hardware Floating Point
4445 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004446 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004447
Yi Konga44c4d72014-06-27 21:25:42 +00004448 // ACLE predefines.
4449 Builder.defineMacro("__ARM_ACLE", "200");
4450
Mike Stump9d54bd72009-04-08 02:07:04 +00004451 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004452
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004453 // FIXME: It's more complicated than this and we don't really support
4454 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004455 // Windows on ARM does not "support" interworking
4456 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004457 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004458
David Tweed8f676532012-10-25 13:33:01 +00004459 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004460 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004461 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4462 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004463 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004464 Builder.defineMacro("__ARM_PCS", "1");
4465
David Tweed8f676532012-10-25 13:33:01 +00004466 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004467 Builder.defineMacro("__ARM_PCS_VFP", "1");
4468 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004469
Daniel Dunbar893d4752009-12-19 04:15:38 +00004470 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004471 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004472
4473 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004474 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004475
4476 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004477 Builder.defineMacro("__THUMBEL__");
4478 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004479 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004480 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004481 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004482 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4483 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004484
4485 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004486 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004487
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004488 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004489 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004490 if (FPU & VFP2FPU)
4491 Builder.defineMacro("__ARM_VFPV2__");
4492 if (FPU & VFP3FPU)
4493 Builder.defineMacro("__ARM_VFPV3__");
4494 if (FPU & VFP4FPU)
4495 Builder.defineMacro("__ARM_VFPV4__");
4496 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004497
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004498 // This only gets set when Neon instructions are actually available, unlike
4499 // the VFP define, hence the soft float and arch check. This is subtly
4500 // different from gcc, we follow the intent which was that it should be set
4501 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004502 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4503 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004504 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004505 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004506
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004507 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4508 Opts.ShortWChar ? "2" : "4");
4509
4510 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4511 Opts.ShortEnums ? "1" : "4");
4512
Bernard Ogden18b57012013-10-29 09:47:51 +00004513 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004514 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004515
Tim Northover02e38602014-02-03 17:28:04 +00004516 if (Crypto)
4517 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4518
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004519 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004520 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4521 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4522 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4523 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4524 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004525
4526 bool is5EOrAbove = (CPUArchVer >= 6 ||
4527 (CPUArchVer == 5 &&
4528 CPUArch.find('E') != StringRef::npos));
4529 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4530 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4531 Builder.defineMacro("__ARM_FEATURE_DSP");
Chris Lattner17df24e2008-04-21 18:56:49 +00004532 }
Craig Topper3164f332014-03-11 03:39:26 +00004533 void getTargetBuiltins(const Builtin::Info *&Records,
4534 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004535 Records = BuiltinInfo;
4536 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004537 }
Craig Topper3164f332014-03-11 03:39:26 +00004538 bool isCLZForZeroUndef() const override { return false; }
4539 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004540 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004541 }
Craig Topper3164f332014-03-11 03:39:26 +00004542 void getGCCRegNames(const char * const *&Names,
4543 unsigned &NumNames) const override;
4544 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4545 unsigned &NumAliases) const override;
4546 bool validateAsmConstraint(const char *&Name,
4547 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004548 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004549 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004550 case 'l': // r0-r7
4551 case 'h': // r8-r15
4552 case 'w': // VFP Floating point register single precision
4553 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004554 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004555 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004556 case 'I':
4557 case 'J':
4558 case 'K':
4559 case 'L':
4560 case 'M':
4561 // FIXME
4562 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004563 case 'Q': // A memory address that is a single base register.
4564 Info.setAllowsMemory();
4565 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004566 case 'U': // a memory reference...
4567 switch (Name[1]) {
4568 case 'q': // ...ARMV4 ldrsb
4569 case 'v': // ...VFP load/store (reg+constant offset)
4570 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004571 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004572 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004573 case 'n': // valid address for Neon doubleword vector load/store
4574 case 'm': // valid address for Neon element and structure load/store
4575 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004576 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004577 Info.setAllowsMemory();
4578 Name++;
4579 return true;
4580 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004581 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004582 return false;
4583 }
Craig Topper3164f332014-03-11 03:39:26 +00004584 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004585 std::string R;
4586 switch (*Constraint) {
4587 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004588 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004589 Constraint++;
4590 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004591 case 'p': // 'p' should be translated to 'r' by default.
4592 R = std::string("r");
4593 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004594 default:
4595 return std::string(1, *Constraint);
4596 }
4597 return R;
4598 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004599 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004600 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004601 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004602 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004603 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004604
Bill Wendling9d1ee112012-10-25 23:28:48 +00004605 // Strip off constraint modifiers.
4606 while (Constraint[0] == '=' ||
4607 Constraint[0] == '+' ||
4608 Constraint[0] == '&')
4609 Constraint = Constraint.substr(1);
4610
4611 switch (Constraint[0]) {
4612 default: break;
4613 case 'r': {
4614 switch (Modifier) {
4615 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004616 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004617 case 'q':
4618 // A register of size 32 cannot fit a vector type.
4619 return false;
4620 }
4621 }
4622 }
4623
4624 return true;
4625 }
Craig Topper3164f332014-03-11 03:39:26 +00004626 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004627 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004628 return "";
4629 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004630
Craig Topper3164f332014-03-11 03:39:26 +00004631 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004632 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4633 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004634
Craig Topper3164f332014-03-11 03:39:26 +00004635 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004636 if (RegNo == 0) return 0;
4637 if (RegNo == 1) return 1;
4638 return -1;
4639 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004640};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004641
Rafael Espindolaeb265472013-08-21 21:59:03 +00004642bool ARMTargetInfo::setFPMath(StringRef Name) {
4643 if (Name == "neon") {
4644 FPMath = FP_Neon;
4645 return true;
4646 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4647 Name == "vfp4") {
4648 FPMath = FP_VFP;
4649 return true;
4650 }
4651 return false;
4652}
4653
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004654const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004655 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004656 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004657 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4658
4659 // Float registers
4660 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4661 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4662 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004663 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004664
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004665 // Double registers
4666 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4667 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004668 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4669 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004670
4671 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004672 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4673 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004674};
4675
4676void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004677 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004678 Names = GCCRegNames;
4679 NumNames = llvm::array_lengthof(GCCRegNames);
4680}
4681
4682const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004683 { { "a1" }, "r0" },
4684 { { "a2" }, "r1" },
4685 { { "a3" }, "r2" },
4686 { { "a4" }, "r3" },
4687 { { "v1" }, "r4" },
4688 { { "v2" }, "r5" },
4689 { { "v3" }, "r6" },
4690 { { "v4" }, "r7" },
4691 { { "v5" }, "r8" },
4692 { { "v6", "rfp" }, "r9" },
4693 { { "sl" }, "r10" },
4694 { { "fp" }, "r11" },
4695 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004696 { { "r13" }, "sp" },
4697 { { "r14" }, "lr" },
4698 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004699 // The S, D and Q registers overlap, but aren't really aliases; we
4700 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004701};
4702
4703void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4704 unsigned &NumAliases) const {
4705 Aliases = GCCRegAliases;
4706 NumAliases = llvm::array_lengthof(GCCRegAliases);
4707}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004708
4709const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004710#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004711#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004712 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004713#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004714
4715#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004716#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004717#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4718 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004719#include "clang/Basic/BuiltinsARM.def"
4720};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004721
4722class ARMleTargetInfo : public ARMTargetInfo {
4723public:
4724 ARMleTargetInfo(const llvm::Triple &Triple)
4725 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004726 void getTargetDefines(const LangOptions &Opts,
4727 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004728 Builder.defineMacro("__ARMEL__");
4729 ARMTargetInfo::getTargetDefines(Opts, Builder);
4730 }
4731};
4732
4733class ARMbeTargetInfo : public ARMTargetInfo {
4734public:
4735 ARMbeTargetInfo(const llvm::Triple &Triple)
4736 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004737 void getTargetDefines(const LangOptions &Opts,
4738 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004739 Builder.defineMacro("__ARMEB__");
4740 Builder.defineMacro("__ARM_BIG_ENDIAN");
4741 ARMTargetInfo::getTargetDefines(Opts, Builder);
4742 }
4743};
Chris Lattner17df24e2008-04-21 18:56:49 +00004744
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004745class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4746 const llvm::Triple Triple;
4747public:
4748 WindowsARMTargetInfo(const llvm::Triple &Triple)
4749 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4750 TLSSupported = false;
4751 WCharType = UnsignedShort;
4752 SizeType = UnsignedInt;
4753 UserLabelPrefix = "";
4754 }
4755 void getVisualStudioDefines(const LangOptions &Opts,
4756 MacroBuilder &Builder) const {
4757 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4758
4759 // FIXME: this is invalid for WindowsCE
4760 Builder.defineMacro("_M_ARM_NT", "1");
4761 Builder.defineMacro("_M_ARMT", "_M_ARM");
4762 Builder.defineMacro("_M_THUMB", "_M_ARM");
4763
4764 assert((Triple.getArch() == llvm::Triple::arm ||
4765 Triple.getArch() == llvm::Triple::thumb) &&
4766 "invalid architecture for Windows ARM target info");
4767 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4768 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4769
4770 // TODO map the complete set of values
4771 // 31: VFPv3 40: VFPv4
4772 Builder.defineMacro("_M_ARM_FP", "31");
4773 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004774 BuiltinVaListKind getBuiltinVaListKind() const override {
4775 return TargetInfo::CharPtrBuiltinVaList;
4776 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004777};
4778
4779// Windows ARM + Itanium C++ ABI Target
4780class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4781public:
4782 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4783 : WindowsARMTargetInfo(Triple) {
4784 TheCXXABI.set(TargetCXXABI::GenericARM);
4785 }
4786
4787 void getTargetDefines(const LangOptions &Opts,
4788 MacroBuilder &Builder) const override {
4789 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4790
4791 if (Opts.MSVCCompat)
4792 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4793 }
4794};
4795
4796// Windows ARM, MS (C++) ABI
4797class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4798public:
4799 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4800 : WindowsARMTargetInfo(Triple) {
4801 TheCXXABI.set(TargetCXXABI::Microsoft);
4802 }
4803
4804 void getTargetDefines(const LangOptions &Opts,
4805 MacroBuilder &Builder) const override {
4806 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4807 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4808 }
4809};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004810
Mike Stump11289f42009-09-09 15:08:12 +00004811class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004812 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004813protected:
Craig Topper3164f332014-03-11 03:39:26 +00004814 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4815 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004816 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004817 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004818
Torok Edwinb2b37c62009-06-30 17:10:35 +00004819public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004820 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004821 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004822 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004823 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00004824 // FIXME: This should be based off of the target features in
4825 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004826 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004827
4828 // Darwin on iOS uses a variant of the ARM C++ ABI.
4829 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004830 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004831};
Eli Friedmanf05b7722008-08-20 07:44:10 +00004832
Tim Northover573cbee2014-05-24 12:52:07 +00004833class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004834 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004835 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4836 static const char *const GCCRegNames[];
4837
James Molloy75f5f9e2014-04-16 15:33:48 +00004838 enum FPUModeEnum {
4839 FPUMode,
4840 NeonMode
4841 };
4842
4843 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004844 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004845 unsigned Crypto;
4846
Tim Northovera2ee4332014-03-29 15:09:45 +00004847 static const Builtin::Info BuiltinInfo[];
4848
4849 std::string ABI;
4850
4851public:
Tim Northover573cbee2014-05-24 12:52:07 +00004852 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004853 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004854
4855 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4856 WCharType = SignedInt;
4857
4858 // NetBSD apparently prefers consistency across ARM targets to consistency
4859 // across 64-bit targets.
4860 Int64Type = SignedLongLong;
4861 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004862 } else {
4863 WCharType = UnsignedInt;
4864 Int64Type = SignedLong;
4865 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004866 }
4867
Tim Northovera2ee4332014-03-29 15:09:45 +00004868 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004869 MaxVectorAlign = 128;
4870 RegParmMax = 8;
4871 MaxAtomicInlineWidth = 128;
4872 MaxAtomicPromoteWidth = 128;
4873
Tim Northovera6a19f12015-02-06 01:25:07 +00004874 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00004875 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4876
Tim Northovera2ee4332014-03-29 15:09:45 +00004877 // {} in inline assembly are neon specifiers, not assembly variant
4878 // specifiers.
4879 NoAsmVariants = true;
4880
Tim Northover7ad87af2015-01-16 18:44:04 +00004881 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
4882 // contributes to the alignment of the containing aggregate in the same way
4883 // a plain (non bit-field) member of that type would, without exception for
4884 // zero-sized or anonymous bit-fields."
4885 UseBitFieldTypeAlignment = true;
4886 UseZeroLengthBitfieldAlignment = true;
4887
Tim Northover573cbee2014-05-24 12:52:07 +00004888 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004889 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4890 }
4891
Alp Toker4925ba72014-06-07 23:30:42 +00004892 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00004893 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004894 if (Name != "aapcs" && Name != "darwinpcs")
4895 return false;
4896
4897 ABI = Name;
4898 return true;
4899 }
4900
David Blaikie1cbb9712014-11-14 19:09:44 +00004901 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004902 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004903 .Case("generic", true)
Renato Golin84545d72015-02-04 13:31:56 +00004904 .Cases("cortex-a53", "cortex-a57", "cortex-a72", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004905 .Case("cyclone", true)
4906 .Default(false);
4907 return CPUKnown;
4908 }
4909
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004910 void getTargetDefines(const LangOptions &Opts,
4911 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004912 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004913 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004914
4915 // Target properties.
4916 Builder.defineMacro("_LP64");
4917 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004918
4919 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4920 Builder.defineMacro("__ARM_ACLE", "200");
4921 Builder.defineMacro("__ARM_ARCH", "8");
4922 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4923
4924 Builder.defineMacro("__ARM_64BIT_STATE");
4925 Builder.defineMacro("__ARM_PCS_AAPCS64");
4926 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4927
4928 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4929 Builder.defineMacro("__ARM_FEATURE_CLZ");
4930 Builder.defineMacro("__ARM_FEATURE_FMA");
4931 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004932 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4933 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4934 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4935 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004936
4937 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4938
4939 // 0xe implies support for half, single and double precision operations.
4940 Builder.defineMacro("__ARM_FP", "0xe");
4941
4942 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4943 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4944 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4945
4946 if (Opts.FastMath || Opts.FiniteMathOnly)
4947 Builder.defineMacro("__ARM_FP_FAST");
4948
Richard Smithab506ad2014-10-20 23:26:58 +00004949 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004950 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4951
4952 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4953
4954 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4955 Opts.ShortEnums ? "1" : "4");
4956
James Molloy75f5f9e2014-04-16 15:33:48 +00004957 if (FPU == NeonMode) {
4958 Builder.defineMacro("__ARM_NEON");
4959 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004960 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004961 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004962
Bradley Smith418c5932014-05-02 15:17:51 +00004963 if (CRC)
4964 Builder.defineMacro("__ARM_FEATURE_CRC32");
4965
James Molloy75f5f9e2014-04-16 15:33:48 +00004966 if (Crypto)
4967 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Reid Klecknerd167d422015-05-06 15:31:46 +00004968
4969 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
4970 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4971 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4972 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4973 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00004974 }
4975
Alexander Kornienko34eb2072015-04-11 02:00:23 +00004976 void getTargetBuiltins(const Builtin::Info *&Records,
4977 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004978 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004979 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004980 }
4981
David Blaikie1cbb9712014-11-14 19:09:44 +00004982 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004983 return Feature == "aarch64" ||
4984 Feature == "arm64" ||
4985 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004986 }
4987
James Molloy5e73df52014-04-16 15:06:20 +00004988 bool handleTargetFeatures(std::vector<std::string> &Features,
4989 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004990 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004991 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004992 Crypto = 0;
4993 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4994 if (Features[i] == "+neon")
4995 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004996 if (Features[i] == "+crc")
4997 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004998 if (Features[i] == "+crypto")
4999 Crypto = 1;
5000 }
5001
James Molloy5e73df52014-04-16 15:06:20 +00005002 setDescriptionString();
5003
5004 return true;
5005 }
5006
David Blaikie1cbb9712014-11-14 19:09:44 +00005007 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005008
David Blaikie1cbb9712014-11-14 19:09:44 +00005009 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005010 return TargetInfo::AArch64ABIBuiltinVaList;
5011 }
5012
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005013 void getGCCRegNames(const char *const *&Names,
5014 unsigned &NumNames) const override;
5015 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5016 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005017
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005018 bool validateAsmConstraint(const char *&Name,
5019 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005020 switch (*Name) {
5021 default:
5022 return false;
5023 case 'w': // Floating point and SIMD registers (V0-V31)
5024 Info.setAllowsRegister();
5025 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005026 case 'I': // Constant that can be used with an ADD instruction
5027 case 'J': // Constant that can be used with a SUB instruction
5028 case 'K': // Constant that can be used with a 32-bit logical instruction
5029 case 'L': // Constant that can be used with a 64-bit logical instruction
5030 case 'M': // Constant that can be used as a 32-bit MOV immediate
5031 case 'N': // Constant that can be used as a 64-bit MOV immediate
5032 case 'Y': // Floating point constant zero
5033 case 'Z': // Integer constant zero
5034 return true;
5035 case 'Q': // A memory reference with base register and no offset
5036 Info.setAllowsMemory();
5037 return true;
5038 case 'S': // A symbolic address
5039 Info.setAllowsRegister();
5040 return true;
5041 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005042 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5043 // Utf: A memory address suitable for ldp/stp in TF mode.
5044 // Usa: An absolute symbolic address.
5045 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5046 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005047 case 'z': // Zero register, wzr or xzr
5048 Info.setAllowsRegister();
5049 return true;
5050 case 'x': // Floating point and SIMD registers (V0-V15)
5051 Info.setAllowsRegister();
5052 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005053 }
5054 return false;
5055 }
5056
Akira Hatanaka987f1862014-08-22 06:05:21 +00005057 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005058 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005059 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005060 // Strip off constraint modifiers.
5061 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5062 Constraint = Constraint.substr(1);
5063
5064 switch (Constraint[0]) {
5065 default:
5066 return true;
5067 case 'z':
5068 case 'r': {
5069 switch (Modifier) {
5070 case 'x':
5071 case 'w':
5072 // For now assume that the person knows what they're
5073 // doing with the modifier.
5074 return true;
5075 default:
5076 // By default an 'r' constraint will be in the 'x'
5077 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005078 if (Size == 64)
5079 return true;
5080
5081 SuggestedModifier = "w";
5082 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005083 }
5084 }
5085 }
5086 }
5087
David Blaikie1cbb9712014-11-14 19:09:44 +00005088 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005089
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005090 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005091 if (RegNo == 0)
5092 return 0;
5093 if (RegNo == 1)
5094 return 1;
5095 return -1;
5096 }
5097};
5098
Tim Northover573cbee2014-05-24 12:52:07 +00005099const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005100 // 32-bit Integer registers
5101 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5102 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5103 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5104
5105 // 64-bit Integer registers
5106 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5107 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5108 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5109
5110 // 32-bit floating point regsisters
5111 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5112 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5113 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5114
5115 // 64-bit floating point regsisters
5116 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5117 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5118 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5119
5120 // Vector registers
5121 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5122 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5123 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5124};
5125
Tim Northover573cbee2014-05-24 12:52:07 +00005126void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00005127 unsigned &NumNames) const {
5128 Names = GCCRegNames;
5129 NumNames = llvm::array_lengthof(GCCRegNames);
5130}
5131
Tim Northover573cbee2014-05-24 12:52:07 +00005132const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005133 { { "w31" }, "wsp" },
5134 { { "x29" }, "fp" },
5135 { { "x30" }, "lr" },
5136 { { "x31" }, "sp" },
5137 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5138 // don't want to substitute one of these for a different-sized one.
5139};
5140
Tim Northover573cbee2014-05-24 12:52:07 +00005141void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00005142 unsigned &NumAliases) const {
5143 Aliases = GCCRegAliases;
5144 NumAliases = llvm::array_lengthof(GCCRegAliases);
5145}
5146
Tim Northover573cbee2014-05-24 12:52:07 +00005147const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005148#define BUILTIN(ID, TYPE, ATTRS) \
5149 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5150#include "clang/Basic/BuiltinsNEON.def"
5151
5152#define BUILTIN(ID, TYPE, ATTRS) \
5153 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00005154#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005155};
James Molloy5e73df52014-04-16 15:06:20 +00005156
Tim Northover573cbee2014-05-24 12:52:07 +00005157class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005158 void setDescriptionString() override {
5159 if (getTriple().isOSBinFormatMachO())
5160 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
5161 else
5162 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
5163 }
5164
5165public:
Tim Northover573cbee2014-05-24 12:52:07 +00005166 AArch64leTargetInfo(const llvm::Triple &Triple)
5167 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005168 BigEndian = false;
5169 }
5170 void getTargetDefines(const LangOptions &Opts,
5171 MacroBuilder &Builder) const override {
5172 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005173 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005174 }
5175};
5176
Tim Northover573cbee2014-05-24 12:52:07 +00005177class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00005178 void setDescriptionString() override {
5179 assert(!getTriple().isOSBinFormatMachO());
5180 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
5181 }
5182
5183public:
Tim Northover573cbee2014-05-24 12:52:07 +00005184 AArch64beTargetInfo(const llvm::Triple &Triple)
5185 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005186 void getTargetDefines(const LangOptions &Opts,
5187 MacroBuilder &Builder) const override {
5188 Builder.defineMacro("__AARCH64EB__");
5189 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5190 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005191 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005192 }
5193};
Tim Northovera2ee4332014-03-29 15:09:45 +00005194
Tim Northover573cbee2014-05-24 12:52:07 +00005195class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005196protected:
5197 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5198 MacroBuilder &Builder) const override {
5199 Builder.defineMacro("__AARCH64_SIMD__");
5200 Builder.defineMacro("__ARM64_ARCH_8__");
5201 Builder.defineMacro("__ARM_NEON__");
5202 Builder.defineMacro("__LITTLE_ENDIAN__");
5203 Builder.defineMacro("__REGISTER_PREFIX__", "");
5204 Builder.defineMacro("__arm64", "1");
5205 Builder.defineMacro("__arm64__", "1");
5206
5207 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5208 }
5209
Tim Northovera2ee4332014-03-29 15:09:45 +00005210public:
Tim Northover573cbee2014-05-24 12:52:07 +00005211 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5212 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005213 Int64Type = SignedLongLong;
5214 WCharType = SignedInt;
5215 UseSignedCharForObjCBool = false;
5216
Tim Northovera6a19f12015-02-06 01:25:07 +00005217 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005218 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5219
5220 TheCXXABI.set(TargetCXXABI::iOS64);
5221 }
5222
David Blaikie1cbb9712014-11-14 19:09:44 +00005223 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005224 return TargetInfo::CharPtrBuiltinVaList;
5225 }
5226};
Tim Northovera2ee4332014-03-29 15:09:45 +00005227
Tony Linthicum76329bf2011-12-12 21:14:55 +00005228// Hexagon abstract base class
5229class HexagonTargetInfo : public TargetInfo {
5230 static const Builtin::Info BuiltinInfo[];
5231 static const char * const GCCRegNames[];
5232 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5233 std::string CPU;
5234public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005235 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005236 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005237 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00005238
5239 // {} in inline assembly are packet specifiers, not assembly variant
5240 // specifiers.
5241 NoAsmVariants = true;
5242 }
5243
Craig Topper3164f332014-03-11 03:39:26 +00005244 void getTargetBuiltins(const Builtin::Info *&Records,
5245 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005246 Records = BuiltinInfo;
5247 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5248 }
5249
Craig Topper3164f332014-03-11 03:39:26 +00005250 bool validateAsmConstraint(const char *&Name,
5251 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005252 return true;
5253 }
5254
Craig Topper3164f332014-03-11 03:39:26 +00005255 void getTargetDefines(const LangOptions &Opts,
5256 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005257
Craig Topper3164f332014-03-11 03:39:26 +00005258 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005259 return Feature == "hexagon";
5260 }
Craig Topper3164f332014-03-11 03:39:26 +00005261
5262 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005263 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005264 }
Craig Topper3164f332014-03-11 03:39:26 +00005265 void getGCCRegNames(const char * const *&Names,
5266 unsigned &NumNames) const override;
5267 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5268 unsigned &NumAliases) const override;
5269 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005270 return "";
5271 }
Sebastian Pop86500282012-01-13 20:37:10 +00005272
5273 static const char *getHexagonCPUSuffix(StringRef Name) {
5274 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005275 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005276 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00005277 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005278 }
5279
Craig Topper3164f332014-03-11 03:39:26 +00005280 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005281 if (!getHexagonCPUSuffix(Name))
5282 return false;
5283
Tony Linthicum76329bf2011-12-12 21:14:55 +00005284 CPU = Name;
5285 return true;
5286 }
5287};
5288
5289void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5290 MacroBuilder &Builder) const {
5291 Builder.defineMacro("qdsp6");
5292 Builder.defineMacro("__qdsp6", "1");
5293 Builder.defineMacro("__qdsp6__", "1");
5294
5295 Builder.defineMacro("hexagon");
5296 Builder.defineMacro("__hexagon", "1");
5297 Builder.defineMacro("__hexagon__", "1");
5298
5299 if(CPU == "hexagonv1") {
5300 Builder.defineMacro("__HEXAGON_V1__");
5301 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5302 if(Opts.HexagonQdsp6Compat) {
5303 Builder.defineMacro("__QDSP6_V1__");
5304 Builder.defineMacro("__QDSP6_ARCH__", "1");
5305 }
5306 }
5307 else if(CPU == "hexagonv2") {
5308 Builder.defineMacro("__HEXAGON_V2__");
5309 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5310 if(Opts.HexagonQdsp6Compat) {
5311 Builder.defineMacro("__QDSP6_V2__");
5312 Builder.defineMacro("__QDSP6_ARCH__", "2");
5313 }
5314 }
5315 else if(CPU == "hexagonv3") {
5316 Builder.defineMacro("__HEXAGON_V3__");
5317 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5318 if(Opts.HexagonQdsp6Compat) {
5319 Builder.defineMacro("__QDSP6_V3__");
5320 Builder.defineMacro("__QDSP6_ARCH__", "3");
5321 }
5322 }
5323 else if(CPU == "hexagonv4") {
5324 Builder.defineMacro("__HEXAGON_V4__");
5325 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5326 if(Opts.HexagonQdsp6Compat) {
5327 Builder.defineMacro("__QDSP6_V4__");
5328 Builder.defineMacro("__QDSP6_ARCH__", "4");
5329 }
5330 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005331 else if(CPU == "hexagonv5") {
5332 Builder.defineMacro("__HEXAGON_V5__");
5333 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5334 if(Opts.HexagonQdsp6Compat) {
5335 Builder.defineMacro("__QDSP6_V5__");
5336 Builder.defineMacro("__QDSP6_ARCH__", "5");
5337 }
5338 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005339}
5340
5341const char * const HexagonTargetInfo::GCCRegNames[] = {
5342 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5343 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5344 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5345 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5346 "p0", "p1", "p2", "p3",
5347 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5348};
5349
5350void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5351 unsigned &NumNames) const {
5352 Names = GCCRegNames;
5353 NumNames = llvm::array_lengthof(GCCRegNames);
5354}
5355
5356
5357const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5358 { { "sp" }, "r29" },
5359 { { "fp" }, "r30" },
5360 { { "lr" }, "r31" },
5361 };
5362
5363void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5364 unsigned &NumAliases) const {
5365 Aliases = GCCRegAliases;
5366 NumAliases = llvm::array_lengthof(GCCRegAliases);
5367}
5368
5369
5370const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5371#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5372#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5373 ALL_LANGUAGES },
5374#include "clang/Basic/BuiltinsHexagon.def"
5375};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005376
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005377// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5378class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005379 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5380 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005381 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005382public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005383 SparcTargetInfo(const llvm::Triple &Triple)
5384 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005385
Craig Topper3164f332014-03-11 03:39:26 +00005386 bool handleTargetFeatures(std::vector<std::string> &Features,
5387 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005388 // The backend doesn't actually handle soft float yet, but in case someone
5389 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005390 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5391 if (Feature != Features.end()) {
5392 SoftFloat = true;
5393 Features.erase(Feature);
5394 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005395 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005396 }
Craig Topper3164f332014-03-11 03:39:26 +00005397 void getTargetDefines(const LangOptions &Opts,
5398 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005399 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005400 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005401
5402 if (SoftFloat)
5403 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005404 }
Craig Topper3164f332014-03-11 03:39:26 +00005405
5406 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005407 return llvm::StringSwitch<bool>(Feature)
5408 .Case("softfloat", SoftFloat)
5409 .Case("sparc", true)
5410 .Default(false);
5411 }
Craig Topper3164f332014-03-11 03:39:26 +00005412
5413 void getTargetBuiltins(const Builtin::Info *&Records,
5414 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005415 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005416 }
Craig Topper3164f332014-03-11 03:39:26 +00005417 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005418 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005419 }
Craig Topper3164f332014-03-11 03:39:26 +00005420 void getGCCRegNames(const char * const *&Names,
5421 unsigned &NumNames) const override;
5422 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5423 unsigned &NumAliases) const override;
5424 bool validateAsmConstraint(const char *&Name,
5425 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005426 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005427 switch (*Name) {
5428 case 'I': // Signed 13-bit constant
5429 case 'J': // Zero
5430 case 'K': // 32-bit constant with the low 12 bits clear
5431 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5432 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5433 case 'N': // Same as 'K' but zext (required for SIMode)
5434 case 'O': // The constant 4096
5435 return true;
5436 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005437 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005438 }
Craig Topper3164f332014-03-11 03:39:26 +00005439 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005440 // FIXME: Implement!
5441 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005442 }
5443};
5444
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005445const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005446 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5447 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5448 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5449 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5450};
5451
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005452void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5453 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005454 Names = GCCRegNames;
5455 NumNames = llvm::array_lengthof(GCCRegNames);
5456}
5457
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005458const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005459 { { "g0" }, "r0" },
5460 { { "g1" }, "r1" },
5461 { { "g2" }, "r2" },
5462 { { "g3" }, "r3" },
5463 { { "g4" }, "r4" },
5464 { { "g5" }, "r5" },
5465 { { "g6" }, "r6" },
5466 { { "g7" }, "r7" },
5467 { { "o0" }, "r8" },
5468 { { "o1" }, "r9" },
5469 { { "o2" }, "r10" },
5470 { { "o3" }, "r11" },
5471 { { "o4" }, "r12" },
5472 { { "o5" }, "r13" },
5473 { { "o6", "sp" }, "r14" },
5474 { { "o7" }, "r15" },
5475 { { "l0" }, "r16" },
5476 { { "l1" }, "r17" },
5477 { { "l2" }, "r18" },
5478 { { "l3" }, "r19" },
5479 { { "l4" }, "r20" },
5480 { { "l5" }, "r21" },
5481 { { "l6" }, "r22" },
5482 { { "l7" }, "r23" },
5483 { { "i0" }, "r24" },
5484 { { "i1" }, "r25" },
5485 { { "i2" }, "r26" },
5486 { { "i3" }, "r27" },
5487 { { "i4" }, "r28" },
5488 { { "i5" }, "r29" },
5489 { { "i6", "fp" }, "r30" },
5490 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005491};
5492
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005493void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5494 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005495 Aliases = GCCRegAliases;
5496 NumAliases = llvm::array_lengthof(GCCRegAliases);
5497}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005498
5499// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5500class SparcV8TargetInfo : public SparcTargetInfo {
5501public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005502 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005503 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005504 }
5505
Craig Topper3164f332014-03-11 03:39:26 +00005506 void getTargetDefines(const LangOptions &Opts,
5507 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005508 SparcTargetInfo::getTargetDefines(Opts, Builder);
5509 Builder.defineMacro("__sparcv8");
5510 }
5511};
5512
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00005513// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
5514class SparcV8elTargetInfo : public SparcV8TargetInfo {
5515 public:
5516 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
5517 DescriptionString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
5518 BigEndian = false;
5519 }
5520};
5521
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005522// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5523class SparcV9TargetInfo : public SparcTargetInfo {
5524public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005525 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005526 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005527 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005528 // This is an LP64 platform.
5529 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005530
5531 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005532 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005533 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005534 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005535 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005536 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005537
5538 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5539 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5540 LongDoubleWidth = 128;
5541 LongDoubleAlign = 128;
5542 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005543 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005544 }
5545
Craig Topper3164f332014-03-11 03:39:26 +00005546 void getTargetDefines(const LangOptions &Opts,
5547 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005548 SparcTargetInfo::getTargetDefines(Opts, Builder);
5549 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005550 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005551 // Solaris doesn't need these variants, but the BSDs do.
5552 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005553 Builder.defineMacro("__sparc64__");
5554 Builder.defineMacro("__sparc_v9__");
5555 Builder.defineMacro("__sparcv9__");
5556 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005557 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005558
Craig Topper3164f332014-03-11 03:39:26 +00005559 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005560 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5561 .Case("v9", true)
5562 .Case("ultrasparc", true)
5563 .Case("ultrasparc3", true)
5564 .Case("niagara", true)
5565 .Case("niagara2", true)
5566 .Case("niagara3", true)
5567 .Case("niagara4", true)
5568 .Default(false);
5569
5570 // No need to store the CPU yet. There aren't any CPU-specific
5571 // macros to define.
5572 return CPUKnown;
5573 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005574};
5575
Torok Edwinb2b37c62009-06-30 17:10:35 +00005576class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005577public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005578 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5579 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005580 SizeType = UnsignedInt;
5581 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005582 }
5583};
Chris Lattner5ba61f02006-10-14 07:39:34 +00005584
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005585class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005586 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005587 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005588 std::string CPU;
5589 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005590 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00005591
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005592public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005593 SystemZTargetInfo(const llvm::Triple &Triple)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005594 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false), HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00005595 IntMaxType = SignedLong;
5596 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005597 TLSSupported = true;
5598 IntWidth = IntAlign = 32;
5599 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5600 PointerWidth = PointerAlign = 64;
5601 LongDoubleWidth = 128;
5602 LongDoubleAlign = 64;
5603 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00005604 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005605 MinGlobalAlign = 16;
5606 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5607 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5608 }
5609 void getTargetDefines(const LangOptions &Opts,
5610 MacroBuilder &Builder) const override {
5611 Builder.defineMacro("__s390__");
5612 Builder.defineMacro("__s390x__");
5613 Builder.defineMacro("__zarch__");
5614 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005615 if (HasTransactionalExecution)
5616 Builder.defineMacro("__HTM__");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005617 }
5618 void getTargetBuiltins(const Builtin::Info *&Records,
5619 unsigned &NumRecords) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005620 Records = BuiltinInfo;
5621 NumRecords = clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin;
Ulrich Weigand47445072013-05-06 16:26:41 +00005622 }
5623
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005624 void getGCCRegNames(const char *const *&Names,
5625 unsigned &NumNames) const override;
5626 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5627 unsigned &NumAliases) const override {
5628 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005629 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005630 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005631 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005632 bool validateAsmConstraint(const char *&Name,
5633 TargetInfo::ConstraintInfo &info) const override;
5634 const char *getClobbers() const override {
5635 // FIXME: Is this really right?
5636 return "";
5637 }
5638 BuiltinVaListKind getBuiltinVaListKind() const override {
5639 return TargetInfo::SystemZBuiltinVaList;
5640 }
5641 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005642 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005643 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5644 .Case("z10", true)
5645 .Case("z196", true)
5646 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005647 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005648 .Default(false);
5649
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005650 return CPUKnown;
5651 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005652 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5653 if (CPU == "zEC12")
5654 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005655 if (CPU == "z13") {
5656 Features["transactional-execution"] = true;
5657 Features["vector"] = true;
5658 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005659 }
5660
5661 bool handleTargetFeatures(std::vector<std::string> &Features,
5662 DiagnosticsEngine &Diags) override {
5663 HasTransactionalExecution = false;
5664 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
5665 if (Features[i] == "+transactional-execution")
5666 HasTransactionalExecution = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005667 if (Features[i] == "+vector")
5668 HasVector = true;
5669 }
5670 // If we use the vector ABI, vector types are 64-bit aligned.
5671 if (HasVector) {
5672 MaxVectorAlign = 64;
5673 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
5674 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005675 }
5676 return true;
5677 }
5678
5679 bool hasFeature(StringRef Feature) const override {
5680 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00005681 .Case("systemz", true)
5682 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005683 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005684 .Default(false);
5685 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00005686
5687 StringRef getABI() const override {
5688 if (HasVector)
5689 return "vector";
5690 return "";
5691 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00005692};
5693
5694const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
5695#define BUILTIN(ID, TYPE, ATTRS) \
5696 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5697#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005698};
5699
5700const char *const SystemZTargetInfo::GCCRegNames[] = {
5701 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5702 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5703 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5704 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5705};
5706
5707void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5708 unsigned &NumNames) const {
5709 Names = GCCRegNames;
5710 NumNames = llvm::array_lengthof(GCCRegNames);
5711}
5712
5713bool SystemZTargetInfo::
5714validateAsmConstraint(const char *&Name,
5715 TargetInfo::ConstraintInfo &Info) const {
5716 switch (*Name) {
5717 default:
5718 return false;
5719
5720 case 'a': // Address register
5721 case 'd': // Data register (equivalent to 'r')
5722 case 'f': // Floating-point register
5723 Info.setAllowsRegister();
5724 return true;
5725
5726 case 'I': // Unsigned 8-bit constant
5727 case 'J': // Unsigned 12-bit constant
5728 case 'K': // Signed 16-bit constant
5729 case 'L': // Signed 20-bit displacement (on all targets we support)
5730 case 'M': // 0x7fffffff
5731 return true;
5732
5733 case 'Q': // Memory with base and unsigned 12-bit displacement
5734 case 'R': // Likewise, plus an index
5735 case 'S': // Memory with base and signed 20-bit displacement
5736 case 'T': // Likewise, plus an index
5737 Info.setAllowsMemory();
5738 return true;
5739 }
5740}
Ulrich Weigand47445072013-05-06 16:26:41 +00005741
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005742 class MSP430TargetInfo : public TargetInfo {
5743 static const char * const GCCRegNames[];
5744 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005745 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005746 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005747 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005748 IntWidth = 16; IntAlign = 16;
5749 LongWidth = 32; LongLongWidth = 64;
5750 LongAlign = LongLongAlign = 16;
5751 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005752 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005753 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005754 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005755 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005756 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005757 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005758 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005759 }
5760 void getTargetDefines(const LangOptions &Opts,
5761 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005762 Builder.defineMacro("MSP430");
5763 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005764 // FIXME: defines for different 'flavours' of MCU
5765 }
Craig Topper3164f332014-03-11 03:39:26 +00005766 void getTargetBuiltins(const Builtin::Info *&Records,
5767 unsigned &NumRecords) const override {
5768 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005769 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005770 NumRecords = 0;
5771 }
Craig Topper3164f332014-03-11 03:39:26 +00005772 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005773 return Feature == "msp430";
5774 }
Craig Topper3164f332014-03-11 03:39:26 +00005775 void getGCCRegNames(const char * const *&Names,
5776 unsigned &NumNames) const override;
5777 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5778 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005779 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005780 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005781 NumAliases = 0;
5782 }
Eric Christopher917e9522014-11-18 22:36:15 +00005783 bool
5784 validateAsmConstraint(const char *&Name,
5785 TargetInfo::ConstraintInfo &info) const override {
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005786 // FIXME: implement
5787 switch (*Name) {
5788 case 'K': // the constant 1
5789 case 'L': // constant -1^20 .. 1^19
5790 case 'M': // constant 1-4:
5791 return true;
5792 }
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005793 // No target constraints for now.
5794 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005795 }
Craig Topper3164f332014-03-11 03:39:26 +00005796 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005797 // FIXME: Is this really right?
5798 return "";
5799 }
Craig Topper3164f332014-03-11 03:39:26 +00005800 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005801 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005802 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005803 }
5804 };
5805
5806 const char * const MSP430TargetInfo::GCCRegNames[] = {
5807 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5808 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5809 };
5810
5811 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5812 unsigned &NumNames) const {
5813 Names = GCCRegNames;
5814 NumNames = llvm::array_lengthof(GCCRegNames);
5815 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00005816
Mike Stump11289f42009-09-09 15:08:12 +00005817 // LLVM and Clang cannot be used directly to output native binaries for
5818 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005819 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005820 //
5821 // TCE uses the llvm bitcode as input and uses it for generating customized
5822 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005823 // publicly available in http://tce.cs.tut.fi
5824
Eli Friedman1f191002011-10-07 19:51:42 +00005825 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5826 3, // opencl_global
5827 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005828 5, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00005829 // FIXME: generic has to be added to the target
5830 0, // opencl_generic
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005831 0, // cuda_device
5832 0, // cuda_constant
5833 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005834 };
5835
Eli Friedmana9c3d712009-08-19 20:47:07 +00005836 class TCETargetInfo : public TargetInfo{
5837 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005838 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005839 TLSSupported = false;
5840 IntWidth = 32;
5841 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005842 PointerWidth = 32;
5843 IntAlign = 32;
5844 LongAlign = LongLongAlign = 32;
5845 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005846 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005847 SizeType = UnsignedInt;
5848 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005849 IntPtrType = SignedInt;
5850 PtrDiffType = SignedInt;
5851 FloatWidth = 32;
5852 FloatAlign = 32;
5853 DoubleWidth = 32;
5854 DoubleAlign = 32;
5855 LongDoubleWidth = 32;
5856 LongDoubleAlign = 32;
5857 FloatFormat = &llvm::APFloat::IEEEsingle;
5858 DoubleFormat = &llvm::APFloat::IEEEsingle;
5859 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005860 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5861 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005862 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005863 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005864 }
5865
Craig Topper3164f332014-03-11 03:39:26 +00005866 void getTargetDefines(const LangOptions &Opts,
5867 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005868 DefineStd(Builder, "tce", Opts);
5869 Builder.defineMacro("__TCE__");
5870 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005871 }
Craig Topper3164f332014-03-11 03:39:26 +00005872 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005873 return Feature == "tce";
5874 }
Craig Topper3164f332014-03-11 03:39:26 +00005875
5876 void getTargetBuiltins(const Builtin::Info *&Records,
5877 unsigned &NumRecords) const override {}
5878 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005879 return "";
5880 }
Craig Topper3164f332014-03-11 03:39:26 +00005881 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005882 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005883 }
Craig Topper3164f332014-03-11 03:39:26 +00005884 void getGCCRegNames(const char * const *&Names,
5885 unsigned &NumNames) const override {}
5886 bool validateAsmConstraint(const char *&Name,
5887 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005888 return true;
5889 }
Craig Topper3164f332014-03-11 03:39:26 +00005890 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5891 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005892 };
Eli Friedmana9c3d712009-08-19 20:47:07 +00005893
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005894class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005895 virtual void setDescriptionString() = 0;
5896
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005897 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005898 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005899 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005900 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005901 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005902 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005903 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005904 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005905 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005906 enum DspRevEnum {
5907 NoDSP, DSP1, DSP2
5908 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005909 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005910
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005911protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005912 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005913 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005914
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005915public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005916 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5917 const std::string &CPUStr)
5918 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005919 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00005920 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5921 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5922 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005923
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005924 bool isNaN2008Default() const {
5925 return CPU == "mips32r6" || CPU == "mips64r6";
5926 }
5927
5928 bool isFP64Default() const {
5929 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5930 }
5931
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00005932 bool isNan2008() const override {
5933 return IsNan2008;
5934 }
5935
Alp Toker4925ba72014-06-07 23:30:42 +00005936 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005937 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005938 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5939 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005940 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005941 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005942 .Case("mips1", IsMips32)
5943 .Case("mips2", IsMips32)
5944 .Case("mips3", true)
5945 .Case("mips4", true)
5946 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005947 .Case("mips32", IsMips32)
5948 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005949 .Case("mips32r3", IsMips32)
5950 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005951 .Case("mips32r6", IsMips32)
5952 .Case("mips64", true)
5953 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00005954 .Case("mips64r3", true)
5955 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005956 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005957 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005958 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005959 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005960 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005961 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005962 if (CPU == "octeon")
5963 Features["mips64r2"] = Features["cnmips"] = true;
5964 else
5965 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005966 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005967
Craig Topper3164f332014-03-11 03:39:26 +00005968 void getTargetDefines(const LangOptions &Opts,
5969 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005970 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005971 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005972 if (Opts.GNUMode)
5973 Builder.defineMacro("mips");
5974
Simon Atanasyan683535b2012-08-29 19:14:58 +00005975 Builder.defineMacro("__REGISTER_PREFIX__", "");
5976
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005977 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005978 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005979 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005980 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005981 case SoftFloat:
5982 Builder.defineMacro("__mips_soft_float", Twine(1));
5983 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005984 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005985
Simon Atanasyan16071912013-04-14 14:07:30 +00005986 if (IsSingleFloat)
5987 Builder.defineMacro("__mips_single_float", Twine(1));
5988
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005989 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5990 Builder.defineMacro("_MIPS_FPSET",
5991 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5992
Simon Atanasyan72244b62012-07-05 16:06:06 +00005993 if (IsMips16)
5994 Builder.defineMacro("__mips16", Twine(1));
5995
Simon Atanasyan60777612013-04-14 14:07:51 +00005996 if (IsMicromips)
5997 Builder.defineMacro("__mips_micromips", Twine(1));
5998
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005999 if (IsNan2008)
6000 Builder.defineMacro("__mips_nan2008", Twine(1));
6001
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006002 switch (DspRev) {
6003 default:
6004 break;
6005 case DSP1:
6006 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6007 Builder.defineMacro("__mips_dsp", Twine(1));
6008 break;
6009 case DSP2:
6010 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6011 Builder.defineMacro("__mips_dspr2", Twine(1));
6012 Builder.defineMacro("__mips_dsp", Twine(1));
6013 break;
6014 }
6015
Jack Carter44ff1e52013-08-12 17:20:29 +00006016 if (HasMSA)
6017 Builder.defineMacro("__mips_msa", Twine(1));
6018
Simon Atanasyan26f19672012-04-05 19:28:31 +00006019 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6020 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6021 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006022
6023 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6024 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006025 }
6026
Craig Topper3164f332014-03-11 03:39:26 +00006027 void getTargetBuiltins(const Builtin::Info *&Records,
6028 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006029 Records = BuiltinInfo;
6030 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006031 }
Craig Topper3164f332014-03-11 03:39:26 +00006032 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006033 return llvm::StringSwitch<bool>(Feature)
6034 .Case("mips", true)
6035 .Case("fp64", HasFP64)
6036 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006037 }
Craig Topper3164f332014-03-11 03:39:26 +00006038 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006039 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006040 }
Craig Topper3164f332014-03-11 03:39:26 +00006041 void getGCCRegNames(const char * const *&Names,
6042 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006043 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006044 // CPU register names
6045 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006046 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6047 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6048 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006049 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6050 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006051 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6052 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6053 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6054 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006055 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006056 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006057 "$fcc5","$fcc6","$fcc7",
6058 // MSA register names
6059 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6060 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6061 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6062 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6063 // MSA control register names
6064 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6065 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006066 };
6067 Names = GCCRegNames;
6068 NumNames = llvm::array_lengthof(GCCRegNames);
6069 }
Craig Topper3164f332014-03-11 03:39:26 +00006070 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6071 unsigned &NumAliases) const override = 0;
6072 bool validateAsmConstraint(const char *&Name,
6073 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006074 switch (*Name) {
6075 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006076 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006077 case 'r': // CPU registers.
6078 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006079 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006080 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006081 case 'c': // $25 for indirect jumps
6082 case 'l': // lo register
6083 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006084 Info.setAllowsRegister();
6085 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006086 case 'I': // Signed 16-bit constant
6087 case 'J': // Integer 0
6088 case 'K': // Unsigned 16-bit constant
6089 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6090 case 'M': // Constants not loadable via lui, addiu, or ori
6091 case 'N': // Constant -1 to -65535
6092 case 'O': // A signed 15-bit constant
6093 case 'P': // A constant between 1 go 65535
6094 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006095 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006096 Info.setAllowsMemory();
6097 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006098 case 'Z':
6099 if (Name[1] == 'C') { // An address usable by ll, and sc.
6100 Info.setAllowsMemory();
6101 Name++; // Skip over 'Z'.
6102 return true;
6103 }
6104 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006105 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006106 }
6107
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006108 std::string convertConstraint(const char *&Constraint) const override {
6109 std::string R;
6110 switch (*Constraint) {
6111 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6112 if (Constraint[1] == 'C') {
6113 R = std::string("^") + std::string(Constraint, 2);
6114 Constraint++;
6115 return R;
6116 }
6117 break;
6118 }
6119 return TargetInfo::convertConstraint(Constraint);
6120 }
6121
Craig Topper3164f332014-03-11 03:39:26 +00006122 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006123 // In GCC, $1 is not widely used in generated code (it's used only in a few
6124 // specific situations), so there is no real need for users to add it to
6125 // the clobbers list if they want to use it in their inline assembly code.
6126 //
6127 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6128 // code generation, so using it in inline assembly without adding it to the
6129 // clobbers list can cause conflicts between the inline assembly code and
6130 // the surrounding generated code.
6131 //
6132 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6133 // operands, which will conflict with the ".set at" assembler option (which
6134 // we use only for inline assembly, in order to maintain compatibility with
6135 // GCC) and will also conflict with the user's usage of $1.
6136 //
6137 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6138 // register for generated code is to automatically clobber $1 for all inline
6139 // assembly code.
6140 //
6141 // FIXME: We should automatically clobber $1 only for inline assembly code
6142 // which actually uses it. This would allow LLVM to use $1 for inline
6143 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006144 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006145 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006146
Craig Topper3164f332014-03-11 03:39:26 +00006147 bool handleTargetFeatures(std::vector<std::string> &Features,
6148 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006149 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006150 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006151 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006152 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006153 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006154 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006155 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006156
6157 for (std::vector<std::string>::iterator it = Features.begin(),
6158 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006159 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006160 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006161 else if (*it == "+soft-float")
6162 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006163 else if (*it == "+mips16")
6164 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00006165 else if (*it == "+micromips")
6166 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006167 else if (*it == "+dsp")
6168 DspRev = std::max(DspRev, DSP1);
6169 else if (*it == "+dspr2")
6170 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00006171 else if (*it == "+msa")
6172 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006173 else if (*it == "+fp64")
6174 HasFP64 = true;
6175 else if (*it == "-fp64")
6176 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006177 else if (*it == "+nan2008")
6178 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006179 else if (*it == "-nan2008")
6180 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006181 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006182
Akira Hatanaka9064e362013-10-29 18:30:33 +00006183 setDescriptionString();
6184
Rafael Espindolaeb265472013-08-21 21:59:03 +00006185 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006186 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006187
Craig Topper3164f332014-03-11 03:39:26 +00006188 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006189 if (RegNo == 0) return 4;
6190 if (RegNo == 1) return 5;
6191 return -1;
6192 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006193
6194 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006195};
6196
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006197const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
6198#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6199#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6200 ALL_LANGUAGES },
6201#include "clang/Basic/BuiltinsMips.def"
6202};
6203
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006204class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006205public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006206 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006207 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006208 SizeType = UnsignedInt;
6209 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006210 Int64Type = SignedLongLong;
6211 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006212 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006213 }
Craig Topper3164f332014-03-11 03:39:26 +00006214 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006215 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006216 ABI = Name;
6217 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006218 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006219 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006220 }
Craig Topper3164f332014-03-11 03:39:26 +00006221 void getTargetDefines(const LangOptions &Opts,
6222 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006223 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006224
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006225 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006226 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6227
6228 const std::string& CPUStr = getCPU();
6229 if (CPUStr == "mips32")
6230 Builder.defineMacro("__mips_isa_rev", "1");
6231 else if (CPUStr == "mips32r2")
6232 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006233 else if (CPUStr == "mips32r3")
6234 Builder.defineMacro("__mips_isa_rev", "3");
6235 else if (CPUStr == "mips32r5")
6236 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006237 else if (CPUStr == "mips32r6")
6238 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006239
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006240 if (ABI == "o32") {
6241 Builder.defineMacro("__mips_o32");
6242 Builder.defineMacro("_ABIO32", "1");
6243 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6244 }
6245 else if (ABI == "eabi")
6246 Builder.defineMacro("__mips_eabi");
6247 else
David Blaikie83d382b2011-09-23 05:06:16 +00006248 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006249 }
Craig Topper3164f332014-03-11 03:39:26 +00006250 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6251 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006252 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6253 { { "at" }, "$1" },
6254 { { "v0" }, "$2" },
6255 { { "v1" }, "$3" },
6256 { { "a0" }, "$4" },
6257 { { "a1" }, "$5" },
6258 { { "a2" }, "$6" },
6259 { { "a3" }, "$7" },
6260 { { "t0" }, "$8" },
6261 { { "t1" }, "$9" },
6262 { { "t2" }, "$10" },
6263 { { "t3" }, "$11" },
6264 { { "t4" }, "$12" },
6265 { { "t5" }, "$13" },
6266 { { "t6" }, "$14" },
6267 { { "t7" }, "$15" },
6268 { { "s0" }, "$16" },
6269 { { "s1" }, "$17" },
6270 { { "s2" }, "$18" },
6271 { { "s3" }, "$19" },
6272 { { "s4" }, "$20" },
6273 { { "s5" }, "$21" },
6274 { { "s6" }, "$22" },
6275 { { "s7" }, "$23" },
6276 { { "t8" }, "$24" },
6277 { { "t9" }, "$25" },
6278 { { "k0" }, "$26" },
6279 { { "k1" }, "$27" },
6280 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006281 { { "sp","$sp" }, "$29" },
6282 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006283 { { "ra" }, "$31" }
6284 };
6285 Aliases = GCCRegAliases;
6286 NumAliases = llvm::array_lengthof(GCCRegAliases);
6287 }
6288};
6289
6290class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006291 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006292 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006293 }
6294
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006295public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006296 Mips32EBTargetInfo(const llvm::Triple &Triple)
6297 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006298 }
Craig Topper3164f332014-03-11 03:39:26 +00006299 void getTargetDefines(const LangOptions &Opts,
6300 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006301 DefineStd(Builder, "MIPSEB", Opts);
6302 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006303 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006304 }
6305};
6306
6307class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006308 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00006309 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006310 }
6311
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006312public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006313 Mips32ELTargetInfo(const llvm::Triple &Triple)
6314 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006315 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006316 }
Craig Topper3164f332014-03-11 03:39:26 +00006317 void getTargetDefines(const LangOptions &Opts,
6318 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006319 DefineStd(Builder, "MIPSEL", Opts);
6320 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006321 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006322 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006323};
Akira Hatanakabef17452011-09-20 19:21:49 +00006324
6325class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006326public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006327 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006328 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006329 LongDoubleWidth = LongDoubleAlign = 128;
6330 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006331 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6332 LongDoubleWidth = LongDoubleAlign = 64;
6333 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6334 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006335 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006336 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006337 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006338 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006339
6340 void setN64ABITypes() {
6341 LongWidth = LongAlign = 64;
6342 PointerWidth = PointerAlign = 64;
6343 SizeType = UnsignedLong;
6344 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006345 Int64Type = SignedLong;
6346 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006347 }
6348
6349 void setN32ABITypes() {
6350 LongWidth = LongAlign = 32;
6351 PointerWidth = PointerAlign = 32;
6352 SizeType = UnsignedInt;
6353 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006354 Int64Type = SignedLongLong;
6355 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006356 }
6357
Craig Topper3164f332014-03-11 03:39:26 +00006358 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006359 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006360 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006361 ABI = Name;
6362 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006363 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006364 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006365 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006366 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006367 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006368 }
6369 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006370 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006371
Craig Topper3164f332014-03-11 03:39:26 +00006372 void getTargetDefines(const LangOptions &Opts,
6373 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006374 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006375
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006376 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006377 Builder.defineMacro("__mips64");
6378 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006379 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6380
6381 const std::string& CPUStr = getCPU();
6382 if (CPUStr == "mips64")
6383 Builder.defineMacro("__mips_isa_rev", "1");
6384 else if (CPUStr == "mips64r2")
6385 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006386 else if (CPUStr == "mips64r3")
6387 Builder.defineMacro("__mips_isa_rev", "3");
6388 else if (CPUStr == "mips64r5")
6389 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006390 else if (CPUStr == "mips64r6")
6391 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006392
Akira Hatanakabef17452011-09-20 19:21:49 +00006393 if (ABI == "n32") {
6394 Builder.defineMacro("__mips_n32");
6395 Builder.defineMacro("_ABIN32", "2");
6396 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6397 }
6398 else if (ABI == "n64") {
6399 Builder.defineMacro("__mips_n64");
6400 Builder.defineMacro("_ABI64", "3");
6401 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6402 }
6403 else
David Blaikie83d382b2011-09-23 05:06:16 +00006404 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00006405 }
Craig Topper3164f332014-03-11 03:39:26 +00006406 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6407 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006408 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6409 { { "at" }, "$1" },
6410 { { "v0" }, "$2" },
6411 { { "v1" }, "$3" },
6412 { { "a0" }, "$4" },
6413 { { "a1" }, "$5" },
6414 { { "a2" }, "$6" },
6415 { { "a3" }, "$7" },
6416 { { "a4" }, "$8" },
6417 { { "a5" }, "$9" },
6418 { { "a6" }, "$10" },
6419 { { "a7" }, "$11" },
6420 { { "t0" }, "$12" },
6421 { { "t1" }, "$13" },
6422 { { "t2" }, "$14" },
6423 { { "t3" }, "$15" },
6424 { { "s0" }, "$16" },
6425 { { "s1" }, "$17" },
6426 { { "s2" }, "$18" },
6427 { { "s3" }, "$19" },
6428 { { "s4" }, "$20" },
6429 { { "s5" }, "$21" },
6430 { { "s6" }, "$22" },
6431 { { "s7" }, "$23" },
6432 { { "t8" }, "$24" },
6433 { { "t9" }, "$25" },
6434 { { "k0" }, "$26" },
6435 { { "k1" }, "$27" },
6436 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006437 { { "sp","$sp" }, "$29" },
6438 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00006439 { { "ra" }, "$31" }
6440 };
6441 Aliases = GCCRegAliases;
6442 NumAliases = llvm::array_lengthof(GCCRegAliases);
6443 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00006444
6445 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00006446};
6447
6448class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006449 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006450 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006451 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006452 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006453 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006454
Akira Hatanakabef17452011-09-20 19:21:49 +00006455 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00006456
Akira Hatanakabef17452011-09-20 19:21:49 +00006457public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006458 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00006459 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00006460 void getTargetDefines(const LangOptions &Opts,
6461 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006462 DefineStd(Builder, "MIPSEB", Opts);
6463 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006464 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006465 }
6466};
6467
6468class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00006469 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00006470 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00006471 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006472 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00006473 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00006474 }
6475public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006476 Mips64ELTargetInfo(const llvm::Triple &Triple)
6477 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006478 // Default ABI is n64.
6479 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006480 }
Craig Topper3164f332014-03-11 03:39:26 +00006481 void getTargetDefines(const LangOptions &Opts,
6482 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006483 DefineStd(Builder, "MIPSEL", Opts);
6484 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006485 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006486 }
6487};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006488
Ivan Krasindd7403e2011-08-24 20:22:22 +00006489class PNaClTargetInfo : public TargetInfo {
6490public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006491 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006492 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006493 this->UserLabelPrefix = "";
6494 this->LongAlign = 32;
6495 this->LongWidth = 32;
6496 this->PointerAlign = 32;
6497 this->PointerWidth = 32;
6498 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006499 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006500 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006501 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006502 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006503 this->SizeType = TargetInfo::UnsignedInt;
6504 this->PtrDiffType = TargetInfo::SignedInt;
6505 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006506 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006507 }
6508
Craig Topper3164f332014-03-11 03:39:26 +00006509 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006510 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006511 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006512 Builder.defineMacro("__le32__");
6513 Builder.defineMacro("__pnacl__");
6514 }
Craig Topper3164f332014-03-11 03:39:26 +00006515 void getTargetDefines(const LangOptions &Opts,
6516 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006517 getArchDefines(Opts, Builder);
6518 }
Craig Topper3164f332014-03-11 03:39:26 +00006519 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006520 return Feature == "pnacl";
6521 }
Craig Topper3164f332014-03-11 03:39:26 +00006522 void getTargetBuiltins(const Builtin::Info *&Records,
6523 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006524 }
Craig Topper3164f332014-03-11 03:39:26 +00006525 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006526 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006527 }
Craig Topper3164f332014-03-11 03:39:26 +00006528 void getGCCRegNames(const char * const *&Names,
6529 unsigned &NumNames) const override;
6530 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6531 unsigned &NumAliases) const override;
6532 bool validateAsmConstraint(const char *&Name,
6533 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006534 return false;
6535 }
6536
Craig Topper3164f332014-03-11 03:39:26 +00006537 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006538 return "";
6539 }
6540};
6541
6542void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6543 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006544 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006545 NumNames = 0;
6546}
6547
6548void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6549 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006550 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006551 NumAliases = 0;
6552}
Ivan Krasindd7403e2011-08-24 20:22:22 +00006553
JF Bastien643817d2014-09-12 17:52:47 +00006554class Le64TargetInfo : public TargetInfo {
6555 static const Builtin::Info BuiltinInfo[];
6556
6557public:
6558 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6559 BigEndian = false;
6560 NoAsmVariants = true;
6561 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6562 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6563 DescriptionString =
JF Bastien1e6e41b2014-12-02 19:19:59 +00006564 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00006565 }
6566
6567 void getTargetDefines(const LangOptions &Opts,
6568 MacroBuilder &Builder) const override {
6569 DefineStd(Builder, "unix", Opts);
6570 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6571 Builder.defineMacro("__ELF__");
6572 }
6573 void getTargetBuiltins(const Builtin::Info *&Records,
6574 unsigned &NumRecords) const override {
6575 Records = BuiltinInfo;
6576 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6577 }
6578 BuiltinVaListKind getBuiltinVaListKind() const override {
6579 return TargetInfo::PNaClABIBuiltinVaList;
6580 }
6581 const char *getClobbers() const override { return ""; }
6582 void getGCCRegNames(const char *const *&Names,
6583 unsigned &NumNames) const override {
6584 Names = nullptr;
6585 NumNames = 0;
6586 }
6587 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6588 unsigned &NumAliases) const override {
6589 Aliases = nullptr;
6590 NumAliases = 0;
6591 }
6592 bool validateAsmConstraint(const char *&Name,
6593 TargetInfo::ConstraintInfo &Info) const override {
6594 return false;
6595 }
6596
6597 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006598};
6599} // end anonymous namespace.
6600
6601const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6602#define BUILTIN(ID, TYPE, ATTRS) \
6603 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6604#include "clang/Basic/BuiltinsLe64.def"
6605};
6606
6607namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006608 static const unsigned SPIRAddrSpaceMap[] = {
6609 1, // opencl_global
6610 3, // opencl_local
6611 2, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00006612 4, // opencl_generic
Guy Benyeib798fc92012-12-11 21:38:14 +00006613 0, // cuda_device
6614 0, // cuda_constant
6615 0 // cuda_shared
6616 };
6617 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006618 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006619 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006620 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6621 "SPIR target must use unknown OS");
6622 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6623 "SPIR target must use unknown environment type");
6624 BigEndian = false;
6625 TLSSupported = false;
6626 LongWidth = LongAlign = 64;
6627 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006628 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006629 // Define available target features
6630 // These must be defined in sorted order!
6631 NoAsmVariants = true;
6632 }
Craig Topper3164f332014-03-11 03:39:26 +00006633 void getTargetDefines(const LangOptions &Opts,
6634 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006635 DefineStd(Builder, "SPIR", Opts);
6636 }
Craig Topper3164f332014-03-11 03:39:26 +00006637 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006638 return Feature == "spir";
6639 }
Craig Topper3164f332014-03-11 03:39:26 +00006640
6641 void getTargetBuiltins(const Builtin::Info *&Records,
6642 unsigned &NumRecords) const override {}
6643 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006644 return "";
6645 }
Craig Topper3164f332014-03-11 03:39:26 +00006646 void getGCCRegNames(const char * const *&Names,
6647 unsigned &NumNames) const override {}
Eric Christopher917e9522014-11-18 22:36:15 +00006648 bool
6649 validateAsmConstraint(const char *&Name,
6650 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006651 return true;
6652 }
Craig Topper3164f332014-03-11 03:39:26 +00006653 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6654 unsigned &NumAliases) const override {}
6655 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006656 return TargetInfo::VoidPtrBuiltinVaList;
6657 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00006658
6659 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6660 return (CC == CC_SpirFunction ||
6661 CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning;
6662 }
6663
6664 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
6665 return CC_SpirFunction;
6666 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006667 };
6668
6669
6670 class SPIR32TargetInfo : public SPIRTargetInfo {
6671 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006672 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006673 PointerWidth = PointerAlign = 32;
6674 SizeType = TargetInfo::UnsignedInt;
6675 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6676 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006677 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6678 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006679 }
Craig Topper3164f332014-03-11 03:39:26 +00006680 void getTargetDefines(const LangOptions &Opts,
6681 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006682 DefineStd(Builder, "SPIR32", Opts);
6683 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006684 };
6685
6686 class SPIR64TargetInfo : public SPIRTargetInfo {
6687 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006688 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006689 PointerWidth = PointerAlign = 64;
6690 SizeType = TargetInfo::UnsignedLong;
6691 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006692 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6693 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006694 }
Craig Topper3164f332014-03-11 03:39:26 +00006695 void getTargetDefines(const LangOptions &Opts,
6696 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006697 DefineStd(Builder, "SPIR64", Opts);
6698 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006699 };
Guy Benyeib798fc92012-12-11 21:38:14 +00006700
Robert Lytton0e076492013-08-13 09:43:10 +00006701class XCoreTargetInfo : public TargetInfo {
6702 static const Builtin::Info BuiltinInfo[];
6703public:
6704 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6705 BigEndian = false;
6706 NoAsmVariants = true;
6707 LongLongAlign = 32;
6708 SuitableAlign = 32;
6709 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006710 SizeType = UnsignedInt;
6711 PtrDiffType = SignedInt;
6712 IntPtrType = SignedInt;
6713 WCharType = UnsignedChar;
6714 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006715 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006716 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
Rafael Espindola26c67b72013-12-17 14:34:42 +00006717 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006718 }
Craig Topper3164f332014-03-11 03:39:26 +00006719 void getTargetDefines(const LangOptions &Opts,
6720 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006721 Builder.defineMacro("__XS1B__");
6722 }
Craig Topper3164f332014-03-11 03:39:26 +00006723 void getTargetBuiltins(const Builtin::Info *&Records,
6724 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006725 Records = BuiltinInfo;
6726 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6727 }
Craig Topper3164f332014-03-11 03:39:26 +00006728 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006729 return TargetInfo::VoidPtrBuiltinVaList;
6730 }
Craig Topper3164f332014-03-11 03:39:26 +00006731 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006732 return "";
6733 }
Craig Topper3164f332014-03-11 03:39:26 +00006734 void getGCCRegNames(const char * const *&Names,
6735 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006736 static const char * const GCCRegNames[] = {
6737 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6738 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6739 };
6740 Names = GCCRegNames;
6741 NumNames = llvm::array_lengthof(GCCRegNames);
6742 }
Craig Topper3164f332014-03-11 03:39:26 +00006743 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6744 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006745 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006746 NumAliases = 0;
6747 }
Craig Topper3164f332014-03-11 03:39:26 +00006748 bool validateAsmConstraint(const char *&Name,
6749 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006750 return false;
6751 }
Craig Topper3164f332014-03-11 03:39:26 +00006752 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006753 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6754 return (RegNo < 2)? RegNo : -1;
6755 }
Robert Lytton0e076492013-08-13 09:43:10 +00006756};
6757
6758const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6759#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6760#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6761 ALL_LANGUAGES },
6762#include "clang/Basic/BuiltinsXCore.def"
6763};
6764} // end anonymous namespace.
6765
Tamas Berghammer6373cee2015-03-25 10:38:50 +00006766namespace {
6767// x86_32 Android target
6768class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
6769public:
6770 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
6771 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
6772 SuitableAlign = 32;
6773 LongDoubleWidth = 64;
6774 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6775 }
6776};
6777} // end anonymous namespace
6778
6779namespace {
6780// x86_64 Android target
6781class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
6782public:
6783 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
6784 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
6785 LongDoubleFormat = &llvm::APFloat::IEEEquad;
6786 }
6787};
6788} // end anonymous namespace
6789
Ivan Krasindd7403e2011-08-24 20:22:22 +00006790
Chris Lattner5ba61f02006-10-14 07:39:34 +00006791//===----------------------------------------------------------------------===//
6792// Driver code
6793//===----------------------------------------------------------------------===//
6794
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006795static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006796 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006797
Daniel Dunbar52322032009-08-18 05:47:58 +00006798 switch (Triple.getArch()) {
6799 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006800 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006801
Tim Northover2a0783d2014-05-30 14:14:07 +00006802 case llvm::Triple::xcore:
6803 return new XCoreTargetInfo(Triple);
6804
6805 case llvm::Triple::hexagon:
6806 return new HexagonTargetInfo(Triple);
6807
6808 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006809 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006810 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006811
6812 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006813 case llvm::Triple::FreeBSD:
6814 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006815 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006816 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006817 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006818 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006819 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006820 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006821 }
6822
Christian Pirker9b019ae2014-02-25 13:51:00 +00006823 case llvm::Triple::aarch64_be:
6824 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00006825 case llvm::Triple::FreeBSD:
6826 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006827 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006828 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006829 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006830 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006831 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006832 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006833 }
6834
Daniel Dunbar52322032009-08-18 05:47:58 +00006835 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006836 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006837 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006838 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006839
Daniel Dunbar52322032009-08-18 05:47:58 +00006840 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006841 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006842 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006843 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006844 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006845 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006846 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006847 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006848 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006849 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006850 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006851 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006852 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006853 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006854 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006855 case llvm::Triple::Win32:
6856 switch (Triple.getEnvironment()) {
6857 default:
6858 return new ARMleTargetInfo(Triple);
6859 case llvm::Triple::Itanium:
6860 return new ItaniumWindowsARMleTargetInfo(Triple);
6861 case llvm::Triple::MSVC:
6862 return new MicrosoftARMleTargetInfo(Triple);
6863 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006864 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006865 return new ARMleTargetInfo(Triple);
6866 }
6867
6868 case llvm::Triple::armeb:
6869 case llvm::Triple::thumbeb:
6870 if (Triple.isOSDarwin())
6871 return new DarwinARMTargetInfo(Triple);
6872
6873 switch (os) {
6874 case llvm::Triple::Linux:
6875 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6876 case llvm::Triple::FreeBSD:
6877 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6878 case llvm::Triple::NetBSD:
6879 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6880 case llvm::Triple::OpenBSD:
6881 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6882 case llvm::Triple::Bitrig:
6883 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6884 case llvm::Triple::RTEMS:
6885 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6886 case llvm::Triple::NaCl:
6887 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6888 default:
6889 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006890 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006891
Daniel Dunbar52322032009-08-18 05:47:58 +00006892 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006893 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006894
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006895 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006896 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006897 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006898 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006899 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006900 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006901 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006902 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006903 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006904 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006905 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006906 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006907 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006908
6909 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006910 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006911 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006912 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006913 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006914 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006915 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006916 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006917 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006918 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006919 case llvm::Triple::NaCl:
6920 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006921 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006922 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006923 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006924
Akira Hatanakabef17452011-09-20 19:21:49 +00006925 case llvm::Triple::mips64:
6926 switch (os) {
6927 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006928 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006929 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006930 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006931 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006932 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006933 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006934 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006935 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006936 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006937 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006938 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006939 }
6940
6941 case llvm::Triple::mips64el:
6942 switch (os) {
6943 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006944 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006945 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006946 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006947 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006948 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006949 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006950 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006951 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006952 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006953 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006954 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006955 }
6956
Ivan Krasindd7403e2011-08-24 20:22:22 +00006957 case llvm::Triple::le32:
6958 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00006959 case llvm::Triple::NaCl:
6960 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
6961 default:
6962 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006963 }
6964
JF Bastien643817d2014-09-12 17:52:47 +00006965 case llvm::Triple::le64:
6966 return new Le64TargetInfo(Triple);
6967
Daniel Dunbar52322032009-08-18 05:47:58 +00006968 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006969 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006970 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006971 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006972 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006973 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006974 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006975 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006976 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006977 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006978 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006979 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006980 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006981 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006982 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006983 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006984 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006985
6986 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006987 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006988 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006989 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006990 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006991 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006992 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006993 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006994 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006995 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006996 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006997 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006998 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006999 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007000 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007001
Bill Schmidt778d3872013-07-26 01:36:11 +00007002 case llvm::Triple::ppc64le:
7003 switch (os) {
7004 case llvm::Triple::Linux:
7005 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007006 case llvm::Triple::NetBSD:
7007 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007008 default:
7009 return new PPC64TargetInfo(Triple);
7010 }
7011
Peter Collingbournec947aae2012-05-20 23:28:41 +00007012 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007013 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007014 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007015 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007016
Tom Stellardd8e38a32015-01-06 20:34:47 +00007017 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007018 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007019 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007020
Daniel Dunbar52322032009-08-18 05:47:58 +00007021 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007022 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007023 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007024 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007025 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007026 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007027 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007028 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007029 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007030 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007031 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007032 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007033 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007034 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007035 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007036
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007037 // The 'sparcel' architecture copies all the above cases except for Solaris.
7038 case llvm::Triple::sparcel:
7039 switch (os) {
7040 case llvm::Triple::Linux:
7041 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7042 case llvm::Triple::NetBSD:
7043 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7044 case llvm::Triple::OpenBSD:
7045 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7046 case llvm::Triple::RTEMS:
7047 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7048 default:
7049 return new SparcV8elTargetInfo(Triple);
7050 }
7051
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007052 case llvm::Triple::sparcv9:
7053 switch (os) {
7054 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007055 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007056 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007057 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007058 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007059 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007060 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007061 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007062 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007063 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007064 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007065 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007066 }
7067
Ulrich Weigand47445072013-05-06 16:26:41 +00007068 case llvm::Triple::systemz:
7069 switch (os) {
7070 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007071 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007072 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007073 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007074 }
7075
Eli Friedmana9c3d712009-08-19 20:47:07 +00007076 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007077 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007078
Daniel Dunbar52322032009-08-18 05:47:58 +00007079 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007080 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007081 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007082
Daniel Dunbar52322032009-08-18 05:47:58 +00007083 switch (os) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007084 case llvm::Triple::Linux: {
7085 switch (Triple.getEnvironment()) {
7086 default:
7087 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7088 case llvm::Triple::Android:
7089 return new AndroidX86_32TargetInfo(Triple);
7090 }
7091 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007092 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007093 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007094 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007095 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007096 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007097 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007098 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007099 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007100 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007101 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007102 case llvm::Triple::KFreeBSD:
7103 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007104 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007105 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007106 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007107 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007108 case llvm::Triple::Win32: {
7109 switch (Triple.getEnvironment()) {
7110 default:
7111 return new X86_32TargetInfo(Triple);
7112 case llvm::Triple::Cygnus:
7113 return new CygwinX86_32TargetInfo(Triple);
7114 case llvm::Triple::GNU:
7115 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007116 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007117 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007118 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007119 }
7120 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007121 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007122 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007123 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007124 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007125 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007126 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007127 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007128 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007129 }
7130
7131 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007132 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007133 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007134
Daniel Dunbar52322032009-08-18 05:47:58 +00007135 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007136 case llvm::Triple::CloudABI:
7137 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007138 case llvm::Triple::Linux: {
7139 switch (Triple.getEnvironment()) {
7140 default:
7141 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7142 case llvm::Triple::Android:
7143 return new AndroidX86_64TargetInfo(Triple);
7144 }
7145 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007146 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007147 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007148 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007149 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007150 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007151 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007152 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007153 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007154 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007155 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007156 case llvm::Triple::KFreeBSD:
7157 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007158 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007159 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007160 case llvm::Triple::Win32: {
7161 switch (Triple.getEnvironment()) {
7162 default:
7163 return new X86_64TargetInfo(Triple);
7164 case llvm::Triple::GNU:
7165 return new MinGWX86_64TargetInfo(Triple);
7166 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007167 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007168 }
7169 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007170 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007171 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007172 case llvm::Triple::PS4:
7173 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007174 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007175 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007176 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007177
Douglas Katzman78d7c542015-05-12 21:18:10 +00007178 case llvm::Triple::spir: {
7179 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7180 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7181 return nullptr;
7182 return new SPIR32TargetInfo(Triple);
7183 }
7184 case llvm::Triple::spir64: {
7185 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7186 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7187 return nullptr;
7188 return new SPIR64TargetInfo(Triple);
7189 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007190 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007191}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007192
7193/// CreateTargetInfo - Return the target info object for the specified target
7194/// triple.
Alp Toker80758082014-07-06 05:26:44 +00007195TargetInfo *
7196TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7197 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007198 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007199
7200 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007201 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007202 if (!Target) {
7203 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007204 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007205 }
Alp Toker80758082014-07-06 05:26:44 +00007206 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007207
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007208 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007209 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7210 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007211 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007212 }
7213
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007214 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007215 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7216 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007217 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007218 }
7219
Rafael Espindolaeb265472013-08-21 21:59:03 +00007220 // Set the fp math unit.
7221 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7222 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007223 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007224 }
7225
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007226 // Compute the default target features, we need the target to handle this
7227 // because features may have dependencies on one another.
7228 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00007229 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007230
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007231 // Apply the user specified deltas.
7232 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
7233 I < N; ++I) {
7234 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00007235 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00007236 bool Enabled = Name[0] == '+';
7237 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007238 }
7239
7240 // Add the features to the compile options.
7241 //
7242 // FIXME: If we are completely confident that we have the right set, we only
7243 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007244 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007245 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
7246 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00007247 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00007248 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007249 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007250
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007251 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007252}